예제 #1
0
 static double KHIplus12(double x, SchemaDataMethod data)
 {
     return(2 * Kx(x, data) * Kx(x + data.h, data) / (Kx(x, data) + Kx(x + data.h, data)));;
 }
예제 #2
0
        static public SchemaDataMethod coumputeResult(SchemaDataMethod data)
        {
            double h = 1e-3;

            data.h = h;
            List <double> An   = new List <double>();
            List <double> Bn   = new List <double>();
            List <double> Cn   = new List <double>();
            List <double> Dn   = new List <double>();
            List <double> KSIn = new List <double>();
            List <double> ETAn = new List <double>();

            double xBegin = 0;

            double KHI12 = KHIplus12(xBegin, data);

            //Левые краевые
            double p0  = P(xBegin, data);
            double p1  = P(xBegin + h, data);
            double p12 = (p0 + p1) / 2;

            double f0  = F(xBegin, data);
            double f1  = F(xBegin + data.h, data);
            double f12 = (f0 + f1) / 2;

            double K0 = KHI12 + h * h * p12 / 8 + h * h * p0 / 4;
            double M0 = -KHI12 + h * h * p12 / 8;
            double P0 = h * data.F0 + h * h * (f12 + f0) / 4;

            // Правые краевые
            KHI12 = KHIminus12(data.L, data);

            double pn   = P(data.L, data);
            double pn1  = P(data.L - h, data);
            double pn12 = (pn + pn1) / 2;

            double fn   = F(data.L, data);
            double fn1  = F(data.L - data.h, data);
            double fn12 = (fn + fn1) / 2;

            double Kn = -KHI12 - data.alphaN * h - h * h * pn12 / 8 - h * h * pn / 4;
            double Mn = KHI12 - h * h * p12 / 8;
            double Pn = -data.alphaN * data.t0 * h - h * h * (fn12 + fn) / 4;

            // Коэффициенты

            for (double x = xBegin; x < data.L; x += h)
            {
                double A = KHIplus12(x, data) / h;
                double C = KHIminus12(x, data) / h;
                double B = A + C + P(x, data) * h;
                double D = F(x, data) * h;

                An.Add(A);
                Cn.Add(C);
                Bn.Add(B);
                Dn.Add(D);
            }

            double KSI = -M0 / K0;
            double ETA = P0 / K0;

            KSIn.Add(KSI);
            ETAn.Add(ETA);
            // may be from 1
            for (int i = 1; i < An.Count() - 1; i++)
            {
                double KSI1 = Cn[i] / (Bn[i] - An[i] * KSI);
                double ETA1 = (Dn[i] + An[i] * ETA) / (Bn[i] - An[i] * KSI);
                KSIn.Add(KSI1);
                ETAn.Add(ETA1);
                KSI = KSI1;
                ETA = ETA1;
            }

            // Обратный ход

            double yn = (Pn - Mn * ETA) / (Kn + Mn * KSI);

            data.list1.Add(data.L, yn);
            double j = 1;

            for (int i = An.Count() - 2; i >= 0; i--)
            {
                yn = KSIn[i] * yn + ETAn[i];
                data.list1.Add(xBegin + i * h, yn);
                j++;
            }
            data.list1.Sort();


            return(data);
        }
예제 #3
0
 static double F(double x, SchemaDataMethod data)
 {
     return(2 * data.t0 * Alphax(x, data) / data.R);
 }