コード例 #1
0
        private void rButton1_Click(object sender, EventArgs e)
        {
            double epsMax = -1;
            double kMax   = -1;

            int num;

            if (!int.TryParse(textBox1.Text, out num))
            {
                return;
            }

            info = new DotForm();
            Method m = new Method(
                (x) => 1,
                (x) => 1,
                (x) => 1,
                (x) => 1.0 / 2.0,
                (x) => (Math.PI * Math.PI / 16.0),
                (x) => (Math.Sqrt(2.0) / 2.0),
                Math.PI / 4.0,
                1.0, 0.0, num
                );

            double[] v = m.Count();

            double xi = 0;

            double h = 1.0 / num;

            chart2.Series[0].Points.Clear();
            mainChart.Series[0].Points.Clear();

            info.Data = new List <string[]>();
            for (int i = 0; i <= num; ++i)
            {
                double ui  = UFunc(xi);
                double eps = (v[i] - ui);

                string[] data = { i + "", xi + "", ui + "", v[i] + "", eps + "" };
                info.Data.Add(data);

                if (Math.Abs(eps) > epsMax)
                {
                    epsMax = Math.Abs(eps);
                    kMax   = i;
                }

                xi += h;
            }

            int control = 1;

            if (num > 1000)
            {
                control = num / 1000;
                num     = 1000;
            }

            xi = 0;
            h  = 1.0 / num;
            for (int i = 0; i <= num; ++i)
            {
                double ui  = UFunc(xi);
                double eps = (v[control * i] - ui);

                mainChart.Series[0].Points.AddXY(xi, v[control * i]);
                chart2.Series[0].Points.AddXY(xi, Math.Abs(eps));

                xi += h;
            }

            if (num > 1000)
            {
                mainChart.Series[0].Points.AddXY(1, v[v.Length - 1]);
            }

            info.param.Text = $"Полученная точность решения: {epsMax}, на {kMax} шаге";

            info.Show();
        }
コード例 #2
0
        private void rButton1_Click(object sender, EventArgs e)
        {
            tabControl1.TabPages[1].Enabled = false;
            tabControl1.TabPages[2].Enabled = false;

            if (sRun)
            {
                sRun = false;
                super.Abort();
                rButton1.Text = "запуск";

                tabControl1.TabPages[1].Enabled = true;
                tabControl1.TabPages[2].Enabled = true;

                return;
            }

            sRun          = true;
            rButton1.Text = "cтоп";

            mainChart.ChartAreas[0].AxisX.Title = "x";
            mainChart.ChartAreas[0].AxisY.Title = "u";

            super = new Thread(() =>
            {
                double u0  = Convert.ToDouble(u0TextBox1.Text.Replace('.', ','));
                double h   = Convert.ToDouble(hTextBox1.Text.Replace('.', ','));
                int n      = Convert.ToInt32(nTextBox1.Text.Replace('.', ','));
                double eps = Convert.ToDouble(epsTextBox1.Text.Replace('.', ','));
                double rb  = Convert.ToDouble(rbTextBox1.Text.Replace('.', ','));

                bool ctrl = !checkBox1.Checked;

                FirstMethod m = new FirstMethod((x, u) => (-1) * 5 / 2 * u, 0, u0, h, eps, ctrl);

                mainChart.Invoke(new Action(() => {
                    mainChart.Series["Численное решение"].Points.Clear();
                    mainChart.Series["Точное решение"].Points.Clear();


                    chart1.Series["h"].Points.Clear();
                }));

                ++nums;
                info             = new DotForm();
                info.label1.Text = "Запуск номер" + nums + "; Метод 2";



                minDot = double.MaxValue;
                maxDot = double.MinValue;

                double minStep = double.MaxValue;
                double mns     = 0;

                double maxStep = double.MinValue;
                double mxs     = 0;

                double maxDiff = 0;
                double mxd     = 0;

                int count = 0;
                Dot p     = null;

                double maxOLP = 0;

                foreach (var i in Enumerable.Range(0, n))
                {
                    double step = m.Step;
                    p           = m.nextStep(out double contr, out double olp);
                    if (Math.Abs(p.Y) < 1e-8)
                    {
                        p.Y = 0;
                    }
                    if (Math.Abs(p.Y) > 10e+20)
                    {
                        break;
                    }
                    if (Math.Abs(p.X) < 1e-8)
                    {
                        p.X = 0;
                    }
                    if (Math.Abs(p.X) > 10e+20)
                    {
                        break;
                    }

                    mainChart.Invoke(new Action(() =>
                    {
                        mainChart.Series["Численное решение"].Points.AddXY(p.X, p.Y);
                        chart1.Series["h"].Points.AddXY(i, step);
                    }));

                    Console.WriteLine(p.X + " " + p.Y);

                    mainChart.Invoke(new Action(() =>
                    {
                        info.dataGridView1.Rows.Add(i + "", p.Y, contr, olp, step, m.C1, m.C2, u0 * Math.Exp(-5 / 2 * p.X), Math.Abs(u0 * Math.Exp(-5 / 2 * p.X) - p.Y));
                    }));

                    if (minDot > p.Y)
                    {
                        minDot = p.Y;
                    }

                    if (maxDot < p.Y)
                    {
                        maxDot = p.Y;
                    }

                    if (p.X > rb)
                    {
                        break;
                    }

                    if (maxOLP < Math.Abs(olp))
                    {
                        maxOLP = Math.Abs(olp);
                    }

                    if (step > maxStep)
                    {
                        maxStep = step;
                        mxs     = p.X;
                    }

                    if (step < minStep)
                    {
                        minStep = step;
                        mns     = p.X;
                    }

                    if (maxDiff < Math.Abs(u0 * Math.Exp(-5 / 2 * p.X) - p.Y))
                    {
                        maxDiff = Math.Abs(u0 * Math.Exp(-5 / 2 * p.X) - p.Y);
                        mxd     = p.X;
                    }

                    count++;
                }

                mainChart.Invoke(new Action(() =>
                {
                    correctAxis(rb, minDot - 0.01, maxDot + 0.01);
                    info.param.Text = $"n = : {count}, \nb-Xn: {rb - p.X}, \nmaxOLP: {maxOLP}, \nC1: {m.C1}, \nC2: {m.C2}, \nmax Hi: {maxStep} -> x: {mxs}, \nmin Hi: {minStep} -> x: {mns}, \nMaxDiff: {maxDiff} -> x: {mxd}";

                    info.Show();

                    sRun          = false;
                    rButton1.Text = "запуск";

                    tabControl1.TabPages[1].Enabled = true;
                    tabControl1.TabPages[2].Enabled = true;
                }));
            });

            super.Start();
        }
コード例 #3
0
        private void rButton3_Click(object sender, EventArgs e)
        {
            tabControl1.TabPages[1].Enabled = false;
            tabControl1.TabPages[0].Enabled = false;

            if (sRun)
            {
                sRun = false;
                super.Abort();
                rButton3.Text = "запуск";

                tabControl1.TabPages[1].Enabled = true;
                tabControl1.TabPages[0].Enabled = true;

                return;
            }

            sRun          = true;
            rButton3.Text = "cтоп";

            int selected = comboBox1.SelectedIndex;

            super = new Thread(() =>
            {
                double u0  = Convert.ToDouble(u0TextBox3.Text.Replace('.', ','));
                double u01 = Convert.ToDouble(u01TextBox3.Text.Replace('.', ','));
                double h   = Convert.ToDouble(hTextBox3.Text.Replace('.', ','));
                int n      = Convert.ToInt32(nTextBox3.Text.Replace('.', ','));
                double eps = Convert.ToDouble(epsTextBox3.Text.Replace('.', ','));
                double rb  = Convert.ToDouble(rbTextBox3.Text.Replace('.', ','));

                double a = Convert.ToDouble(aTextBox3.Text.Replace('.', ','));
                double b = Convert.ToDouble(bTextBox3.Text.Replace('.', ','));



                bool ctrl = !checkBox3.Checked;

                SecondMethod m = new SecondMethod(
                    (x, u1, u2) => (u2),
                    (x, u1, u2) => (-a * Math.Sqrt(u2 * u2 + 1) - b),
                    0, u0, u01, h, eps, ctrl);


                mainChart.Invoke(new Action(() =>
                {
                    mainChart.Series["Численное решение"].Points.Clear();
                    mainChart.Series["Точное решение"].Points.Clear();


                    chart1.Series["h"].Points.Clear();
                }));

                ++nums;
                info             = new DotForm();
                info.label1.Text = "Запуск номер " + nums + "; Метод 3";


                minDot      = double.MaxValue;
                maxDot      = double.MinValue;
                double minX = double.MaxValue;

                double minStep = double.MaxValue;
                double mns     = 0;

                double maxStep = double.MinValue;
                double mxs     = 0;

                MDot p = null;

                int count     = 0;
                double maxOLP = 0;

                foreach (var i in Enumerable.Range(0, n))
                {
                    double step = m.Step;
                    p           = m.nextStep(out double contr, out double olp);
                    if (Math.Abs(p.U1) < 1e-8)
                    {
                        p.U2 = 0;
                    }
                    if (Math.Abs(p.U1) > 10e+20)
                    {
                        break;
                    }
                    if (Math.Abs(p.X) < 1e-8)
                    {
                        p.X = 0;
                    }
                    if (Math.Abs(p.X) > 10e+20)
                    {
                        break;
                    }

                    Dot add = new Dot();

                    if (selected == 0)
                    {
                        add.X = p.X;
                        add.Y = p.U1;
                    }
                    if (selected == 1)
                    {
                        add.X = p.X;
                        add.Y = p.U2;
                    }
                    if (selected == 2)
                    {
                        add.X = p.U1;
                        add.Y = p.U2;
                    }

                    mainChart.Invoke(new Action(() => {
                        mainChart.Series["Численное решение"].Points.AddXY(add.X, add.Y);
                        chart1.Series["h"].Points.AddXY(i, step);
                    }));

                    Console.WriteLine(p.X + " " + p.U1);

                    mainChart.Invoke(new Action(() =>
                    {
                        info.dataGridView1.Rows.Add(i + "", add.Y, contr, olp, step, m.C1, m.C2, "-", "-");
                    }));

                    if (minDot > add.Y)
                    {
                        minDot = add.Y;
                    }

                    if (maxDot < add.Y)
                    {
                        maxDot = add.Y;
                    }

                    if (minX > add.X)
                    {
                        minX = add.X;
                    }

                    if (p.X > rb)
                    {
                        break;
                    }

                    if (maxOLP < Math.Abs(olp))
                    {
                        maxOLP = Math.Abs(olp);
                    }

                    if (step > maxStep)
                    {
                        maxStep = step;
                        mxs     = p.X;
                    }

                    if (step < minStep)
                    {
                        minStep = step;
                        mns     = p.X;
                    }

                    count++;
                }

                mainChart.Invoke(new Action(() =>
                {
                    correctAxis(rb, minDot - 0.01, maxDot + 0.01);

                    info.param.Text = $"n = : {count}, \nb-Xn: {rb - p.X}, \nmaxOLP: {maxOLP}, \nC1: {m.C1}, \nC2: {m.C2}, \nmax Hi: {maxStep} -> x: {mxs}, \nmin Hi: {minStep} -> x: {mns}";
                    info.Show();

                    sRun          = false;
                    rButton3.Text = "запуск";

                    tabControl1.TabPages[1].Enabled = true;
                    tabControl1.TabPages[0].Enabled = true;

                    if (selected == 0)
                    {
                        mainChart.ChartAreas[0].AxisX.Title = "x";
                        mainChart.ChartAreas[0].AxisY.Title = "u1";
                    }
                    if (selected == 1)
                    {
                        mainChart.ChartAreas[0].AxisX.Title = "x";
                        mainChart.ChartAreas[0].AxisY.Title = "u2";
                    }
                    if (selected == 2)
                    {
                        mainChart.ChartAreas[0].AxisX.Title = "u1";
                        mainChart.ChartAreas[0].AxisY.Title = "u2";

                        correctAxis(rb, minDot - 0.01, maxDot + 0.01, minX - 0.01);
                    }
                }));
            });

            super.Start();
        }
コード例 #4
0
        private void rButton1_Click(object sender, EventArgs e)
        {
            ++chartCount;
            string chartName = "Численное решение №" + chartCount;
            var    settings  = mainChart.Series.Add(chartName);

            settings.ChartType = SeriesChartType.Line;

            if (sRun)
            {
                sRun = false;
                super.Abort();
                rButton1.Text = "запуск";
                return;
            }

            sRun          = true;
            rButton1.Text = "cтоп";

            mainChart.ChartAreas[0].AxisX.Title = "x";
            mainChart.ChartAreas[0].AxisY.Title = "u";

            super = new Thread(() =>
            {
                double u0  = Convert.ToDouble(u0TextBox1.Text.Replace('.', ','));
                double h   = Convert.ToDouble(hTextBox1.Text.Replace('.', ','));
                int n      = Convert.ToInt32(nTextBox1.Text.Replace('.', ','));
                double eps = Convert.ToDouble(epsTextBox1.Text.Replace('.', ','));
                double rb  = Convert.ToDouble(rbTextBox1.Text.Replace('.', ','));

                double r = Convert.ToDouble(rTextBox1.Text.Replace('.', ','));
                double l = Convert.ToDouble(lTextBox1.Text.Replace('.', ','));
                double v = Convert.ToDouble(vTextBox1.Text.Replace('.', ','));

                double param = Convert.ToDouble(paramTextBox.Text.Replace('.', ','));

                bool ctrl = !checkBox1.Checked;

                FirstMethod m = new FirstMethod((x, u) => (-r * u / l) + (v / l), 0, u0, h, eps, ctrl);

                mainChart.Invoke(new Action(() => {
                    mainChart.Series[chartName].Points.Clear();
                    //chart1.Series["h"].Points.Clear();
                }));

                ++nums;
                info             = new DotForm();
                info.label1.Text = "Запуск номер " + nums + ";";



                minDot = double.MaxValue;
                maxDot = double.MinValue;

                double minStep = double.MaxValue;
                double mns     = 0;

                double maxStep = double.MinValue;
                double mxs     = 0;

                double maxDiff = 0;
                double mxd     = 0;

                int count = 0;
                Dot p     = null;

                double maxOLP = 0;

                foreach (var i in Enumerable.Range(0, n))
                {
                    double step = m.Step;
                    p           = m.nextStep(out double contr, out double olp);
                    if (Math.Abs(p.Y) < 1e-8)
                    {
                        p.Y = 0;
                    }
                    if (Math.Abs(p.Y) > 10e+20)
                    {
                        break;
                    }
                    if (Math.Abs(p.X) < 1e-8)
                    {
                        p.X = 0;
                    }
                    if (Math.Abs(p.X) > 10e+20)
                    {
                        break;
                    }

                    mainChart.Invoke(new Action(() =>
                    {
                        mainChart.Series[chartName].Points.AddXY(p.X, p.Y);
                        //chart1.Series["h"].Points.AddXY(i, step);
                    }));

                    Console.WriteLine(p.X + " " + p.Y);

                    mainChart.Invoke(new Action(() =>
                    {
                        info.dataGridView1.Rows.Add(i + "", p.X, p.Y, contr, olp, step, m.C1, m.C2, CurFunction(u0, v, r, l, p.X), Math.Abs(CurFunction(u0, v, r, l, p.X) - p.Y));
                    }));

                    if (minDot > p.Y)
                    {
                        minDot = p.Y;
                    }

                    if (maxDot < p.Y)
                    {
                        maxDot = p.Y;
                    }

                    if (p.X >= rb - param && p.X <= rb)
                    {
                        break;
                    }

                    if (p.X + m.Step > rb)
                    {
                        while (p.X + m.Step > rb)
                        {
                            m.Step /= 2;
                        }
                    }

                    if (maxOLP < Math.Abs(olp))
                    {
                        maxOLP = Math.Abs(olp);
                    }

                    if (step > maxStep)
                    {
                        maxStep = step;
                        mxs     = p.X;
                    }

                    if (step < minStep)
                    {
                        minStep = step;
                        mns     = p.X;
                    }

                    if (maxDiff < Math.Abs(CurFunction(u0, v, r, l, p.X) - p.Y))
                    {
                        maxDiff = Math.Abs(CurFunction(u0, v, r, l, p.X) - p.Y);
                        mxd     = p.X;
                    }

                    count++;
                }

                mainChart.Invoke(new Action(() =>
                {
                    correctAxis(rb, minDot - 0.01, maxDot + 0.01);
                    info.param.Text = $"Номер шага = : {count}, \nРасстояние до правой границы: {rb - p.X}, \nМаксимальная оценка локальной погрешности (ОЛП): {maxOLP}, \nКоличество делений шага: {m.C1}, \nКоличество удвоений шага: {m.C2}, \nМаксимальный шаг: {maxStep}, достигнут в точке: {mxs}, \nМинимальный шаг: {minStep} , достигнут в точке: {mns}, \nМаксимальное расстояние до функции: {maxDiff}, в точке: {mxd}";

                    info.Show();

                    sRun          = false;
                    rButton1.Text = "запуск";
                }));
            });

            super.Start();
        }
コード例 #5
0
        private void button1_Click(object sender, EventArgs e)
        {
            int n = Convert.ToInt32(textBox3.Text);
            int m = Convert.ToInt32(textBox4.Text);

            double eps = Convert.ToDouble(textBox2.Text.Replace('.', ','));
            double max = Convert.ToInt32(textBox1.Text);


            List <Method.Func> param1 = new List <Method.Func>();

            param1.Add((x, y) => 1 - x * x - y * y);
            param1.Add((x, y) => 1 - x * x - y * y);
            param1.Add((x, y) => 1 - x * x - y * y);
            param1.Add((x, y) => 1 - x * x - y * y);


            double[] param2 = { -1, 1, -1, 1 };

            Method meth = new Method(
                (x, y) => 4,
                param1.ToArray(),
                param2,
                n, m
                );


            var result = meth.Calculate(eps, max, out double num, out double diff, out double Z, out double R);

            Console.WriteLine(num + " " + diff);

            info           = new DotForm(param2, n, m, meth.Result);
            info.Info.Text = $"Достигнутая точность = {diff}, Количество итераций = {num}, \nНевязка системы = {R}, Общая погрешность = {Z} ";

            info.Show();

            if (checkBox1.Checked)
            {
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.DefaultExt = "txt";
                sfd.Filter     = "Text files (*.txt)|*.txt";

                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    using (StreamWriter sw = new StreamWriter(sfd.FileName))
                    {
                        double h = (param2[1] - param2[0]) / n;
                        double k = (param2[3] - param2[2]) / m;
                        for (int i = 0; i < n + 1; ++i)
                        {
                            for (int j = 0; j < m + 1; ++j)
                            {
                                sw.Write($"{(param2[0] + i*h).ToString().Replace(',', '.')},{(param2[2] + j*k).ToString().Replace(',', '.')},{(meth.Result[i,j]).ToString().Replace(',', '.')}\n");
                            }
                        }
                    }

                    Method.Func example = (x, y) => 1 - x * x - y * y;
                    using (StreamWriter sw = new StreamWriter(sfd.FileName + ".empl"))
                    {
                        double h = (param2[1] - param2[0]) / n;
                        double k = (param2[3] - param2[2]) / m;
                        for (int i = 0; i < n + 1; ++i)
                        {
                            for (int j = 0; j < m + 1; ++j)
                            {
                                sw.Write($"{(param2[0] + i * h).ToString().Replace(',', '.')},{(param2[2] + j * k).ToString().Replace(',', '.')},{(example(param2[0] + i * h, param2[2] + j * k)).ToString().Replace(',', '.')}\n");
                            }
                        }
                    }
                }
            }
        }
コード例 #6
0
        private void rButton1_Click(object sender, EventArgs e)
        {
            ++chartCount;
            string chartName = "Численное решение №" + chartCount;
            var    settings  = mainChart.Series.Add(chartName);

            settings.ChartType = SeriesChartType.Line;

            if (sRun)
            {
                sRun = false;
                super.Abort();
                rButton1.Text = "запуск";
                return;
            }

            sRun          = true;
            rButton1.Text = "cтоп";

            mainChart.ChartAreas[0].AxisX.Title = "x";
            mainChart.ChartAreas[0].AxisY.Title = "u";

            super = new Thread(() =>
            {
                double l   = Convert.ToDouble(lTextBox1.Text.Replace('.', ','));
                double h   = Convert.ToDouble(hTextBox1.Text.Replace('.', ','));
                int n      = Convert.ToInt32(nTextBox1.Text.Replace('.', ','));
                double eps = Convert.ToDouble(epsTextBox1.Text.Replace('.', ','));

                double el = Convert.ToDouble(elTextBox1.Text.Replace('.', ','));
                double pp = Convert.ToDouble(pTextBox1.Text.Replace('.', ','));

                bool ctrl = !checkBox1.Checked;

                Method m = new Method(
                    (x, u1, u2) => ((1 / l) + -x * (1 / (l * l))) * pp * l * l / (el),
                    (x, u1, u2) => u1,
                    0, 0, 0, h, eps, ctrl);

                mainChart.Invoke(new Action(() => {
                    mainChart.Series[chartName].Points.Clear();
                    //chart1.Series["h"].Points.Clear();
                }));

                ++nums;
                info             = new DotForm();
                info.label1.Text = "Запуск номер " + nums + ";";



                minDot = double.MaxValue;
                maxDot = double.MinValue;

                double minStep = double.MaxValue;
                double mns     = 0;

                double maxStep = double.MinValue;
                double mxs     = 0;

                int count = 0;
                MDot p    = null;

                double maxOLP = 0;
                double sum    = 0;

                MDot prev = null;
                foreach (var i in Enumerable.Range(0, n))
                {
                    double step = m.Step;
                    p           = m.nextStep(out double contr, out double olp, out double len);
                    if (Math.Abs(p.U2) < 1e-20)
                    {
                        p.U2 = 0;
                    }
                    if (Math.Abs(p.U2) > 10e+20)
                    {
                        break;
                    }
                    if (Math.Abs(p.X) < 1e-20)
                    {
                        p.X = 0;
                    }
                    if (Math.Abs(p.X) > 10e+20)
                    {
                        break;
                    }

                    sum += len;

                    bool needToBreak = false;
                    if (checkBox2.Checked)
                    {
                        if (sum > l)
                        {
                            var diff = sum - l;
                            var proc = diff / len;

                            var cStep = step * (proc);
                            var up    = (p.U2 - prev.U2) * (proc);

                            p.X  -= cStep;
                            p.U2 -= up;

                            needToBreak = true;;
                        }
                    }

                    mainChart.Invoke(new Action(() =>
                    {
                        mainChart.Series[chartName].Points.AddXY(p.X, p.U2);
                        //chart1.Series["h"].Points.AddXY(i, step);
                    }));

                    if (!checkBox2.Checked)
                    {
                        if (p.X > 5)
                        {
                            break;
                        }
                    }
                    else if (needToBreak)
                    {
                        break;
                    }

                    Console.WriteLine(p.X + " " + p.U2);

                    mainChart.Invoke(new Action(() =>
                    {
                        info.dataGridView1.Rows.Add(i + "", p.X, p.U2, contr, olp, step, m.C1, m.C2);
                    }));

                    if (minDot > p.U2)
                    {
                        minDot = p.U2;
                    }

                    if (maxDot < p.U2)
                    {
                        maxDot = p.U2;
                    }

                    if (maxOLP < Math.Abs(olp))
                    {
                        maxOLP = Math.Abs(olp);
                    }

                    if (step > maxStep)
                    {
                        maxStep = step;
                        mxs     = p.X;
                    }

                    if (step < minStep)
                    {
                        minStep = step;
                        mns     = p.X;
                    }

                    count++;
                    prev = p;
                }

                mainChart.Invoke(new Action(() =>
                {
                    correctAxis(10, minDot - 0.01, maxDot + 0.01);
                    info.param.Text = $"Номер шага = : {count},\nМаксимальная оценка локальной погрешности (ОЛП): {maxOLP}, \nКоличество делений шага: {m.C1}, \nКоличество удвоений шага: {m.C2}, \nМаксимальный шаг: {maxStep}, достигнут в точке: {mxs}, \nМинимальный шаг: {minStep} , достигнут в точке: {mns}";

                    info.Show();

                    sRun          = false;
                    rButton1.Text = "запуск";
                }));
            });

            super.Start();
        }