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