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; }
/*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); }
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]); } }
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; }
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); }
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))); }
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; }
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; }
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(); }