private void ResolveType2(RKResults res, IFunctionExecuter fe, out List <double> divT, out List <double> divZ, out List <double> divZ2, out List <ResPointViewType2> list) { var dz1 = new double[res.Count - 1]; for (int i = 1; i < res.Count; i++) { dz1[i - 1] = (res[i].Y[0] - res[i - 1].Y[0]) / (res[i].X - res[i - 1].X); } var dz2 = new double[res.Count - 2]; for (int i = 1; i < dz1.Length; i++) { dz2[i - 1] = (dz1[i] - dz1[i - 1]) / (res[i].X - res[i - 1].X); } var lambda = new int[res.Count - 2]; var valInPoint = new List <double>(); for (int i = 0; i < res.Count - 2; i++) { valInPoint.Clear(); for (int j = 0; j < fe.SetCount; j++) { valInPoint.Add(Math.Abs(dz2[i] - fe.FunctionSet(res[i].X, res[i].Y, j))); } lambda[i] = valInPoint.IndexOf(valInPoint.Min()) + 1; } //int g = 0; int mn = lambda[0]; divZ = new List <double>(); // res[0].Y[0]; divT = new List <double>(); // res[0].X; divZ2 = new List <double>(); var checkedSet = new List <int>(); for (int i = 1; i < lambda.Length; i++) { if (lambda[i] != mn && (checkedSet.Count == 0 || !checkedSet.Contains(lambda[i]))) { divT.Add((res[i].X + res[i - 1].X) / 2f); divZ.Add((res[i].Y[0] + res[i - 1].Y[0]) / 2f); divZ2.Add((res[i].Y[1] + res[i - 1].Y[1]) / 2f); checkedSet.Add(mn); mn = lambda[i]; } } //fill DataSouce list = new List <ResPointViewType2>(); for (int i = 0; i < lambda.Length; i++) { list.Add(new ResPointViewType2(res[i].X, res[i].Y[0], res[i].Y[1], lambda[i], -1)); } }
public void SendSolvingResultType2(RKResults res, IFunctionExecuter fe) { List <double> divZ; List <double> divZ2; List <double> divT; List <ResPointViewType2> list; ResolveType2(res, fe, out divT, out divZ, out divZ2, out list); ShowResultType2(divT, divZ, list, res.MinimumZ2(), res.MaximumZ2()); }
public void DrawResult(RKResults res, string curve) { if (mainForm.InvokeRequired) { mainForm.BeginInvoke(new Action <RKResults, string>(DrawResult), res, curve); } else { mainForm.DrawResult(res, curve); } }
public void SendSolvingResultType1(RKResults res, IFunctionExecuter fe) { var dz = new double[res.Count - 1]; for (int i = 1; i < res.Count; i++) { dz[i - 1] = (res[i].Y[0] - res[i - 1].Y[0]) / (res[i].X - res[i - 1].X); } var lambda = new int[res.Count - 1]; //v[0] = t <= 0 ? -1 : 1 var valInPoint = new List <double>(); for (int i = 0; i < res.Count - 1; i++) { valInPoint.Clear(); for (int j = 0; j < fe.SetCount; j++) { valInPoint.Add(Math.Abs(dz[i] - fe.FunctionSet(res[i].X, res[i].Y, j))); } lambda[i] = valInPoint.IndexOf(valInPoint.Min()) + 1; } //int g = 0; int mn = lambda[0]; var divZ = new List <double>(); // res[0].Y[0]; var divT = new List <double>(); // res[0].X; var checkedSet = new List <int>(); for (int i = 1; i < lambda.Length; i++) { if (lambda[i] != mn && (checkedSet.Count == 0 || !checkedSet.Contains(lambda[i]))) { divT.Add((res[i].X + res[i - 1].X) / 2f); divZ.Add((res[i].Y[0] + res[i - 1].Y[0]) / 2f); checkedSet.Add(mn); mn = lambda[i]; continue; } } //fill DataSouce var list = new List <ResPointViewType1>(); for (int i = 0; i < lambda.Length; i++) { list.Add(new ResPointViewType1(res[i].X, res[i].Y[0], lambda[i], -1)); } ShowResultType1(divT, divZ, list, res[0].X, res[res.Count - 1].X); }
private Dictionary <double, int> GetTT(RKResults res, int[] itab) { Dictionary <double, int> tt = new Dictionary <double, int>(); if (this.setCount == 1) { for (int i = 0; i < res.Count - 1; i++) { tt.Add(res[i].X, itab[i] - 1); } } else { for (int i = 0; i < res.Count - 2; i++) { tt.Add(res[i].X, itab[i] - 1); } } return(tt); }
public RAlgSolver(TaskWorker tw, RKResults res, List<List<double>> startParameters, Vector startP, int method) : this(tw, res, startParameters) { this.startP = startP; if (this.startP.Count == 1) { calcFunct += CalcFunct1; } else { if (method == 0) { calcFunct += CalcFunct2; } else { calcFunct += CalcFunct2_1; } } }
private RAlgSolver(TaskWorker tw, RKResults res, List<List<double>> startParameters) { this.tw = tw; this.res = res; itab = new int[res.Count - 1]; if (res[0].Y.Count == 2) { var dz1 = new double[res.Count - 1]; for (int i = 1; i < res.Count; i++) { dz1[i - 1] = (res[i].Y[0] - res[i - 1].Y[0]) / (res[i].X - res[i - 1].X); } var dz2 = new double[res.Count - 2]; for (int i = 1; i < dz1.Length; i++) { dz2[i - 1] = (dz1[i] - dz1[i - 1]) / (res[i].X - res[i - 1].X); } dz = dz2; } var list = new List<TaskParameter>(); int k = 0; for (int i = 0; i < startParameters.Count; i++) { var tp1 = new TaskParameter(startParameters[i].Count); for (int j = 0; j < startParameters[i].Count; j++) { x[k] = startParameters[i][j]; tp1.Param[j] = x[k]; k++; } list.Add(tp1); } c = k; tp = new TaskParameters(list, double.MinValue); }
private void rk_OnSolvingDoneType2(RKResults res, string c, IFunctionExecuter fe) { view.SendSolvingResultType2(res, fe); }
private double GetDiff(RKResults r1, RKResults r2) { double s = 0; int n = r1[0].Y.Count; for (int i = 0; i < r1.Count - n; i++) { double ss = 0; for (int j = 0; j < n; j++) { ss += Math.Pow(r1[i].Y[j] - r2[i].Y[j], 2); } s += Math.Pow(ss, 0.5); } return s/(r2.Count - n); }
private Dictionary<double, int> GetTT(RKResults res, int[] itab) { Dictionary<double, int> tt = new Dictionary<double, int>(); if (this.setCount == 1) { for (int i = 0; i < res.Count - 1; i++) { tt.Add(res[i].X, itab[i] - 1); } } else { for (int i = 0; i < res.Count - 2; i++) { tt.Add(res[i].X, itab[i] - 1); } } return tt; }
private object view_ViewAction(ViewEventType type, ViewEventArgs args) { switch (type) { case ViewEventType.Exit: { alive = false; break; } case ViewEventType.StartSolving1: { string fname = args.Parameters[0].ToString(); string curveName = args.Parameters[1].ToString(); var fe = new FunctionExecuter(typeof(Functions), fname); var r = new Random(); double y0 = z1min + r.NextDouble() * (z1max - z1min); var rk = new RKVectorForm(fe, curveName, t0, t1, new Vector(1, y0)); rk.OnResultGenerated += rk_OnResultGenerated; rk.SolveWithConstH(rkN, RKMetodType.RK4_1); break; } case ViewEventType.StartSolving2: { string fname = args.Parameters[0].ToString(); var curveNames = args.Parameters[1] as string[, ]; var fe = new FunctionExecuter(typeof(Functions), fname); double h1 = (z1max - z1min) / (randN); double h2 = (z2max - z2min) / (randN); var results = new Dictionary <string, RKResults>(); for (int i = 0; i < randN; i++) { for (int j = 0; j < randN; j++) { double z00 = z1min + i * h1; double z01 = z2min + j * h2; var rk = new RKVectorForm(fe, curveNames[i, j], t0, t1, new Vector(2, z00, z01)); rk.OnSolvingDone += rk_OnSolvingDone; RKResults res = rk.SolveWithConstH(rkN, RKMetodType.RK4_1); results.Add(curveNames[i, j], res); } } break; } case ViewEventType.SolvePodhod2Type1: { string fname = args.Parameters[0].ToString(); string curveName = args.Parameters[1].ToString(); var fe = new FunctionExecuter(typeof(Functions), fname); var rk = new RKVectorForm(fe, curveName, t0, t1, new Vector(1, y0)); rk.OnResultGenerated += rk_OnResultGenerated; rk.OnSolvingDone += rk_OnSolvingDoneType1; rk.SolveWithConstH(rkN, RKMetodType.RK4_1); break; } case ViewEventType.SolovePodhod2Type2: { string fname = args.Parameters[0].ToString(); string curveName = args.Parameters[1].ToString(); var fe = new FunctionExecuter(typeof(Functions), fname); var rk = new RKVectorForm(fe, curveName, t0, t1, new Vector(2, y00, y01)); rk.OnResultGenerated += rk_OnResGenForType2; rk.OnSolvingDone += rk_OnSolvingDoneType2; rk.SolveWithConstH(rkN, RKMetodType.RK4_1); break; } case ViewEventType.SolovePodhod2Type2Mass: { string fname = args.Parameters[0].ToString(); var curveNames = args.Parameters[1] as string[, ]; var fe = new FunctionExecuter(typeof(Functions), fname); double h1 = (z1max - z1min) / (randN); double h2 = (z2max - z2min) / (randN); var results = new Dictionary <string, RKResults>(); for (int i = 0; i < randN; i++) { for (int j = 0; j < randN; j++) { double z00 = z1min + i * h1; double z01 = z2min + j * h2; var rk = new RKVectorForm(fe, curveNames[i, j], t0, t1, new Vector(2, z00, z01)); //rk.OnResultGenerated += new RKResultGeneratedDelegate(rk_OnResGenForType2); //rk.OnSolvingDone += new RKSolvingDoneDelegate(rk_OnSolvingDoneType2); RKResults res = rk.SolveWithConstH(rkN, RKMetodType.RK4_1); results.Add(curveNames[i, j], res); } } view.SendSolvingResultType2Mass(results, fe); break; } case ViewEventType.UpdateParams: { t0 = (double)args.Parameters[0]; t1 = (double)args.Parameters[1]; y0 = (double)args.Parameters[2]; y00 = (double)args.Parameters[3]; y01 = (double)args.Parameters[4]; rkN = Convert.ToInt32(args.Parameters[5]); randN = Convert.ToInt32(args.Parameters[6]); z1min = (double)args.Parameters[7]; z1max = (double)args.Parameters[8]; z2min = (double)args.Parameters[9]; z2max = (double)args.Parameters[10]; break; } } return(null); }
private void rk_OnSolvingDone(RKResults res, string curve, IFunctionExecuter fe) { view.DrawResult(res, curve); }
public RAlgSolver(TaskWorker tw, RKResults res, List<List<double>> startParameters, double[] dz) : this(tw, res, startParameters) { this.dz = dz; }
private Vector RK4_1(double x, Vector y, double h, int j, TaskParameters taskP) { var res = new Vector(2); Vector f0, f1, f2, f3; f0 = h * ff(x, y, j, taskP); f1 = h * ff(x + h / 2, y + f0 / 2, j, taskP); f2 = h * ff(x + h / 2, y + f1 / 2, j, taskP); f3 = h * ff(x + h, y + f2, j, taskP); res = y + (f0 + 2 * f1 + 2 * f2 + f3) / 6; return res; }
private RKResults DrawRes(RKResults r, RAlgSolver ra, string cn, string cnsuff, Color c, OutputHelper output, int eb, out double functional) { if (!isReal) { for (int i = 0; i < r.Count - setCount; i++) { if (eb == 1) { if (setCount == 1) { (tblResList as List<ResPointViewType1>)[i + i*step].M1 = ra.itab[i]; } else { (tblResList as List<ResPointViewType2>)[i + i*step].M1 = ra.itab[i]; } } else { if (setCount == 1) { (tblResList as List<ResPointViewType1>)[i + i*step].M2 = ra.itab[i]; } else { (tblResList as List<ResPointViewType2>)[i + i*step].M2 = ra.itab[i]; } } } grcTabRes.RefreshDataSource(); } var sb = new StringBuilder(); Dictionary<double, int> tt = GetTT(r, ra.itab); //-- draw res --- if (!curves.ContainsKey(cn)) { curves.Add(cn, new PointPairList()); var curve = new LineItem(cn, curves[cn], c, SymbolType.None); curve.Line.Style = DashStyle.Dash; curve.Line.Width = 2; //this.zgcMainChart2.MasterPane[1].CurveList.Add(curve); if (setCount == 2) { curves.Add(cn + cnsuff, new PointPairList()); var curve1 = new LineItem(cn + cnsuff, curves[cn + cnsuff], c, SymbolType.None); curve.Line.Style = DashStyle.Dash; curve.Line.Width = 2; zgcMainChart2.MasterPane[0].CurveList.Add(curve1); zgcMainChart2.MasterPane[1].CurveList.Add(curve); } else { zgcMainChart2.MasterPane[0].CurveList.Add(curve); } } else { curves[cn].Clear(); if (setCount == 2) { curves[cn + cnsuff].Clear(); } } int k = 0; var listDraw = new List<TaskParameter>(); for (int i = 0; i < tps.Count; i++) { var tpDraw = new TaskParameter(tps[i].Param.Length); string line = string.Format("{0}) ", i); for (int j = 0; j < tps[0].Param.Length; j++) { tpDraw.Param[j] = ra.x[k]; line += string.Format("a{0}={1:f6} ", j, ra.x[k]); k++; } sb.AppendLine(line); listDraw.Add(tpDraw); } sb.AppendLine("-----"); var tps1 = new TaskParameters(listDraw, tt); var tw1 = new TaskWorker(tps1, funcDescr.GetType(), funcDescr.MainFuncName, funcDescr.SecFuncName, funcDescr); double t0, t1; if (!isReal) { t0 = double.Parse(txtT0.Text); t1 = double.Parse(txtT1.Text); } else { t0 = 0; t1 = ASignal.Count*0.01; } var rk1 = new RKVectorForm(tw1, cn, t0, t1, startVector); RKResults res1 = rk1.SolveWithConstH(res.Count - 1, RKMetodType.RK2_1); functional = GetDiff(res, res1); sb.Append(string.Format("f={0:f6}", functional)); //rtb.Text = sb.ToString(); //this.SetControlFeathe(rtb, "text=", sb.ToString()); output.WriteLine(sb.ToString()); int nn = setCount == 1 ? 1 : 2; for (int i = 0; i < res1.Count - nn; i++) { if (nn == 1) { curves[cn].Add(res1[i].X, res1[i].Y[0]); } else { curves[cn].Add(res1[i].Y[0], res1[i].Y[1]); curves[cn + cnsuff].Add(res1[i].X, res1[i].Y[0]); } } SetControlProperty(zgcMainChart2, "chart", null); //this.zgcMainChart2.AxisChange(); //this.zgcMainChart2.Refresh(); return res1; }
private void btnTransfer_Click(object sender, EventArgs e) { isReal = true; view.Output.ClearScreen(); grcTabRes.DataSource = null; n = int.Parse(txtN.Text); setCount = rbN1.Checked ? 1 : 2; double t = 0; var r = new RKResults(); foreach (double y in ASignal) { r.Add(new RKResult(t, new Vector(1, y))); t += 0.01; } res = r; randomStartParameters = GetRandomStartParam(); var gammaList = new List<double>(); for (int i = 0; i < dgvGama.ColumnCount; i++) { gammaList.Add(Convert.ToDouble(dgvGama.Rows[0].Cells[i].Value)); } var list = new List<TaskParameter>(); for (int i = 0; i < dgvParameters.RowCount; i++) { var tp = new TaskParameter(dgvParameters.ColumnCount); for (int j = 0; j < dgvParameters.ColumnCount; j++) { double val = Convert.ToDouble(dgvParameters.Rows[i].Cells[j].Value); tp.Param[j] = val; } list.Add(tp); } tps = new TaskParameters(list, gammaList); string mfName = setCount == 1 ? "MF1" : "MF2"; funcDescr = new Functions_2_2(mfName, fnames[(sfList.SelectedItem as string).ToUpper()]); startVector = new Vector(1, 0); tw = new TaskWorker(tps, funcDescr.GetType(), funcDescr.MainFuncName, funcDescr.SecFuncName, funcDescr); xtcMain.SelectedTabPageIndex = 2; }
private void btnSolveRK_Click(object sender, EventArgs e) { try { btnSolveRK.Enabled = false; isReal = false; view.Output.ClearScreen(); grcTabRes.DataSource = null; n = int.Parse(txtN.Text, enUsCulture); setCount = rbN1.Checked ? 1 : 2; //this.gamma = double.Parse(txtGamma.Text); if (setCount == 1) { view.ConfigGraphPane(zgcMainChart2, this, PaneLayout.SingleColumn, new List<ChartInfo> { new ChartInfo { Title = "(t,z1)", XAxisTitle = "t", YAxisTitle = "z1" }, }); } else { view.ConfigGraphPane(zgcMainChart2, this, PaneLayout.SingleColumn, new List<ChartInfo> { new ChartInfo { Title = "(t,z1)", XAxisTitle = "t", YAxisTitle = "z1" }, new ChartInfo { Title = "(z1,z2)", XAxisTitle = "z1", YAxisTitle = "z2" } }); } //ZedGraph.GraphPane gp = this.zgcMainChart2.GraphPane; //gp.CurveList.Clear(); curves.Clear(); if (setCount == 1) { curves.Add(curveName, new PointPairList()); zgcMainChart2.MasterPane[0].AddCurve(curveName, curves[curveName], Color.Black, SymbolType.None); } else { curves.Add(curveName, new PointPairList()); curves.Add(curveName + curveNameSuff, new PointPairList()); zgcMainChart2.MasterPane[0].AddCurve(curveName + curveNameSuff, curves[curveName + curveNameSuff], Color.Black, SymbolType.None); zgcMainChart2.MasterPane[1].AddCurve(curveName, curves[curveName], Color.Black, SymbolType.None); } var p = new List<double>(); var gammaList = new List<double>(); for (int i = 0; i < dgvGama.ColumnCount; i++) { double d = double.Parse(dgvGama.Rows[0].Cells[i].Value.ToString().Replace(',', '.'), enUsCulture); gammaList.Add(d); } var list = new List<TaskParameter>(); for (int i = 0; i < dgvParameters.RowCount; i++) { var tp = new TaskParameter(dgvParameters.ColumnCount); for (int j = 0; j < dgvParameters.ColumnCount; j++) { double val = double.Parse(dgvParameters.Rows[i].Cells[j].Value.ToString().Replace(',', '.'), enUsCulture); tp.Param[j] = val; } list.Add(tp); } tps = new TaskParameters(list, gammaList); string mfName = setCount == 1 ? "MF1" : "MF2"; funcDescr = new Functions_2_2(mfName, fnames[(sfList.SelectedItem as string).ToUpper()]); tw = new TaskWorker(tps, funcDescr.GetType(), funcDescr.MainFuncName, funcDescr.SecFuncName, funcDescr); startVector = setCount == 1 ? new Vector(1, double.Parse(txtY0.Text.Replace(',', '.'), enUsCulture)) : new Vector(2, double.Parse(txtY00.Text.Replace(',', '.'), enUsCulture), double.Parse(txtY01.Text.Replace(',', '.'), enUsCulture)); var rk = new RKVectorForm(tw, curveName, double.Parse(txtT0.Text.Replace(',', '.'), enUsCulture), double.Parse(txtT1.Text.Replace(',', '.'), enUsCulture), startVector); res = rk.SolveWithConstH(n, RKMetodType.RK4_1); if (rbN1.Checked) { for (int i = 0; i < res.Count - 1; i++) { curves[curveName].Add(res[i].X, res[i].Y[0]); } //res.ForEach(r => this.curves[curveName].Add(r.X, r.Y[0])); } else { for (int i = 0; i < res.Count - 2; i++) { curves[curveName + curveNameSuff].Add(res[i].X, res[i].Y[0]); curves[curveName].Add(res[i].Y[0], res[i].Y[1]); } //res.ForEach(r => this.curves[curveName].Add(r.Y[0], r.Y[1])); } zgcMainChart2.AxisChange(); zgcMainChart2.Refresh(); if (setCount == 1) { tblResList = new List<ResPointViewType1>(); for (int i = 0; i < res.Count - 1; i++) (tblResList as List<ResPointViewType1>).Add(new ResPointViewType1(res[i].X, res[i].Y[0], -1, -1)); grcTabRes.DataSource = null; grcTabRes.DataSource = tblResList; } else { tblResList = new List<ResPointViewType2>(); for (int i = 0; i < res.Count - 2; i++) (tblResList as List<ResPointViewType2>).Add(new ResPointViewType2(res[i].X, res[i].Y[0], res[i].Y[1], -1, -1)); grcTabRes.DataSource = null; grcTabRes.DataSource = tblResList; } grcTabRes.RefreshDataSource(); } finally { btnSolveRK.Enabled = true; } }
internal void DrawResult(RKResults res, string curve) { if (res[0].Y.Count == 1) { res.ForEach(r => curves[curve].Add(r.X, r.Y[0])); } else { res.ForEach(r => curves[curve].Add(r.X, r.Y[0])); res.ForEach(r => curves1[curve].Add(r.X, r.Y[1])); res.ForEach(r => curves2[curve].Add(r.Y[0], r.Y[1])); } zgc1.AxisChange(); zgc1.Refresh(); }
public void DrawResult(RKResults res, string curve) { if (mainForm.InvokeRequired) { mainForm.BeginInvoke(new Action<RKResults, string>(DrawResult), res, curve); } else { mainForm.DrawResult(res, curve); } }
public void SendSolvingResultType1(RKResults res, IFunctionExecuter fe) { var dz = new double[res.Count - 1]; for (int i = 1; i < res.Count; i++) { dz[i - 1] = (res[i].Y[0] - res[i - 1].Y[0])/(res[i].X - res[i - 1].X); } var lambda = new int[res.Count - 1]; //v[0] = t <= 0 ? -1 : 1 var valInPoint = new List<double>(); for (int i = 0; i < res.Count - 1; i++) { valInPoint.Clear(); for (int j = 0; j < fe.SetCount; j++) { valInPoint.Add(Math.Abs(dz[i] - fe.FunctionSet(res[i].X, res[i].Y, j))); } lambda[i] = valInPoint.IndexOf(valInPoint.Min()) + 1; } //int g = 0; int mn = lambda[0]; var divZ = new List<double>(); // res[0].Y[0]; var divT = new List<double>(); // res[0].X; var checkedSet = new List<int>(); for (int i = 1; i < lambda.Length; i++) { if (lambda[i] != mn && (checkedSet.Count == 0 || !checkedSet.Contains(lambda[i]))) { divT.Add((res[i].X + res[i - 1].X)/2f); divZ.Add((res[i].Y[0] + res[i - 1].Y[0])/2f); checkedSet.Add(mn); mn = lambda[i]; continue; } } //fill DataSouce var list = new List<ResPointViewType1>(); for (int i = 0; i < lambda.Length; i++) { list.Add(new ResPointViewType1(res[i].X, res[i].Y[0], lambda[i], -1)); } ShowResultType1(divT, divZ, list, res[0].X, res[res.Count - 1].X); }
public void SendSolvingResultType2(RKResults res, IFunctionExecuter fe) { List<double> divZ; List<double> divZ2; List<double> divT; List<ResPointViewType2> list; ResolveType2(res, fe, out divT, out divZ, out divZ2, out list); ShowResultType2(divT, divZ, list, res.MinimumZ2(), res.MaximumZ2()); }
private void btnSolveRK_Click(object sender, EventArgs e) { this.rtbResult1.Text = this.rtbResult2.Text = string.Empty; this.dgvTabRes.DataSource = null; this.n = int.Parse(this.txtN.Text); this.setCount = this.rbN1.Checked ? 1 : 2; //this.gamma = double.Parse(txtGamma.Text); ZedGraph.GraphPane gp = this.zgcMainChart2.GraphPane; gp.CurveList.Clear(); this.curves.Clear(); this.curves.Add(this.curveName, new PointPairList()); gp.AddCurve(this.curveName, this.curves[curveName], Color.Black, SymbolType.None); List<double> gammaList = new List<double>(); List<double> p = new List<double>(); for (int i = 0; i < dgvGama.ColumnCount; i++) { gammaList.Add(Convert.ToDouble(dgvGama.Rows[0].Cells[i].Value)); } List<TaskParameter> list = new List<TaskParameter>(); for (int i = 0; i < dgvParameters.RowCount; i++) { TaskParameter tp = new TaskParameter(dgvParameters.ColumnCount); for (int j = 0; j < dgvParameters.ColumnCount; j++) { double val = Convert.ToDouble(dgvParameters.Rows[i].Cells[j].Value); tp.Param[j] = val; } list.Add(tp); } this.tps = new TaskParameters(list, gammaList); string mfName = this.setCount == 1 ? "MF1" : "MF2"; this.funcDescr = new Functions_2_2(mfName, this.fnames[(sfList.SelectedItem as string).ToUpper()]); this.tw = new TaskWorker(tps, funcDescr.GetType(), funcDescr.MainFuncName, funcDescr.SecFuncName, funcDescr); this.startVector = this.setCount == 1 ? new Vector(1, double.Parse(this.txtY0.Text)) : new Vector(2, double.Parse(this.txtY00.Text), double.Parse(this.txtY01.Text)); RKVectorForm rk = new RKVectorForm(tw, curveName, double.Parse(this.txtT0.Text), double.Parse(this.txtT1.Text), startVector); this.res = rk.SolveWithConstH(n, RKMetodType.RK4_1); if (this.rbN1.Checked) { res.ForEach(r => this.curves[curveName].Add(r.X, r.Y[0])); } else { res.ForEach(r => this.curves[curveName].Add(r.Y[0], r.Y[1])); } this.zgcMainChart2.AxisChange(); this.zgcMainChart2.Refresh(); if (this.setCount == 1) { this.tblResList = new List<ResPointViewType1>(); for (int i = 0; i < res.Count - 1; i++) (this.tblResList as List<ResPointViewType1>).Add(new ResPointViewType1(res[i].X, res[i].Y[0], -1, -1)); this.dgvTabRes.DataSource = null; this.dgvTabRes.DataSource = tblResList; } else { this.tblResList = new List<ResPointViewType2>(); for (int i = 0; i < res.Count - 2; i++) (this.tblResList as List<ResPointViewType2>).Add(new ResPointViewType2(res[i].X, res[i].Y[0], res[i].Y[1], -1, -1)); this.dgvTabRes.DataSource = null; this.dgvTabRes.DataSource = tblResList; } this.dgvTabRes.RefreshDataSource(); this.randomStartParameters = this.GetRandomStartParam(); }
private void ResolveType2(RKResults res, IFunctionExecuter fe, out List<double> divT, out List<double> divZ, out List<double> divZ2, out List<ResPointViewType2> list) { var dz1 = new double[res.Count - 1]; for (int i = 1; i < res.Count; i++) { dz1[i - 1] = (res[i].Y[0] - res[i - 1].Y[0])/(res[i].X - res[i - 1].X); } var dz2 = new double[res.Count - 2]; for (int i = 1; i < dz1.Length; i++) { dz2[i - 1] = (dz1[i] - dz1[i - 1])/(res[i].X - res[i - 1].X); } var lambda = new int[res.Count - 2]; var valInPoint = new List<double>(); for (int i = 0; i < res.Count - 2; i++) { valInPoint.Clear(); for (int j = 0; j < fe.SetCount; j++) { valInPoint.Add(Math.Abs(dz2[i] - fe.FunctionSet(res[i].X, res[i].Y, j))); } lambda[i] = valInPoint.IndexOf(valInPoint.Min()) + 1; } //int g = 0; int mn = lambda[0]; divZ = new List<double>(); // res[0].Y[0]; divT = new List<double>(); // res[0].X; divZ2 = new List<double>(); var checkedSet = new List<int>(); for (int i = 1; i < lambda.Length; i++) { if (lambda[i] != mn && (checkedSet.Count == 0 || !checkedSet.Contains(lambda[i]))) { divT.Add((res[i].X + res[i - 1].X)/2f); divZ.Add((res[i].Y[0] + res[i - 1].Y[0])/2f); divZ2.Add((res[i].Y[1] + res[i - 1].Y[1])/2f); checkedSet.Add(mn); mn = lambda[i]; } } //fill DataSouce list = new List<ResPointViewType2>(); for (int i = 0; i < lambda.Length; i++) { list.Add(new ResPointViewType2(res[i].X, res[i].Y[0], res[i].Y[1], lambda[i], -1)); } }
private void btnSolveRK_Click(object sender, EventArgs e) { this.rtbResult1.Text = this.rtbResult2.Text = string.Empty; this.dgvTabRes.DataSource = null; this.n = int.Parse(this.txtN.Text); this.setCount = this.rbN1.Checked ? 1 : 2; //this.gamma = double.Parse(txtGamma.Text); ZedGraph.GraphPane gp = this.zgcMainChart2.GraphPane; gp.CurveList.Clear(); this.curves.Clear(); this.curves.Add(this.curveName, new PointPairList()); gp.AddCurve(this.curveName, this.curves[curveName], Color.Black, SymbolType.None); List <double> gammaList = new List <double>(); List <double> p = new List <double>(); for (int i = 0; i < dgvGama.ColumnCount; i++) { gammaList.Add(Convert.ToDouble(dgvGama.Rows[0].Cells[i].Value)); } List <TaskParameter> list = new List <TaskParameter>(); for (int i = 0; i < dgvParameters.RowCount; i++) { TaskParameter tp = new TaskParameter(dgvParameters.ColumnCount); for (int j = 0; j < dgvParameters.ColumnCount; j++) { double val = Convert.ToDouble(dgvParameters.Rows[i].Cells[j].Value); tp.Param[j] = val; } list.Add(tp); } this.tps = new TaskParameters(list, gammaList); string mfName = this.setCount == 1 ? "MF1" : "MF2"; this.funcDescr = new Functions_2_2(mfName, this.fnames[(sfList.SelectedItem as string).ToUpper()]); this.tw = new TaskWorker(tps, funcDescr.GetType(), funcDescr.MainFuncName, funcDescr.SecFuncName, funcDescr); this.startVector = this.setCount == 1 ? new Vector(1, double.Parse(this.txtY0.Text)) : new Vector(2, double.Parse(this.txtY00.Text), double.Parse(this.txtY01.Text)); RKVectorForm rk = new RKVectorForm(tw, curveName, double.Parse(this.txtT0.Text), double.Parse(this.txtT1.Text), startVector); this.res = rk.SolveWithConstH(n, RKMetodType.RK4_1); if (this.rbN1.Checked) { res.ForEach(r => this.curves[curveName].Add(r.X, r.Y[0])); } else { res.ForEach(r => this.curves[curveName].Add(r.Y[0], r.Y[1])); } this.zgcMainChart2.AxisChange(); this.zgcMainChart2.Refresh(); if (this.setCount == 1) { this.tblResList = new List <ResPointViewType1>(); for (int i = 0; i < res.Count - 1; i++) { (this.tblResList as List <ResPointViewType1>).Add(new ResPointViewType1(res[i].X, res[i].Y[0], -1, -1)); } this.dgvTabRes.DataSource = null; this.dgvTabRes.DataSource = tblResList; } else { this.tblResList = new List <ResPointViewType2>(); for (int i = 0; i < res.Count - 2; i++) { (this.tblResList as List <ResPointViewType2>).Add(new ResPointViewType2(res[i].X, res[i].Y[0], res[i].Y[1], -1, -1)); } this.dgvTabRes.DataSource = null; this.dgvTabRes.DataSource = tblResList; } this.dgvTabRes.RefreshDataSource(); this.randomStartParameters = this.GetRandomStartParam(); }
private void btnSolveRAlg2_Click(object sender, EventArgs e) { try { this.btnSolveRAlg2.Enabled = false; int tick = Environment.TickCount; this.inf2 = null; //List<List<double>> sp = this.GetRandomStartParam(); List <List <double> > sp = this.randomStartParameters; RAlgSolver ra = new RAlgSolver(this.tw, this.res, sp, this.startVector); ra.FUNCT = new RAlgSolver.FUNCTDelegate(ra.FUNCT4); ra.R_Algorithm(); for (int i = 0; i < res.Count - this.setCount; i++) { if (this.setCount == 1) { (this.tblResList as List <ResPointViewType1>)[i].M2 = ra.itab[i]; } else { (this.tblResList as List <ResPointViewType2>)[i].M2 = ra.itab[i]; } } this.dgvTabRes.RefreshDataSource(); Dictionary <double, int> tt = this.GetTT(this.res, ra.itab); StringBuilder sb = new StringBuilder(); //-- draw res --- if (!this.curves.ContainsKey(this.curveName2)) { this.curves.Add(this.curveName2, new PointPairList()); LineItem curve = new LineItem(this.curveName2, this.curves[curveName2], Color.Blue, SymbolType.None); curve.Line.Style = System.Drawing.Drawing2D.DashStyle.DashDot; curve.Line.Width = 2; this.zgcMainChart2.GraphPane.CurveList.Add(curve); } else { this.curves[this.curveName2].Clear(); } int k = 0; List <TaskParameter> listDraw = new List <TaskParameter>(); for (int i = 0; i < tps.Count; i++) { TaskParameter tpDraw = new TaskParameter(tps[i].Param.Length); string line = string.Format("{0}) ", i); for (int j = 0; j < tps[0].Param.Length; j++) { tpDraw.Param[j] = ra.x[k]; line += string.Format("a{0}={1:f6} ", j, ra.x[k]); k++; } sb.AppendLine(line); listDraw.Add(tpDraw); } sb.AppendLine("-----"); sb.Append(string.Format("f={0}", ra.f)); rtbResult2.Text = sb.ToString(); TaskParameters tps1 = new TaskParameters(listDraw, tt); TaskWorker tw1 = new TaskWorker(tps1, this.funcDescr.GetType(), this.funcDescr.MainFuncName, this.funcDescr.SecFuncName, this.funcDescr); RKVectorForm rk1 = new RKVectorForm(tw1, curveName2, double.Parse(this.txtT0.Text), double.Parse(this.txtT1.Text), this.startVector); RKResults res1 = rk1.SolveWithConstH(n, RKMetodType.RK2_1); //if (this.setCount == 1) //{ // res1.ForEach(r => this.curves[this.curveName2].Add(r.X, r.Y[0])); //} //else //{ // res1.ForEach(r => this.curves[this.curveName2].Add(r.Y[0], r.Y[1])); //} int nn = this.setCount == 1 ? 1 : 2; for (int i = 0; i < res1.Count - nn; i++) { if (nn == 1) { this.curves[curveName2].Add(res1[i].X, res1[i].Y[0]); } else { this.curves[curveName2].Add(res1[i].Y[0], res1[i].Y[1]); } } this.zgcMainChart2.AxisChange(); this.zgcMainChart2.Refresh(); this.ra2 = ra; double t = ((Environment.TickCount - tick) / (double)1000); this.rtbResult2.Text += string.Format("\r\n-----\r\ntime = {0} sec", t); this.inf2 = string.Format("Result: f = {0:f6} time = {1} sec", ra.f, t); } finally { this.btnSolveRAlg2.Enabled = true; } }
public RKResults SolveWithConstH(int N, RKMetodType type) { var res = new RKResults(); t.Clear(); z.Clear(); Func<double, Vector, double, Vector> RKfunc = null; switch (type) { case RKMetodType.RK4_1: RKfunc = RK4_1; break; case RKMetodType.RK4_2: RKfunc = RK4_2; break; case RKMetodType.RK3_1: RKfunc = RK3_1; break; case RKMetodType.RK3_2: RKfunc = RK3_2; break; case RKMetodType.RK2_1: RKfunc = RK2_1; break; case RKMetodType.RK2_2: RKfunc = RK2_2; break; } double h = (t1 - t0)/N; H = h; double x; Vector y; t.Add(t0); z.Add(Y0); var r = new RKResult(t0, Y0); res.Add(r); OnResultGeneratedCall(r); for (int i = 0; i < N; i++) { y = RKfunc(t[i], z[i], h); x = t0 + (i + 1)*h; t.Add(x); z.Add(y); r = new RKResult(x, y); res.Add(r); OnResultGeneratedCall(r); } if (OnSolvingDone != null) { OnSolvingDone(res, curveName, fe); } return res; }