Example #1
0
        public Point Task2(Form form, Point location)
        {
            DkParameters parameters = new DkParameters()
            {
                Equations = new List <Func <double[], double> >()
                {
                    Func2, Func3
                },
                Init  = new double[] { 4, 6 },
                Start = 0,
                End   = 2,
                Delta = 0.05,
                PassX = false
            };

            return(SolveInPointsRK(parameters).GetPlot().AddToForm(form, location));
        }
Example #2
0
        public DkSolve SolveInPointsRK(DkParameters parameters)
        {
            double[] x = new double[(int)Math.Ceiling((parameters.End - parameters.Start) / parameters.Delta)];

            for (int i = 0; i < x.Length; ++i)
            {
                x[i] = parameters.Delta * i + parameters.Start;
            }

            double[][] ys = new double[x.Length][];

            ys[0] = parameters.Init;

            for (int i = 0; i < x.Length - 1; ++i)
            {
                double[] prefix     = parameters.PassX ? new double[] { x[i] } : new double[] { };
                double[] prefixHalf = prefix.Add(0.5 * parameters.Delta);
                double[] prefixFull = prefix.Add(parameters.Delta);

                double[] k1 = parameters.Equations.Select(eq =>
                                                          eq(prefix.Concat(ys[i]).ToArray())
                                                          ).ToArray();

                double[] k2 = parameters.Equations.Select(
                    eq => eq(prefixHalf.Concat(k1.Multiply(0.5 * parameters.Delta).Add(ys[i])).ToArray())
                    ).ToArray();

                double[] k3 = parameters.Equations.Select(
                    eq => eq(prefixHalf.Concat(k2.Multiply(0.5 * parameters.Delta).Add(ys[i])).ToArray())
                    ).ToArray();

                double[] k4 = parameters.Equations.Select(
                    eq => eq(prefixFull.Concat(k3.Multiply(parameters.Delta).Add(ys[i])).ToArray())
                    ).ToArray();

                ys[i + 1] = ys[i].Add(k1.Add(k2.Multiply(2)).Add(k3.Multiply(2)).Add(k4).Multiply(parameters.Delta / 6));
            }

            return(new DkSolve()
            {
                X = x, Ys = ys
            });
        }