/* Method calculating point-wise approximation. Implementation of the Improved Euler Method. * Returns an approximation at a point with given index i. */ public override double ComputeForPoint(double[] x, double[] y, int i, DifferentialEquation MyDifferentialEquation) { double h = GetStep(); return(y[i] + (h / 2 * (MyDifferentialEquation.Derivative(x[i], y[i]) + MyDifferentialEquation.Derivative(x[i + 1], y[i] + h * MyDifferentialEquation.Derivative(x[i], y[i]))))); }
/// <summary> /// Represents a complex differential equation $y'=f(t,y)$. /// </summary> //public delegate ComplexVector ComplexDifferentialEquation(double t, ComplexVector y); /// <summary> /// Solve the differential equation $y'(t)=f(t,y(t))$ with the boundary condition $y(0)=y_0$. Returns $y(s)$. /// </summary> public static Vector FirstOrderSolve(DifferentialEquation f, Vector y0, double s, int n) { double dt = s / n; Vector y = y0; for (int i = 0; i < n; i++) { double t = i * dt; Vector dy = f(t, y); y += dy * dt; } return y; }
public static Vector BasicMGM(MGM_in setup) { double h = setup.h; // Vector g = ((h * h) / 4d) * setup.b; Vector z = setup.z; double W = (h * h) / 4d; Vector d_temp;// = DifferenceEquations.multiplyD2U(z) - setup.b; if (setup.level == 0) { return(setup.z); //точное решение на грубой сетке } else { //ню базовых итераций for (int k = 0; k < setup.nu; k++) { d_temp = DifferentialEquation.multiplyD2U(z) - setup.b; z = z - W * d_temp; } //коррекция Vector d_2h = Proektor.basic_r(DifferentialEquation.multiplyD2U(z) - setup.b); Vector e_2h = new Vector(d_2h.Length); //Решакем Ае = d for (int i = 0; i < setup.gamma; i++) { MGM_in set = new MGM_in(setup.level - 1, e_2h, d_2h, setup.nu, 2d * h, setup.gamma); e_2h = BasicMGM(set); } //z = z - pe z = z - Resumption.basic_p(e_2h); //постсглаживание for (int k = 0; k < setup.nu; k++) { d_temp = DifferentialEquation.multiplyD2U(z) - setup.b; z = z - W * d_temp; } return(z); } }
public static Vector MGMFull(MGM_in setup) { Vector r = Vector.GetConstVector(1d, setup.N); Vector z = new Vector(); Vector.copy(ref setup.z, setup.b); while (r.Norm > 0.001d) { //MessageBox.Show("||r|| = " + r.Norm2SQ.ToString("0.0000000")); z = BasicMGM(setup); r = DifferentialEquation.multiplyD2U(z) - setup.b; Vector.copy(ref setup.z, z); } return(z); }
/// <summary> /// Solve the complex differential equation $y'(t)=f(t,y(t))$ with the boundary condition $y(0)=y_0$. Returns $y(s)$. /// </summary> /*public static ComplexVector FirstOrderSolve(ComplexDifferentialEquation f, ComplexVector y0, double s, int n) { double dt = s / n; ComplexVector y = y0; for (int i = 0; i < n; i++) { double t = i * dt; ComplexVector dy = f(t, y); y += dy * dt; } return y; }*/ /// <summary> /// Solve the complex differential equation $y'(t)=f(t,y(t))$ with the boundary condition $y(s)=y_s$. Returns $y(0)$. /// </summary> /*public static ComplexVector FirstOrderSolveReverse(ComplexDifferentialEquation f, double s, ComplexVector ys, int n) { ComplexDifferentialEquation g = delegate(double t, ComplexVector y) { return -f(s - t, y); }; return FirstOrderSolve(g, ys, s, n); }*/ /// <summary> /// Solve the differential equation $y'(t)=f(t,y(t))$ with the boundary condition $y(0)=y_0$. Returns $y(s)$. /// </summary> public static Vector RungeKuttaSolve(DifferentialEquation f, Vector y0, double s, int n) { double dt = s / n; Vector y = y0; for (int i = 0; i < n; i++) { double t = i * dt; Vector k1 = f(t, y); Vector k2 = f(t + 0.5 * dt, y + 0.5 * dt * k1); Vector k3 = f(t + 0.5 * dt, y + 0.5 * dt * k2); Vector k4 = f(t + dt, y + dt * k3); y += dt * (k1 + 2.0 * k2 + 2.0 * k3 + k4) / 6.0; } return y; }
private void Window_Loaded(object sender, RoutedEventArgs e) { lst_x = new List <double>(); //lst_t = new List<double>(); for (int i = 0; i < 10; i++) { lst_x.Add(i); } c_del c_func = new c_del((x, t) => 1); c_del f_func = new c_del((x, t) => - 2 * t + 2 * x); y_0_del yX0 = new y_0_del((x) => x * x); y_0_del y0T = new y_0_del((t) => - t * t); diffur = new DifferentialEquation(lst_x, lst_t, c_func, f_func, yX0, y0T); chart.ChartAreas.Add(new ChartArea(ChartAreaName)); // Добавим линию, и назначим ее в ранее созданную область "Default" chart.Series.Add(new Series(ChartSerieName)); chart.Series[ChartSerieName].ChartArea = ChartAreaName; chart.Series[ChartSerieName].ChartType = SeriesChartType.Point; chart.Series[ChartSerieName].Color = Color.Blue; chart.Series.Add(new Series("Original")); chart.Series["Original"].ChartArea = ChartAreaName; chart.Series["Original"].ChartType = SeriesChartType.Point; chart.Series["Original"].Color = Color.OrangeRed; // добавим данные линии chart.Series[ChartSerieName].Points.DataBindXY(lst_x, diffur.GetListY(0)); x_org = new List <double>(); for (int i = 0; i < 60; i++) { x_org.Add(i * 0.1); } chart.Series["Original"].Points.DataBindXY(x_org, diffur.GetOriginValues(x_org, 0)); }
public Vector CalculateIteration() { calc_u = DifferentialEquation.GetSolutionTask1(manage_p, manage_f, phi, nu, L, T, aa, GRID_SIZE, TIME_SIZE); Matrix KSI = DifferentialEquation.GetSolutionTask2(y, calc_u, nu, L, T, aa, GRID_SIZE, TIME_SIZE); Vector ksi_l = new Vector(TIME_SIZE); for (int i = 0; i < TIME_SIZE; i++) { ksi_l[i] = KSI[i, GRID_SIZE - 1]; } double alpha = ChooseAlpha_LipMethod(); double tau = MyMath.Basic.GetStep(TIME_SIZE, 0d, T); double h = MyMath.Basic.GetStep(GRID_SIZE, 0d, L); manage_p = DifferentialEquation.GrdientProjection(manage_p, ksi_l, alpha, aa, P_MIN, P_MAX); manage_f = DifferentialEquation.GrdientProjectionByF(manage_f, KSI, alpha, R, h, tau); ITERATION++; return(manage_p); }
public void RungeKutta4Test1() { Matrix YX = new Matrix(2, 1); YX[0, 0] = 1; YX[1, 0] = 0; double h0 = 2.5; double m = 10; DifferentialEquation.Fx equationTest = EquationTest1; DifferentialEquation someEquation = new DifferentialEquation(equationTest); Matrix newYX = someEquation.SolutionRungeKutta4(YX, h0, m); Matrix rightAnswer = new Matrix(2, 1); rightAnswer[0, 0] = 1.81930573495; rightAnswer[1, 0] = 2.5; Assert.AreEqual(rightAnswer[0, 0], newYX[0, 0], 0.00000001); Assert.AreEqual(rightAnswer[1, 0], newYX[1, 0], 0.00000001); }