public TaskSolution Solve(DiffMethod method, double a, double b, int n) { TablesManager manager = new TablesManager(); t0Table = manager.T0Table; mTable = manager.MTable; nTable = manager.NTable; sigmaTable = manager.SigmaTable; DiffEquationSys deSys = null; switch (method) { case DiffMethod.RungeKutta: deSys = new RungeKuttaDiffEquationSys(new DiffEquationSys.SeveralArgFun[] { (x, y) => ((y[1] - (Rk + Rp(y[0])) * y[0]) / Lk), (x, y) => (-y[0] / Ck) }); break; case DiffMethod.ImplTrap: deSys = new ImplTrapDiffEquationSys(new DiffEquationSys.SeveralArgFun[] { (x, y) => ((y[1] - (Rk + Rp(y[0])) * y[0]) / Lk), (x, y) => (-y[0] / Ck) }); break; } DiffEquationSolution[] sysSolution = deSys.FindSolution(a, b, new double[] { I0, Uc0 }, n); DiffEquationSolution rpSolution = new DiffEquationSolution(a, b, n); for (int i = 0; i <= n; i++) { rpSolution.Y[i] = Rp(sysSolution[0].Y[i]); } DiffEquationSolution ucpSolution = new DiffEquationSolution(a, b, n); for (int i = 0; i <= n; i++) { ucpSolution.Y[i] = rpSolution.Y[i] * sysSolution[0].Y[i]; } TaskSolution taskSolution; taskSolution.I = sysSolution[0]; taskSolution.Uc = sysSolution[1]; taskSolution.Rp = rpSolution; taskSolution.Ucp = ucpSolution; return(taskSolution); }
public override DiffEquationSolution[] FindSolution(double a, double b, double[] y0, int n) { DiffEquationSolution[] solutions = new DiffEquationSolution[f.Length]; for (int i = 0; i < f.Length; i++) { solutions[i] = new DiffEquationSolution(a, b, n); solutions[i].Y[0] = y0[i]; } double x = a; double h = (b - a) / n; for (int i = 1; i <= n; i++, x += h) { double[,] k = new double[4, f.Length]; // Вычисление K0. double[] y = new double[f.Length]; for (int j = 0; j < f.Length; j++) { y[j] = solutions[j].Y[i - 1]; } for (int j = 0; j < f.Length; j++) { k[0, j] = h * f[j](x, y); } // Вычисление Kindex, index = 1,...,3 for (int index = 1; index <= 3; index++) { for (int j = 0; j < f.Length; j++) { y[j] = solutions[j].Y[i - 1] + 0.5 * k[index - 1, j]; } for (int j = 0; j < f.Length; j++) { k[index, j] = h * f[j](x + 0.5 * h, y); } } // Приращение функции. for (int j = 0; j < f.Length; j++) { y[j] = 0.1667 * (k[0, j] + 2 * k[1, j] + 2 * k[2, j] + k[3, j]); solutions[j].Y[i] = solutions[j].Y[i - 1] + y[j]; } } return(solutions); }
public override DiffEquationSolution[] FindSolution(double a, double b, double[] y0, int n) { DiffEquationSolution[] solutions = new DiffEquationSolution[f.Length]; for (int i = 0; i < f.Length; i++) { solutions[i] = new DiffEquationSolution(a, b, n); solutions[i].Y[0] = y0[i]; } double x = a; double h = (b - a) / n; for (int i = 1; i <= n; i++, x += h) { double[] yk = new double[f.Length]; for (int j = 0; j < f.Length; j++) { yk[j] = solutions[j].Y[i - 1]; } double[] yk1 = new double[f.Length]; for (int j = 0; j < f.Length; j++) { yk[j] = solutions[j].Y[i - 1]; } for (int j = 0; j < f.Length; j++) { yk1[j] = yk[j] + 0.5 * h * (f[j](x, yk) + f[j](x + h, yk1)); } for (int j = 0; j < f.Length; j++) { yk1[j] = yk[j] + 0.5 * h * (f[j](x, yk) + f[j](x + h, yk1)); } for (int j = 0; j < f.Length; j++) { solutions[j].Y[i] = yk1[j]; } } return(solutions); }
public void DrawGraph(DiffEquationSolution I, DiffEquationSolution Uc, DiffEquationSolution Rp, DiffEquationSolution Ucp) { GraphPane pane = zedGraph.GraphPane; pane.CurveList.Clear(); PointPairList list = new PointPairList(); for (int i = 0; i <= I.N; i++) { list.Add(I.X[i], I.Y[i]); } pane.AddCurve("I", list, Color.Blue, SymbolType.None); list = new PointPairList(); for (int i = 0; i <= I.N; i++) { list.Add(Uc.X[i], Uc.Y[i]); } pane.AddCurve("Uc", list, Color.Red, SymbolType.None); /*list = new PointPairList(); * for (int i = 0; i <= I.N; i++) * { * list.Add(Rp.X[i], Rp.Y[i]); * } * pane.AddCurve("Rp", list, Color.Black, SymbolType.None);*/ list = new PointPairList(); for (int i = 0; i <= I.N; i++) { list.Add(Ucp.X[i], Ucp.Y[i]); } pane.AddCurve("Ucp", list, Color.LightGreen, SymbolType.None); zedGraph.AxisChange(); zedGraph.Invalidate(); }