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; * }*/ }