Ejemplo n.º 1
0
        private void SolveNoControl(Koshi task, ref ResultData data)
        {
            int    step = 1;
            double x    = task.x0;
            double u    = task.u0;

            while ((step <= N) && (x - xborder < precision))
            {
                u = GetNext(task, x, u, h);
                double uHalfHalf = GetNext(task, x + h * 0.5, GetNext(task, x, u, h * 0.5), h * 0.5);
                double err       = Math.Abs(uHalfHalf - u) / 15.0;
                x += h;
                data.Insert(step, x, h, u, uHalfHalf, u - uHalfHalf, err, 0, 0);
                step++;
            }

            if (x - xborder > precision)
            {
                step--;
                int div = 0;
                while (x - xborder > precision)
                {
                    x -= h;
                    h *= 0.5;
                    div++;
                    x += h;
                }
                double u1 = GetNext(task, x - h, u, h);
                double u2 = GetNext(task, x - h * 0.5, GetNext(task, x, u, h * 0.5), h * 0.5);
                data.Insert(step, x, h, u1, u2, u1 - u2, Math.Abs(u1 - u2) / 15.0, div, 0);
            }
            data.Nstep = step;
        }
Ejemplo n.º 2
0
        /*public ResultData ProcessTask(Koshi task) {
         *  ResultData result = new ResultData(N+1);
         *  int step = 1;  // Number of step
         *  double x = task.x0;
         *  double u = Koshi.u0;
         *
         *  result.Insert(0, x, h, u, u, 0f, 0f, 0, 0);
         *
         *  if (control)
         *      while ((step <= N) && (x - xborder < precision)) {
         *          int div = 0;
         *          int db = 0;
         *          double uNext = GetNext(task, x, u, h);  // Vi+1
         *          double uNextSecond = GetNext(task, x + h * 0.5, GetNext(task, x, u, h * 0.5), h * 0.5);  // Vi+1'
         *          double err = Math.Abs(uNextSecond - uNext) / 15.0;
         *
         *          if (err > eps)
         *              while (err > eps) {
         *                  div++;
         *                  h /= 2;
         *                  uNext = GetNext(task, x, u, h);
         *                  uNextSecond = GetNext(task, x + h * 0.5, GetNext(task, x, u, h * 0.5), h * 0.5);
         *                  err = Math.Abs(uNextSecond - uNext) / 15.0;
         *              }
         *          if (err < eps / 32.0) db++;
         *
         *
         *          x += h;
         *          u = uNext;
         *          result.Insert(step, x, h, uNext, uNextSecond, uNext - uNextSecond, err, div, db);
         *          step++;
         *          if (db == 1) h *= 2;
         *      }
         *  else
         *      while ((step < N) && (x - xborder < precision))
         *      {
         *          double uNext = GetNext(task, x, u, h);  // Vi+1
         *          double uNextSecond = GetNext(task, x + h * 0.5, GetNext(task, x, u, h * 0.5), h * 0.5);  // Vi+1'
         *          double err = Math.Abs(uNextSecond - uNext) / 15.0;
         *          result.Insert(step, x, h, uNext, uNextSecond, uNext - uNextSecond, err, 0, 0);
         *          x += h;
         *          step++;
         *      }
         *
         *
         *  if (task.type == 0) result.fillTest(N);
         *
         *  return result;
         * }*/

        public ResultData ProcessTask(Koshi task)
        {
            ResultData result = new ResultData(N + 1);

            result.Insert(0, task.x0, h, task.u0, task.u0, 0f, 0f, 0, 0);

            if (task.type == 2)
            {
                if (control)
                {
                    SolveWithControl_syst(task, ref result);
                }
                else
                {
                    SolveNoControl_syst(task, ref result);
                }
                return(result);
            }

            if (control)
            {
                SolveWithControl(task, ref result);
            }
            else
            {
                SolveNoControl(task, ref result);
            }

            if (task.type == 0)
            {
                result.fillTest(N + 1, task);
            }

            return(result);
        }
Ejemplo n.º 3
0
 public void fillTest(int n, Koshi task)
 {
     for (int j = 0; j < n; j++)
     {
         ui[j]     = task.getTestValue(xi[j]);
         minus2[j] = Math.Abs(ui[j] - vi[j]);
     }
 }
Ejemplo n.º 4
0
        private void SolveWithControl(Koshi task, ref ResultData data)
        {
            int    step = 1;
            double x    = task.x0;
            double u    = task.u0;

            while ((step <= N) && (x - xborder < precision))
            {
                int    div         = 0;
                int    db          = 0;
                double uNext       = GetNext(task, x, u, h);                                            // Vi+1
                double uNextSecond = GetNext(task, x + h * 0.5, GetNext(task, x, u, h * 0.5), h * 0.5); // Vi+1'
                double err         = Math.Abs(uNextSecond - uNext) / 15.0;

                if (err > eps)
                {
                    while (err > eps)
                    {
                        div++;
                        h          *= 0.5;
                        uNext       = GetNext(task, x, u, h);
                        uNextSecond = GetNext(task, x + h * 0.5, GetNext(task, x, u, h * 0.5), h * 0.5);
                        err         = Math.Abs(uNextSecond - uNext) / 15.0;
                    }
                }
                if (err < eps / 32.0)
                {
                    db++;
                }


                x += h;
                u  = uNext;
                data.Insert(step, x, h, uNext, uNextSecond, uNext - uNextSecond, err, div, db);
                step++;
                if (db == 1)
                {
                    h *= 2;
                }
            }

            if (x - xborder > precision)
            {
                step--;
                int div = 0;
                while (x - xborder > precision)
                {
                    x -= h;
                    h *= 0.5;
                    div++;
                    x += h;
                }
                double u1 = GetNext(task, x - h, u, h);
                double u2 = GetNext(task, x - h * 0.5, GetNext(task, x, u, h * 0.5), h * 0.5);
                data.Insert(step, x, h, u1, u2, u1 - u2, Math.Abs(u1 - u2) / 15.0, div, 0);
            }
            data.Nstep = step;
        }
Ejemplo n.º 5
0
        private double GetNext(Koshi task, double x, double u, double h)
        {
            double k1 = task.f(x, u);
            double k2 = task.f(x + h * 0.5, u + h * k1 * 0.5);
            double k3 = task.f(x + h * 0.5, u + h * k2 * 0.5);
            double k4 = task.f(x + h, u + h * k3);

            return(u + h * (k1 + 2 * k2 + 2 * k3 + k4) / 6.0);
        }
Ejemplo n.º 6
0
        private double[] GetNext_syst(Koshi task, double x, double[] u, double h)
        {
            double[] hh = new double[2];
            hh[0] = h; hh[1] = h;
            double[] k1 = task.f_syst(u);
            double[] k2 = task.f_syst(add(u, mult(mult(hh, k1), 0.5)));
            double[] k3 = task.f_syst(add(u, mult(mult(hh, k2), 0.5)));
            double[] k4 = task.f_syst(add(u, mult(hh, k3)));

            return(add(u, div(mult(hh, add(add(k1, mult(k2, 2)), add(mult(k3, 2), k4))), 6.0)));
        }
Ejemplo n.º 7
0
        private void SolveNoControl_syst(Koshi task, ref ResultData data)
        {
            int    step = 1;
            double x    = task.x0;

            double[] u = { task.u0, task.v0 };
            while ((step <= N) && (x - xborder < precision))
            {
                u = GetNext_syst(task, x, u, h);
                double[] uHalfHalf = GetNext_syst(task, x + h * 0.5, GetNext_syst(task, x, u, h * 0.5), h * 0.5);
                double   err       = Math.Abs(uHalfHalf[0] - u[0]) / 15.0;
                if (err < Math.Abs(uHalfHalf[1] - u[1]) / 15.0)
                {
                    err = Math.Abs(uHalfHalf[1] - u[1]) / 15.0;
                }
                x += h;
                data.Insert(step, x, h, u, uHalfHalf, min(u, uHalfHalf), err, 0, 0);
                step++;
            }

            if (x - xborder > precision)
            {
                step--;
                int div = 0;
                while (x - xborder > precision)
                {
                    x -= h;
                    h *= 0.5;
                    div++;
                    x += h;
                }
                double[] u1 = GetNext_syst(task, x - h, u, h);
                double[] u2 = GetNext_syst(task, x - h * 0.5, GetNext_syst(task, x, u, h * 0.5), h * 0.5);
                data.Insert(step, x, h, u1, u2, min(u1, u2), Math.Abs(u1[0] - u2[0]) / 15.0, div, 0);
            }
            data.Nstep = step;
        }
Ejemplo n.º 8
0
        private void SolveWithControl_syst(Koshi task, ref ResultData data)
        {
            int    step = 1;
            double x    = task.x0;

            double[] u = { task.u0, task.v0 };
            while ((step <= N) && (x - xborder < precision))
            {
                int      div         = 0;
                int      db          = 0;
                double[] uNext       = GetNext_syst(task, x, u, h);                                                 // Vi+1
                double[] uNextSecond = GetNext_syst(task, x + h * 0.5, GetNext_syst(task, x, u, h * 0.5), h * 0.5); // Vi+1'
                double   err         = Math.Sqrt((uNext[0] - uNextSecond[0]) * (uNext[0] - uNextSecond[0]) + (uNext[1] - uNextSecond[1]) * (uNext[1] - uNextSecond[1])) / 15.0;
                // double err = Math.Abs(uNextSecond[0] - uNext[0]) / 15.0;
                //if (err < Math.Abs(uNextSecond[1] - u[1]) / 15.0) err = Math.Abs(uNextSecond[1] - u[1]) / 15.0;
                if (err > eps)
                {
                    while (err > eps)
                    {
                        div++;
                        h          /= 2;
                        uNext       = GetNext_syst(task, x, u, h);
                        uNextSecond = GetNext_syst(task, x + h * 0.5, GetNext_syst(task, x, u, h * 0.5), h * 0.5);
                        err         = Math.Abs(uNextSecond[0] - uNext[0]) / 15.0;
                        if (err < Math.Abs(uNextSecond[1] - u[1]) / 15.0)
                        {
                            err = Math.Abs(uNextSecond[1] - u[1]) / 15.0;
                        }
                    }
                }
                if (err < eps / 32.0)
                {
                    db++;
                }


                x += h;
                u  = uNext;
                data.Insert(step, x, h, uNext, uNextSecond, min(uNext, uNextSecond), err, div, db);
                step++;
                if (db == 1)
                {
                    h *= 2;
                }
            }

            if (x - xborder > precision)
            {
                step--;
                int div = 0;
                while (x - xborder > precision)
                {
                    x -= h;
                    h *= 0.5;
                    div++;
                    x += h;
                }
                double[] u1 = GetNext_syst(task, x - h, u, h);
                double[] u2 = GetNext_syst(task, x - h * 0.5, GetNext_syst(task, x, u, h * 0.5), h * 0.5);
                data.Insert(step, x, h, u1, u2, min(u1, u2), Math.Abs(u1[0] - u2[0]) / 15.0, div, 0);
            }
            data.Nstep = step;
        }
Ejemplo n.º 9
0
        private void button1_Click(object sender, EventArgs e)
        {
            ff();
            // Task selection
            int t = 0;

            if (radioButton3.Checked)
            {
                t = 1;
            }
            if (radioButton4.Checked)
            {
                t = 2;
            }
            // Task selection

            // Reckoning
            Koshi task = new Koshi(t, Convert.ToDouble(textBox2.Text), Convert.ToDouble(textBox1.Text));

            if (task.type == 2)
            {
                task.a = Convert.ToDouble(textBox8.Text); task.b = Convert.ToDouble(textBox9.Text); task.c = Convert.ToDouble(textBox10.Text); task.v0 = Convert.ToDouble(textBox11.Text);
            }
            Method     meth   = new Method(checkBox1.Checked, Convert.ToDouble(textBox6.Text), Convert.ToInt32(textBox5.Text), Convert.ToDouble(textBox3.Text), Convert.ToDouble(textBox4.Text), Convert.ToDouble(textBox7.Text));
            ResultData result = meth.ProcessTask(task);

            // Reckoning

            // Table print
            //int p = 1;
            //if (result.i.Length > 1000) p = 10 * result.i.Length/1000;
            groupBox3.Visible = true;
            int edge = (result.Nstep + 1 > 100) ? 100 : result.Nstep;

            for (int i = 0; i < edge; i++)
            {
                dataGridView1.Rows.Add();
                if (result.syst)
                {
                    String v  = '(' + Convert.ToString(result.vii[i, 0]) + ", " + Convert.ToString(result.vii[i, 1]) + ')';
                    String v2 = '(' + Convert.ToString(result.v2ii[i, 0]) + ", " + Convert.ToString(result.v2ii[i, 1]) + ')';
                    String m  = '(' + Convert.ToString(result.minusi[i, 0]) + ", " + Convert.ToString(result.minusi[i, 1]) + ')';
                    dataGridView1.Rows[i].SetValues(result.i[i], result.xi[i], v, v2, m, result.olp[i], result.hi[i], result.div[i], result.db[i], result.ui[i], result.minus2[i]);
                }
                else
                {
                    dataGridView1.Rows[i].SetValues(result.i[i], result.xi[i], result.vi[i], result.v2i[i], result.minus[i], result.olp[i], result.hi[i], result.div[i], result.db[i], result.ui[i], result.minus2[i]);
                }
            }
            // Table print

            label13.Text += Convert.ToString(result.Nstep);
            label14.Text += Convert.ToString(result.xi[result.Nstep - 1]);
            label15.Text += Convert.ToString(result.olp.Max());
            label16.Text += Convert.ToString(result.db.Sum());
            label17.Text += Convert.ToString(result.div.Sum());
            label18.Text += Convert.ToString(result.hi.Max());
            label19.Text += Convert.ToString(result.hi.Min());

            if (!result.syst)
            {
                //label12.Text = Convert.ToString(result.minus2.Max());
                chart1.Series[0].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
                for (int i = 0; i < result.Nstep; i++)
                {
                    chart1.Series[0].Points.AddXY(result.xi[i], result.vi[i]);
                }
                chart1.Series[0].BorderWidth = 8;
                chart1.Series.Add("НАСТОЯЩЕЕ РЕШЕНИЕ");
                chart1.Series[1].ChartType       = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
                chart1.Series[1].BorderWidth     = 3;
                chart1.Series[1].ShadowOffset    = 1;
                chart1.Series[1].BorderDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Dot;
                for (int i = 0; i < result.Nstep; i++)
                {
                    chart1.Series[1].Points.AddXY(result.xi[i], result.ui[i]);
                }
                if (task.type == 0)
                {
                    label12.Text += Convert.ToString(result.minus2.Max());
                }
            }
            else
            {
                tabPage3.Show();
                chart1.Series[0].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
                for (int i = 1; i < result.Nstep; i++)
                {
                    chart1.Series[0].Points.AddXY(result.xi[i], result.vii[i, 0]);
                }
                chart1.Series[0].BorderWidth = 4;
                chart2.Series.Add("МОЯ ТРАЕКТОРИЯ");
                chart2.Series[0].ChartType   = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
                chart2.Series[0].BorderWidth = 4;
                for (int i = 1; i < result.Nstep; i++)
                {
                    chart2.Series[0].Points.AddXY(result.vii[i, 0], result.vii[i, 1]);
                }
            }
            //setdef();
        }