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(); }
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(); }
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(); }
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(); }
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"); } } } } } }
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(); }