Exemple #1
0
    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);
    }
Exemple #2
0
    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);
    }
Exemple #3
0
    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();
    }