예제 #1
0
        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));
            }
        }
예제 #2
0
        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());
        }
예제 #3
0
 public void DrawResult(RKResults res, string curve)
 {
     if (mainForm.InvokeRequired)
     {
         mainForm.BeginInvoke(new Action <RKResults, string>(DrawResult), res, curve);
     }
     else
     {
         mainForm.DrawResult(res, curve);
     }
 }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }
예제 #6
0
 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;
         }
     }
 }
예제 #7
0
        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);
        }
예제 #8
0
 private void rk_OnSolvingDoneType2(RKResults res, string c, IFunctionExecuter fe)
 {
     view.SendSolvingResultType2(res, fe);
 }
예제 #9
0
 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);
 }
예제 #10
0
 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;
 }
예제 #11
0
        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);
        }
예제 #12
0
 private void rk_OnSolvingDone(RKResults res, string curve, IFunctionExecuter fe)
 {
     view.DrawResult(res, curve);
 }
예제 #13
0
 public RAlgSolver(TaskWorker tw, RKResults res, List<List<double>> startParameters, double[] dz)
     : this(tw, res, startParameters)
 {
     this.dz = dz;
 }
예제 #14
0
        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;
        }
예제 #15
0
        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;
        }
예제 #16
0
        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;
        }
예제 #17
0
        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;
            }
        }
예제 #18
0
 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();
 }
예제 #19
0
 public void DrawResult(RKResults res, string curve)
 {
     if (mainForm.InvokeRequired)
     {
         mainForm.BeginInvoke(new Action<RKResults, string>(DrawResult), res, curve);
     }
     else
     {
         mainForm.DrawResult(res, curve);
     }
 }
예제 #20
0
        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);
        }
예제 #21
0
 private void rk_OnSolvingDoneType2(RKResults res, string c, IFunctionExecuter fe)
 {
     view.SendSolvingResultType2(res, fe);
 }
예제 #22
0
        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());
        }
예제 #23
0
        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();
        }
예제 #24
0
        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));
            }
        }
예제 #25
0
        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();
        }
예제 #26
0
 private void rk_OnSolvingDone(RKResults res, string curve, IFunctionExecuter fe)
 {
     view.DrawResult(res, curve);
 }
예제 #27
0
        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;
            }
        }
예제 #28
0
 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;
 }