//du/dt = d2u/d2s + f(t,s); du/dt = 0; public static Vector SolveSliceTask1(Vector u_old, Vector f, Vector p, double nu, double h, double tau, double aa, int iter_t) { int n = u_old.Length; Vector u_mid = new Vector(n); Vector u_up = new Vector(n); Vector u_down = new Vector(n); Vector F = new Vector(n); double left = -aa * tau / (h * h); double right = -aa * tau / (h * h); double middle = 1d + 2d * aa * tau / (h * h); for (int i = 1; i < n - 1; i++) { F[i] = tau * f[i] + u_old[i]; u_mid[i] = middle; u_up[i] = left; u_down[i] = right; } u_down[0] = 0; u_mid[0] = 1d + (h * h) / (aa * 2d * tau); //y[0] u_up[0] = -1d; //y[1] F[0] = (f[0] + u_old[0] / tau) * (h * h) / 2d * aa; u_down[n - 1] = -1d; //y[N - 1] u_mid[n - 1] = 1d + (h * h) / (aa * 2d * tau) + h * nu; //y[N] u_up[n - 1] = 0; double gamma_t = nu * p[iter_t]; F[n - 1] = (f[n - 1] + u_old[n - 1] / tau) * (h * h) / (2d * aa) + gamma_t * h; Vector u = MyMath.TridiagonalMatrixAlgorithm(u_down, u_mid, u_up, F); return(u); }
// du/dt = -aa*d2u/d2s public static Vector SolveSliceTask2(Vector u_old, double nu, double h, double tau, double aa) { int n = u_old.Length; Vector u_mid = new Vector(n); Vector u_up = new Vector(n); Vector u_down = new Vector(n); double left = -aa * tau / (h * h); double right = -aa * tau / (h * h); double middle = 1d + 2d * aa * tau / (h * h); for (int i = 1; i < n - 1; i++) { u_mid[i] = middle; u_up[i] = left; u_down[i] = right; } u_down[0] = 0; u_mid[0] = -(1d - h * h / (2d * aa * tau)); //y[0] u_up[0] = 1d; // y[1] u_old[0] = u_old[0] * (h * h / (2d * aa * tau)); u_down[n - 1] = 1d; //y[N-1] u_mid[n - 1] = -1d - nu * h + (h * h) / (2d * aa * tau); //y[N] u_up[n - 1] = 0; u_old[n - 1] = u_old[n - 1] * (h * h) / (2d * aa * tau); Vector u = MyMath.TridiagonalMatrixAlgorithm(u_down, u_mid, u_up, u_old); return(u); }