Exemple #1
0
        private double[] FullMatrix(double t, double[] y, double[] yK, double[] f)
        {
            var jacobian = new double[N + 1, N + 1];                 // f'(Xn)

            jacobian[0, 0] = jacobian[N, N] = 1;
            for (int n = 1; n < N; n++)
            {
                double l = equation.dK_du(x[n], t, y[n]) * (yK[n - 1] - yK[n + 1]) / (2 * h * h);
                double r = equation.K(x[n], t, y[n]) / (h * h);
                jacobian[n, n - 1] = l + r;
                jacobian[n, n + 1] = -l + r;
                jacobian[n, n]     = -2 * r - 1 / tau;
                f[n] *= betaCalculator.Multiplier;
            }
            f[0] *= betaCalculator.Multiplier;
            f[N] *= betaCalculator.Multiplier;
            return(ResolvingSystem.Gauss(jacobian, f));
        }
Exemple #2
0
        private double[] MakeAndSolveSystem(double t, double[] y, double[] yK, double[] f)
        {
            var a = new double[N + 1];
            var c = new double[N + 1];
            var b = new double[N + 1];

            c[0] = c[N] = 1;

            for (int n = 1; n < N; n++)
            {
                double l = equation.dK_du(x[n], t, y[n]) * (yK[n - 1] - yK[n + 1]) / (2 * h * h);
                double r = equation.K(x[n], t, y[n]) / (h * h);
                a[n - 1] = l + r;                       // or a[n],b[n]?
                b[n - 1] = -l + r;
                c[n]     = -2 * r - 1 / tau;
                f[n]    *= betaCalculator.Multiplier;
            }
            f[0] *= betaCalculator.Multiplier;
            f[N] *= betaCalculator.Multiplier;

            return(ResolvingSystem.TridiagonalMatrixAlgorithm(a, c, b, f));
        }
Exemple #3
0
        private double[] ReqularizedMethod(double t, double[] y, double[] yK, double[] f)
        {
            double alphaBetaNorm = settings.Alpha * betaCalculator.Beta * Norm;
            var    jacobian      = new double[N + 1, N + 1];         // f'(Xn)

            jacobian[0, 0] = jacobian[N, N] = 1;
            for (int n = 1; n < N; n++)
            {
                double l = equation.dK_du(x[n], t, y[n]) * (yK[n - 1] - yK[n + 1]) / (2 * h * h);
                double r = equation.K(x[n], t, y[n]) / (h * h);
                jacobian[n, n - 1] = l + r;
                jacobian[n, n + 1] = -l + r;
                jacobian[n, n]     = -2 * r - 1 / tau;
            }

            var a = jacobian.Transpose();

            a = a.AddDiag(alphaBetaNorm);
            var matrix      = a.Multiply(jacobian).AddDiag(alphaBetaNorm);
            var freeMembers = a.Multiply(f).MultiplyConst(betaCalculator.Multiplier);

            return(ResolvingSystem.Gauss(matrix, freeMembers));
        }