Example #1
0
        protected override void solve()
        {
            result = new double[n + 1, m + 1];
            for (int i = 0; i <= n; i++)
            {
                result[i, 0] = task.InitialCondition(Xgrid.points[i]);
            }
            for (int j = 0; j <= m; j++)
            {
                result[0, j] = task.BoundaryConditionLeft(Tgrid.points[j]);
                result[n, j] = task.BoundaryConditionRight(Tgrid.points[j]);
            }
            f = new double[n + 1, m + 1];
            for (int i = 0; i <= n; i++)
            {
                for (int j = 0; j <= m; j++)
                {
                    f[i, j] = task.f(Xgrid.points[i], Tgrid.points[j]);
                }
            }

            var A      = new double[n + 1];
            var B      = new double[n + 1];
            var C      = new double[n + 1];
            var F      = new double[n + 1];
            var tmpRes = new double[n + 1];

            for (int i = 1; i < n; i++)
            {
                A[i] = -1 / (Xgrid.h * Xgrid.h);
                C[i] = 1 / Tgrid.h + 2 / (Xgrid.h * Xgrid.h);
                B[i] = -1 / (Xgrid.h * Xgrid.h);
            }
            A[0] = 0;
            C[0] = 1;
            B[0] = 0;
            A[n] = 0;
            C[n] = 1;
            B[n] = 0;
            for (int j = 1; j <= m; j++)
            {
                for (int i = 1; i < n; i++)
                {
                    F[i] = result[i, j - 1] / Tgrid.h + f[i, j];
                }
                F[0] = task.BoundaryConditionLeft(Tgrid.points[j]);
                F[n] = task.BoundaryConditionRight(Tgrid.points[j]);
                TridiagonalMatrixAlgorithm.Solve(A, C, B, F, ref tmpRes, n + 1);
                for (int i = 0; i <= n; i++)
                {
                    result[i, j] = tmpRes[i];
                }
            }
        }
        private void interpolate()
        {
            double h = grid.h;

            for (int i = 0; i <= n; i++)
            {
                splines[i].a = funcValues[i];
                splines[i].x = grid.points[i];
            }
            double[] A = new double[n + 1];
            double[] C = new double[n + 1];
            double[] B = new double[n + 1];
            double[] X = new double[n + 1];
            double[] F = new double[n + 1];
            A[0] = 0;
            C[0] = 1;
            B[0] = 0;
            A[n] = 0;
            C[n] = 1;
            B[n] = 0;
            F[0] = 0;
            F[n] = 0;
            if (cond == 1)
            {
                F[0] = f.secondDerivative(grid.points[0]);
                F[n] = f.secondDerivative(grid.points[n]);
            }
            for (int i = 1; i < n; i++)
            {
                A[i] = h;
                C[i] = 4 * h;
                B[i] = h;
                F[i] = 6 * (funcValues[i + 1] - 2 * funcValues[i] + funcValues[i - 1]) / h;
            }
            TridiagonalMatrixAlgorithm.Solve(A, C, B, F, ref X, n + 1);
            for (int i = 1; i <= n; i++)
            {
                splines[i].c = X[i];
                splines[i].d = (X[i] - X[i - 1]) / h;
                splines[i].b = (funcValues[i] - funcValues[i - 1]) / h + h * (2 * X[i] + X[i - 1]) / 6;
            }

            /*splines[0].d = (splines[0].c - X[0]) / h;
             * splines[0].b = (funcValues[1] - funcValues[0]) / h + h * (2 * splines[0].c + X[0]) / 6;
             * for (int i = 1; i < n; i++)
             * {
             *  splines[i].d = (splines[i].c - splines[i - 1].c) / h;
             *  splines[i].b = (funcValues[i+1] - funcValues[i]) / h + h * (2 * splines[i].c + splines[i-1].c) / 6;
             * }*/
        }