예제 #1
0
 private void button2_Click(object sender, EventArgs e)
 {
     var ra = new RAlgSolver(2);
     ra.FUNCT = testFunction;
     ra.R_Algorithm();
     MessageBox.Show(string.Format("x1: {0:f3} x2: {1:f3}", ra.x[0], ra.x[1]));
 }
예제 #2
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;
            }
        }
예제 #3
0
        private void btnRalgirithmClick(object sender, EventArgs e)
        {
            var cs = new CancellationTokenSource();
            var t = new Task<RAlgSolver>(() =>
            {
                chart1.Series.Clear();
                GetValuesFromForm();
                _sensorsResults = GetValue(_lambda1, _ro1, _c1, _lambda2, _ro2, _c2, _tl, _t0, _tr, _l, _k, _nodesCount, _sensorsCount, true, true, chart1);

                var ra = new RAlgSolver();
                ra.FUNCT = RAlgFunction;
                ra.R_Algorithm();
                return ra;
            }, cs.Token);

            t.ContinueWith(task =>
            {
                richTextBox1.Text += string.Format("\tk={0:f3} lambda1={1:f3} lambda2={2:f3} f={3:f4}\r\n", task.Result.x[0], task.Result.x[1], task.Result.x[2], task.Result.f, chart1);

                //if (MessageBox.Show("Do you want to draw result?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    chart2.Series.Clear();
                    _sensorsResults = GetValue(task.Result.x[1], _ro1, _c1, task.Result.x[2], _ro2, _c2, _tl, _t0, _tr, _l, task.Result.x[0], _nodesCount, _sensorsCount, true, false, chart2);
                }

            }, cs.Token, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext());

            t.ContinueWith(task =>
            {
                MessageBox.Show(Resources.ErrorString);
            }, cs.Token, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.FromCurrentSynchronizationContext());

            t.Start(TaskScheduler.FromCurrentSynchronizationContext());
        }
예제 #4
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;
        }
예제 #5
0
        private void btnSolveRAlg3_Click(object sender, EventArgs e)
        {
            double alpha;
            if (double.TryParse(txtAlpha.Text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentUICulture, out alpha))
            {
                var th = new Thread(x =>
                                        {
                                            try
                                            {
                                                view.Output.WriteLine("SolveRalg3 started at " + DateTime.Now.ToString());

                                                if (randomStartParameters == null)
                                                {
                                                    GenerateStartParam();
                                                }

                                                double a = alpha;

                                                SetControlProperty(btnSolveRAlg3, "enabled", false);

                                                int tick = Environment.TickCount;
                                                inf3 = null;
                                                List<List<double>> sp = randomStartParameters;

                                                var ra = new RAlgSolver(tw, res, sp, startVector, 1);
                                                ra.FUNCT = ra.FUNCT4;
                                                ra.alpha = a;
                                                ra.R_Algorithm();

                                                double functional;
                                                DrawRes(res, ra, curveName3, curveNameSuff, Color.DeepPink, view.Output,
                                                        2, out functional);

                                                ra3 = ra;
                                                double t = ((Environment.TickCount - tick)/(double) 1000);
                                                view.Output.WriteLine(
                                                    string.Format("Result: f = {0:f6} time = {1} sec\r\n", functional, t));
                                                inf3 = string.Format("Result: f = {0:f6} time = {1} sec", functional, t);
                                            }
                                            catch (ApplicationException ae)
                                            {
                                                MessageBox.Show(ae.Message);
                                            }
                                            finally
                                            {
                                                SetControlProperty(btnSolveRAlg3, "enabled", true);
                                            }
                                        })
                             {
                                 Name = "MainForm.RAlgSolve3",
                                 IsBackground = true
                             };
                th.Start(alpha);
            }
            else
            {
                MessageBox.Show("Error while parsing alpha");
            }
        }
예제 #6
0
        private void btnSolveRAlg2_Click(object sender, EventArgs e)
        {
            var th = new Thread(x =>
                                    {
                                        try
                                        {
                                            if (randomStartParameters == null)
                                            {
                                                GenerateStartParam();
                                            }
                                            view.Output.WriteLine("SolveRalg2 started at " + DateTime.Now.ToString());
                                            SetControlProperty(btnSolveRAlg2, "enabled", false);
                                            int tick = Environment.TickCount;
                                            inf2 = null;
                                            //List<List<double>> sp = this.GetRandomStartParam();
                                            List<List<double>> sp = randomStartParameters;

                                            RKResults r = res.Trancate(step);

                                            var ra = new RAlgSolver(tw, r, sp, startVector, 0);
                                            ra.FUNCT = ra.FUNCT4;
                                            ra.R_Algorithm();
                                            double functional;
                                            DrawRes(r, ra, curveName2, curveNameSuff, Color.Blue, view.Output, 2,
                                                    out functional);
                                            ra2 = ra;
                                            double t = ((Environment.TickCount - tick)/(double) 1000);
                                            view.Output.WriteLine(string.Format(
                                                "Result: f = {0:f6} time = {1} sec\r\n", functional, t));
                                            inf2 = string.Format("Result: f = {0:f6} time = {1} sec", functional, t);
                                        }
                                        catch (ApplicationException ae)
                                        {
                                            MessageBox.Show(ae.Message);
                                        }
                                        finally
                                        {
                                            SetControlProperty(btnSolveRAlg2, "enabled", true);
                                        }
                                    })
                         {
                             Name = "MainForm.RAlgSolve2",
                             IsBackground = true
                         };
            th.Start();
        }
예제 #7
0
        private void btnSolveRAlg1_Click(object sender, EventArgs e)
        {
            var th = new Thread(x =>
                                    {
                                        try
                                        {
                                            if (randomStartParameters == null)
                                            {
                                                GenerateStartParam();
                                            }
                                            view.Output.WriteLine("SolveRalg1 started at " + DateTime.Now.ToString());
                                            SetControlProperty(btnSolveRAlg1, "enabled", false);
                                            int tick = Environment.TickCount;

                                            RKResults r = res.Trancate(step);

                                            var dz1 = new double[r.Count - 1];
                                            for (int i = 1; i < r.Count; i++)
                                            {
                                                dz1[i - 1] = (r[i].Y[0] - r[i - 1].Y[0])/(r[i].X - r[i - 1].X);
                                            }

                                            var dz2 = new double[r.Count - 2];
                                            if (setCount == 2)
                                            {
                                                for (int i = 1; i < dz1.Length; i++)
                                                {
                                                    dz2[i - 1] = (dz1[i] - dz1[i - 1])/(r[i].X - r[i - 1].X);
                                                }
                                            }

                                            List<List<double>> sp = randomStartParameters;

                                            RAlgSolver ra = setCount == 1
                                                                ? new RAlgSolver(tw, r, sp, dz1)
                                                                : new RAlgSolver(tw, r, sp, dz2);
                                            ra.FUNCT = ra.FUNCT3;
                                            ra.R_Algorithm();

                                            double functional;
                                            DrawRes(r, ra, curveName1, curveNameSuff, Color.Green, view.Output, 1,
                                                    out functional);

                                            ra1 = ra;

                                            double t = ((Environment.TickCount - tick)/(double) 1000);
                                            view.Output.WriteLine(string.Format(
                                                "Result: f = {0:f6} time = {1} sec\r\n", functional, t));
                                            inf1 = string.Format("Result: f = {0:f6} time = {1} sec", functional, t);
                                        }
                                        catch (ApplicationException ae)
                                        {
                                            MessageBox.Show(ae.Message);
                                        }
                                        finally
                                        {
                                            SetControlProperty(btnSolveRAlg1, "enabled", true);
                                            //this.btnSolveRAlg1.Enabled = true;
                                        }
                                    }
                )
                         {
                             Name = "RAlgSolve1",
                             IsBackground = true
                         };
            th.Start();
        }