Пример #1
0
        /* 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;
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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));
        }
Пример #7
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);
        }