func Test_bspline01(tst *testing.T) { //verbose() chk.PrintTitle("bspline01") var s1 Bspline T1 := []float64{0, 0, 0, 1, 1, 1} s1.Init(T1, 2) s1.SetControl([][]float64{{0, 0}, {0.5, 1}, {1, 0}}) var s2 Bspline T2 := []float64{0, 0, 0, 0.5, 1, 1, 1} s2.Init(T2, 2) s2.SetControl([][]float64{{0, 0}, {0.25, 0.5}, {0.75, 0.5}, {1, 0}}) if chk.Verbose { npts := 201 plt.SetForPng(1.5, 600, 150) plt.SplotGap(0.2, 0.4) str0 := ",lw=2" str1 := ",ls='none',marker='+',color='cyan',markevery=10" str2 := ",ls='none',marker='x',markevery=10" str3 := ",ls='none',marker='+',markevery=10" str4 := ",ls='none',marker='4',markevery=10" plt.Subplot(3, 2, 1) s1.Draw2d(str0, "", npts, 0) // 0 => CalcBasis s1.Draw2d(str1, "", npts, 1) // 1 => RecursiveBasis plt.Subplot(3, 2, 2) plt.SetAxis(0, 1, 0, 1) s2.Draw2d(str0, "", npts, 0) // 0 => CalcBasis s2.Draw2d(str1, "", npts, 1) // 1 => RecursiveBasis plt.Subplot(3, 2, 3) s1.PlotBasis("", npts, 0) // 0 => CalcBasis s1.PlotBasis(str2, npts, 1) // 1 => CalcBasisAndDerivs s1.PlotBasis(str3, npts, 2) // 2 => RecursiveBasis plt.Subplot(3, 2, 4) s2.PlotBasis("", npts, 0) // 0 => CalcBasis s2.PlotBasis(str2, npts, 1) // 1 => CalcBasisAndDerivs s2.PlotBasis(str3, npts, 2) // 2 => RecursiveBasis plt.Subplot(3, 2, 5) s1.PlotDerivs("", npts, 0) // 0 => CalcBasisAndDerivs s1.PlotDerivs(str4, npts, 1) // 1 => NumericalDeriv plt.Subplot(3, 2, 6) s2.PlotDerivs("", npts, 0) // 0 => CalcBasisAndDerivs s2.PlotDerivs(str4, npts, 1) // 1 => NumericalDeriv plt.SaveD("/tmp/gosl/gm", "bspline01.png") } }
// PlotFltFlt plots flt-flt contour // use iFlt==-1 || jFlt==-1 to plot all combinations func (o *Optimiser) PlotFltFltContour(sols0 []*Solution, iFlt, jFlt, iOva int, pp *PlotParams) { best, _ := GetBestFeasible(o, iOva) plotAll := iFlt < 0 || jFlt < 0 plotCommands := func(i, j int) { o.PlotContour(i, j, iOva, pp) if sols0 != nil { o.PlotAddFltFlt(i, j, sols0, &pp.FmtSols0) } o.PlotAddFltFlt(i, j, o.Solutions, &pp.FmtSols) if best != nil { plt.PlotOne(best.Flt[i], best.Flt[j], pp.FmtBest.GetArgs("")) } if pp.Extra != nil { pp.Extra() } if pp.AxEqual { plt.Equal() } } if plotAll { idx := 1 ncol := o.Nflt - 1 for row := 0; row < o.Nflt; row++ { idx += row for col := row + 1; col < o.Nflt; col++ { plt.Subplot(ncol, ncol, idx) plt.SplotGap(0.0, 0.0) plotCommands(col, row) if col > row+1 { plt.SetXnticks(0) plt.SetYnticks(0) } else { plt.Gll(io.Sf("$x_{%d}$", col), io.Sf("$x_{%d}$", row), "leg=0") } idx++ } } idx = ncol*(ncol-1) + 1 plt.Subplot(ncol, ncol, idx) plt.AxisOff() // TODO: fix formatting of open marker, add star to legend plt.DrawLegend([]plt.Fmt{pp.FmtSols0, pp.FmtSols, pp.FmtBest}, 8, "center", false, "") } else { plotCommands(iFlt, jFlt) if pp.Xlabel == "" { plt.Gll(io.Sf("$x_{%d}$", iFlt), io.Sf("$x_{%d}$", jFlt), pp.LegPrms) } else { plt.Gll(pp.Xlabel, pp.Ylabel, pp.LegPrms) } } plt.SaveD(pp.DirOut, pp.FnKey+pp.FnExt) }
// Plot runs the plot generation (basic set) func (o *Plotter) Plot(keys []string, res []*State, sts [][]float64, first, last bool) { // auxiliary variables nr := imax(len(res), len(sts)) if nr < 1 { return } x := make([]float64, nr) y := make([]float64, nr) o.P = make([]float64, nr) o.Q = make([]float64, nr) o.W = make([]float64, nr) o.Ev = make([]float64, nr) o.Ed = make([]float64, nr) // compute invariants for i := 0; i < len(res); i++ { if len(res[i].Sig) < 4 { chk.Panic("number of stress components is incorrect: %d", len(res[i].Sig)) } o.P[i], o.Q[i], o.W[i] = tsr.M_pqw(res[i].Sig) } nsig := len(res[0].Sig) devε := make([]float64, nsig) for i := 0; i < len(sts); i++ { if len(sts[i]) < 4 { chk.Panic("number of strain components is incorrect: %d", len(sts[i])) } _, o.Ev[i], o.Ed[i] = tsr.M_devε(devε, sts[i]) } // clear previous figure if first { plt.Clf() plt.SplotGap(0.35, 0.35) if o.Hspace > 0 { plt.SetHspace(o.Hspace) } if o.Vspace > 0 { plt.SetVspace(o.Vspace) } } // number of points for contour if o.NptsPq < 2 { o.NptsPq = 61 } if o.NptsOct < 2 { o.NptsOct = 41 } if o.NptsSig < 2 { o.NptsSig = 41 } // subplot variables o.Pidx = 1 o.Ncol, o.Nrow = utl.BestSquare(len(keys)) if len(keys) == 2 { o.Ncol, o.Nrow = 1, 2 } if len(keys) == 3 { o.Ncol, o.Nrow = 1, 3 } // do plot for _, key := range keys { o.Subplot() switch key { case "ed,q": o.QdivP = false o.Plot_ed_q(x, y, res, sts, last) case "ed,q/p": o.QdivP = true o.Plot_ed_q(x, y, res, sts, last) case "p,q": o.WithYs = false o.Plot_p_q(x, y, res, sts, last) case "p,q,ys": o.WithYs = true o.Plot_p_q(x, y, res, sts, last) case "ed,ev": o.Plot_ed_ev(x, y, res, sts, last) case "p,ev": o.LogP = false o.Plot_p_ev(x, y, res, sts, last) case "log(p),ev": o.LogP = true o.Plot_p_ev(x, y, res, sts, last) case "i,f": o.Plot_i_f(x, y, res, sts, last) case "i,alp": o.Plot_i_alp(x, y, res, sts, last) case "Dgam,f": o.Plot_Dgam_f(x, y, res, sts, last) case "oct": o.WithYs = false o.Plot_oct(x, y, res, sts, last) case "oct,ys": o.WithYs = true o.Plot_oct(x, y, res, sts, last) case "s3,s1": o.WithYs = false o.Plot_s3_s1(x, y, res, sts, last) case "s3,s1,ys": o.WithYs = true o.Plot_s3_s1(x, y, res, sts, last) case "empty": continue default: chk.Panic("cannot handle key=%q", key) } if o.Split && last { o.Save("_", key) } } // save figure if !o.Split && last { o.Save("", "") } }
func Test_bspline03(tst *testing.T) { //verbose() chk.PrintTitle("bspline03") // 0 1 2 3 4 5 6 7 8 9 10 T := []float64{0, 0, 0, 1, 2, 3, 4, 4, 5, 5, 5} var s Bspline s.Init(T, 2) s.SetControl([][]float64{{0, 0}, {0.5, 1}, {1, 0}, {1.5, 0}, {2, 1}, {2.5, 1}, {3, 0.5}, {3.5, 0}}) // analytical derivatives s.CalcBasisAndDerivs(3.99) io.Pfpink("ana: dNdt(t=3.99, i=5) = %v\n", s.GetDeriv(5)) io.Pfpink("ana: dNdt(t=3.99, i=6) = %v\n", s.GetDeriv(6)) io.Pfpink("ana: dNdt(t=3.99, i=7) = %v\n", s.GetDeriv(7)) s.CalcBasisAndDerivs(4.0) io.Pforan("ana: dNdt(t=4.00, i=5) = %v\n", s.GetDeriv(5)) io.Pforan("ana: dNdt(t=4.00, i=6) = %v\n", s.GetDeriv(6)) io.Pforan("ana: dNdt(t=4.00, i=7) = %v\n", s.GetDeriv(7)) // numerical derivatives io.Pfcyan("num: dNdt(t=3.99, i=5) = %v\n", s.NumericalDeriv(3.99, 5)) io.Pfcyan("num: dNdt(t=3.99, i=6) = %v\n", s.NumericalDeriv(3.99, 6)) io.Pfcyan("num: dNdt(t=3.99, i=7) = %v\n", s.NumericalDeriv(3.99, 7)) io.Pfblue2("num: dNdt(t=4.00, i=5) = %v\n", s.NumericalDeriv(4.00, 5)) io.Pfblue2("num: dNdt(t=4.00, i=6) = %v\n", s.NumericalDeriv(4.00, 6)) io.Pfblue2("num: dNdt(t=4.00, i=7) = %v\n", s.NumericalDeriv(4.00, 7)) ver := false tol := 1e-5 tt := utl.LinSpace(0, 5, 11) numd := make([]float64, s.NumBasis()) anad := make([]float64, s.NumBasis()) for _, t := range tt { for i := 0; i < s.NumBasis(); i++ { s.CalcBasisAndDerivs(t) anad[i] = s.GetDeriv(i) numd[i] = s.NumericalDeriv(t, i) // numerical fails @ 4 [4,5,6] if t == 4 { numd[4] = anad[4] numd[5] = anad[5] numd[6] = anad[6] } chk.PrintAnaNum(io.Sf("i=%d t=%v", i, t), tol, anad[i], numd[i], ver) } chk.Vector(tst, io.Sf("derivs @ %v", t), tol, numd, anad) } if chk.Verbose { npts := 201 plt.SetForPng(1.5, 600, 150) plt.SplotGap(0, 0.3) str0 := ",lw=2" str1 := ",ls='none',marker='+',color='cyan',markevery=10" str2 := ",ls='none',marker='x',markevery=10" str3 := ",ls='none',marker='+',markevery=10" str4 := ",ls='none',marker='4',markevery=10" plt.Subplot(3, 1, 1) s.Draw2d(str0, "", npts, 0) // 0 => CalcBasis s.Draw2d(str1, "", npts, 1) // 1 => RecursiveBasis plt.Subplot(3, 1, 2) s.PlotBasis("", npts, 0) // 0 => CalcBasis s.PlotBasis(str2, npts, 1) // 1 => CalcBasisAndDerivs s.PlotBasis(str3, npts, 2) // 2 => RecursiveBasis plt.Subplot(3, 1, 3) s.PlotDerivs("", npts, 0) // 0 => CalcBasisAndDerivs s.PlotDerivs(str4, npts, 1) // 1 => NumericalDeriv plt.SaveD("/tmp/gosl/gm", "bspline03.png") } }