示例#1
0
        //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);
        }
示例#2
0
        // 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);
        }