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