Ejemplo n.º 1
0
        public void Compute(bool bDataChanged)
        {
            x0 = (double)InitialData["x0"];
            h  = (double)InitialData["h"];
            n  = (int)InitialData["n"];

            LineSeries ser = new LineSeries();

            ser.Title = this.Name + " Anal";
            LineSeries ser1 = new LineSeries();

            ser1.Title = this.Name + "Rung";
            LineSeries ser2 = new LineSeries();

            ser2.Title = this.Name + "Eul";
            LineSeries ser3 = new LineSeries();

            ser3.Title = this.Name + "EulKosh";
            double exp = 2.71828182845904523536;

            double[] x        = new double[n];
            double[] yanal    = new double[n];
            double[] yrung    = new double[n];
            double[] yeul     = new double[n];
            double[] yeulkosh = new double[n];
            x[0]        = 0;
            yanal[0]    = 1;
            yrung[0]    = 1;
            yeul[0]     = 1;
            yeulkosh[0] = 1;
            ser.Points.Add(new OxyPlot.DataPoint(x[0], yanal[0]));
            ser1.Points.Add(new OxyPlot.DataPoint(x[0], yrung[0]));
            ser2.Points.Add(new OxyPlot.DataPoint(x[0], yeul[0]));
            ser3.Points.Add(new OxyPlot.DataPoint(x[0], yeulkosh[0]));
            for (int i = 1; i < n; i++)
            {
                x[i]        = x0 + i * h;
                yanal[i]    = 2 * Math.Pow(exp, x[i]) - x[i] - 1;
                yeul[i]     = yeul[i - 1] + (yeul[i - 1] + x[i - 1]) * h;
                yeulkosh[i] = yeulkosh[i - 1] + (h / 2) * (x[i - 1] + yeulkosh[i - 1] + x[i] + yeul[i]);
                double yrungprom = yrung[i - 1] + (h / 2) * (yrung[i - 1] + x[i - 1]);
                yrung[i] = yrung[i - 1] + h * (x[i - 1] + h / 2 + yrungprom);
                ser.Points.Add(new OxyPlot.DataPoint(x[i], yanal[i]));
                ser1.Points.Add(new OxyPlot.DataPoint(x[i], yrung[i]));
                ser2.Points.Add(new OxyPlot.DataPoint(x[i], yeul[i]));
                ser3.Points.Add(new OxyPlot.DataPoint(x[i], yeulkosh[i]));
            }

            ListBasePlotSeries plot_ser  = new ListBasePlotSeries("x", "-", "y", "-", ser);
            ListBasePlotSeries plot_ser1 = new ListBasePlotSeries("x", "-", "y", "-", ser1);
            ListBasePlotSeries plot_ser2 = new ListBasePlotSeries("x", "-", "y", "-", ser2);
            ListBasePlotSeries plot_ser3 = new ListBasePlotSeries("x", "-", "y", "-", ser3);

            m_results = new SimplePlotResult();
            m_results.AddSeries(plot_ser);
            m_results.AddSeries(plot_ser1);
            m_results.AddSeries(plot_ser2);
            m_results.AddSeries(plot_ser3);
        }
Ejemplo n.º 2
0
        public void Compute(bool bDataChanged)
        {
            _x0 = (double)InitialData["x0"];
            _x1 = (double)InitialData["x1"];
            _n  = (int)InitialData["n"];

            LineSeries ser = new LineSeries();

            ser.Title = this.Name + " y(x)";

            for (int i = 0; i < _n; i++)
            {
                double x_i = _x0 + i * (_x1 - _x0) / (_n - 1);
                double y_i = Math.Sqrt(x_i) + 0.5 * x_i;

                ser.Points.Add(new OxyPlot.DataPoint(x_i, y_i));
            }

            ListBasePlotSeries plot_ser = new ListBasePlotSeries("x", "-", "y", "-", ser);

            m_results = new SimplePlotResult();
            m_results.AddSeries(plot_ser);
        }
Ejemplo n.º 3
0
        public void Compute(bool bDataChanged)
        {
            t     = (double)InitialData["t"];
            alpha = (double)InitialData["alpha"];
            k     = (int)InitialData["k"];
            n     = (int)InitialData["n"];
            m     = (int)InitialData["m"];
            double     StepX = 1.0 / (k - 1);
            double     StepY = 1.0 / (m - 1);
            double     StepT = 1.0 / (n - 1);
            int        i, j;
            LineSeries ser = new LineSeries();

            double exp = 2.71828182845904523536;

            double[] x = new double[m];
            double[] t = new double[n];
            double[] y = new double[n];
            for (i = 0; i < m; i++)
            {
                x[i] = i * StepX;
                t[i] = i * StepT;
                y[i] = i * StepY;
            }
            for (i = 0; i < m; i++)
            {
                yser[0][i]      = 0;
                yser[m - 1][i]  = 1;
                yser1[0][i]     = 0;
                yser1[m - 1][i] = 1;
                yser2[0][i]     = 0;
                yser2[m - 1][i] = 1;
                yser3[0][i]     = 0;
                yser3[m - 1][i] = 1;
            }
            for (j = 0; j + 1 < n; j++)//явный метод Эйлера
            {
                for (i = 1; i + 1 < m; i++)
                {
                    yser[i][j + 1] = (1 - 2 * d) * yser[i][j] + (d - (c / 2)) * yser[i + 1][j] + (d + (c / 2)) * yser[i - 1][j];
                }
            }
            for (j = n - 2; j > 0; j--)//неявный метод Эйлера
            {
                for (i = 1; i + 1 < m; i++)
                {
                    yser1[i][j] = (-d - (c / 2)) * yser1[i - 1][j + 1] + (d + 1) * yser1[i][j + 1] + (-d + (c / 2)) * yser1[i + 1][j + 1];
                }
            }
            for (j = 0; j + 1 < n; j++)         //метод Кранка-Николсона. В презентации ОШИБКА.
            {
                double[] A     = new double[m]; //Ai*y[i-1][n]+Bi*y[i][n]+Ci*y[i+1][n]=Di; i from 0 to m-1
                double[] B     = new double[m];
                double[] C     = new double[m];
                double[] D     = new double[m];
                double[] alpha = new double[m];
                double[] beta  = new double[m];
                A[0]     = 0;
                C[0]     = 0;
                D[0]     = 0;
                B[0]     = 1;
                A[m - 1] = 0;
                C[m - 1] = 0;
                B[m - 1] = 1;
                D[m - 1] = 0;
                for (i = 1; i < m - 1; i++)
                {
                    D[i] = yser2[i][j] * (1.5 - d) + yser2[i - 1][j] * (d / 2 + c / 4) + yser2[i + 1][j] * (d / 2 - c / 4);
                    A[i] = -d / 2 + c / 4;
                    B[i] = 1 + d / 2 + c / 4;
                    C[i] = -1 - d / 2;
                }//y[i-1]=alpha[i]*y[i]+beta[i]
                alpha[1] = beta[1] = 0;
                for (i = 2; i < m; i++)
                {
                    alpha[i] = -C[i - 1] / (A[i - 1] * alpha[i - 1] + B[i - 1]);
                    beta[i]  = (D[i - 1] - A[i - 1] * beta[i - 1]) / (A[i - 1] * alpha[i - 1] + B[i - 1]);
                }
                for (i = m - 2; i > 0; i--)
                {
                    yser2[i][j + 1] = yser2[i + 1][j + 1] * alpha[i + 1] + beta[i + 1];
                }
            }

            /*
             * double[] A = new double[_n+1];//from 0 to N
             * double[] B = new double [_n+1];
             * double[] C = new double [_n+1];
             * double[] alpha = new double[_n+1];
             * double[] beta = new double[_n+1];
             * double[] Gran = new double[_n+1];
             * double[] T = new double[_n+1];
             * A[0] = 0;
             * C[0] = 0;
             * B[0] = 1;
             * A[_n] = 0;
             * C[_n] = 0;
             * B[_n] = 1;
             * Gran[0] = T1;
             * Gran[_n] = T2;
             * T[0] = T1;
             * T[_n] = T2;
             * for (i = 1; i < _n; i++)
             * {
             *  Gran[i] = 0;
             *  A[i] = ((_n-1) / (R2 - R1)) - 1 / (x[i]);
             *  B[i] = -2 * (_n-1) / (R2 - R1);
             *  C[i] = ((_n-1) / (R2 - R1) )+ 1 / (x[i]);//условия на концах массива- подробнее
             * }
             * alpha[1] = 0;//T[i]=alpha[i+1]*T[i+1]+beta[i+1], то есть i+1 от 0 до _n, определяем альфу начиная с 1го элемента, нулевой элемент массива не используется и не инициализируется, хотя так писать плохо
             * beta[1] = T1;
             * for (i = 1; i < _n; i++)
             * {//условия на концах массива- подробнее
             *  alpha[i + 1] = -C[i] / (A[i] * alpha[i] + B[i]);
             *  beta[i + 1] = (Gran[i]-A[i] * beta[i] )/ (A[i] * alpha[i] + B[i]);
             * }
             *
             * for (i = _n - 1; i > 0; i--)
             * {
             *  T[i] = alpha[i + 1] * T[i + 1] + beta[i + 1];
             * }*/
            for (int i = 1; i < n; i++)
            {
                x[i]        = x0 + i * h;
                yanal[i]    = 2 * Math.Pow(exp, x[i]) - x[i] - 1;
                yeul[i]     = yeul[i - 1] + (yeul[i - 1] + x[i - 1]) * h;
                yeulkosh[i] = yeulkosh[i - 1] + (h / 2) * (x[i - 1] + yeulkosh[i - 1] + x[i] + yeul[i]);
                double yrungprom = yrung[i - 1] + (h / 2) * (yrung[i - 1] + x[i - 1]);
                yrung[i] = yrung[i - 1] + h * (x[i - 1] + h / 2 + yrungprom);
                ser.Points.Add(new OxyPlot.DataPoint(x[i], yanal[i]));
                ser1.Points.Add(new OxyPlot.DataPoint(x[i], yrung[i]));
                ser2.Points.Add(new OxyPlot.DataPoint(x[i], yeul[i]));
                ser3.Points.Add(new OxyPlot.DataPoint(x[i], yeulkosh[i]));
            }

            ListBasePlotSeries plot_ser  = new ListBasePlotSeries("x", "-", "y", "-", ser);
            ListBasePlotSeries plot_ser1 = new ListBasePlotSeries("x", "-", "y", "-", ser1);
            ListBasePlotSeries plot_ser2 = new ListBasePlotSeries("x", "-", "y", "-", ser2);
            ListBasePlotSeries plot_ser3 = new ListBasePlotSeries("x", "-", "y", "-", ser3);

            m_results = new SimplePlotResult();
            m_results.AddSeries(plot_ser);
            m_results.AddSeries(plot_ser1);
            m_results.AddSeries(plot_ser2);
            m_results.AddSeries(plot_ser3);
        }
Ejemplo n.º 4
0
        public void Compute(bool bDataChanged)
        {
            D1    = (double)InitialData["D1"]; //R1
            D2    = (double)InitialData["D2"]; //R2
            Dz    = (double)InitialData["Dz"]; //число узлов
            n     = (int)InitialData["n"];
            L     = (double)InitialData["L"];
            po    = (double)InitialData["po"];
            Gamma = (double)InitialData["Gamma"];
            U     = (double)InitialData["U"];
            Y0    = (double)InitialData["y0"];
            Yn    = (double)InitialData["yn"];
            double a0;

            a0 = Gamma / (U * po);
            int        i;
            LineSeries ser0 = new LineSeries();

            ser0.Title = this.Name + "Anal";
            LineSeries ser1 = new LineSeries();

            ser1.Title = this.Name + "CDS";//здесь и в следующих 2 - аппроксимация диффузного члена
            LineSeries ser2 = new LineSeries();

            ser2.Title = this.Name + "UWS";
            LineSeries ser3 = new LineSeries();

            ser3.Title = this.Name + "QUICK";
            double[] x    = new double [n + 1];
            double[] y0   = new double[n + 1];
            double[] y1   = new double[n + 1];
            double[] y2   = new double[n + 1];
            double[] y3   = new double[n + 1];
            double[] Gran = new double[n + 1];
            double[] A    = new double[n + 1];
            double[] B    = new double[n + 1];
            double[] C    = new double[n + 1];
            double[] D    = new double[n + 1];
            Gran[0] = Gran[n] = B[0] = B[n] = 1;
            A[0]    = A[n] = C[0] = C[n] = 0;
            double[] alpha = new double[n + 1];
            double[] beta  = new double[n + 1];
            double[] S     = new double[n + 1];

            double h  = L / (n);
            double pi = 3.1915926;

            for (i = 0; i < n + 1; i++)
            {
                x[i] = i * h;
                // y0[i] = (a0 - Math.Exp(x[i]/a0))/ (a0 - Math.Exp(L/ a0));неверно!!!
                S[i] = pi * Dz * (D1 + x[i] * (D2 - D1) / L);
            }
            double k = Gamma / (po * U * h);

            //A*коэффициент перед yi-1+*коэффициент перед yi+C*коэффициент перед yi+1 = F; Первое значение - это нулевой коэффт(i=0), второе - это при i от 1 до n-2 и третье при i=n-1
            y1[n] = y2[n] = y3[n] = Yn;
            for (i = 1; i < n; i++)
            {
                Gran[i] = 0;
                A[i]    = S[i + 1] / (2 * h) - S[i] * Gamma / (U * po * h * h) - Gamma * (D2 - D1) * pi * Dz / (U * po * L * 2 * h);
                B[i]    = 2 * S[i] * Gamma / (U * po * h * h);
                C[i]    = -S[i - 1] / (2 * h) - S[i] * Gamma / (U * po * h * h) + Gamma * (D2 - D1) * pi * Dz / (U * po * L * 2 * h); //условия на концах массива- подробнее
            }
            alpha[1] = 0;                                                                                                             //y[i]=alpha[i+1]*y[i+1]+beta[i+1], то есть i+1 от 0 до _n, определяем альфу начиная с 1го элемента, нулевой элемент массива не используется и не инициализируется, хотя так писать плохо
            beta[1]  = Y0;
            for (i = 1; i < n; i++)
            {//условия на концах массива- подробнее
                alpha[i + 1] = -C[i] / (A[i] * alpha[i] + B[i]);
                beta[i + 1]  = (Gran[i] - A[i] * beta[i]) / (A[i] * alpha[i] + B[i]);
            }


            for (i = n - 1; i > 0; i--)
            {
                y1[i] = alpha[i + 1] * y1[i + 1] + beta[i + 1];
            }
            //ТЕПЕРЬ ДЛЯ ВТОРОГО
            for (i = 1; i < n; i++)
            {
                Gran[i] = 0;
                A[i]    = -S[i] * Gamma / (U * po * h * h) - Gamma * (D2 - D1) * pi * Dz / (U * po * L * 2 * h);
                B[i]    = 2 * S[i] * Gamma / (U * po * h * h) + (S[i] / h);
                C[i]    = -S[i - 1] / (h) - S[i] * Gamma / (U * po * h * h) + Gamma * (D2 - D1) * pi * Dz / (U * po * L * 2 * h); //условия на концах массива- подробнее
            }
            alpha[1] = 0;                                                                                                         //y[i]=alpha[i+1]*y[i+1]+beta[i+1], то есть i+1 от 0 до _n, определяем альфу начиная с 1го элемента, нулевой элемент массива не используется и не инициализируется, хотя так писать плохо
            beta[1]  = Y0;
            for (i = 1; i < n; i++)
            {//условия на концах массива- подробнее
                alpha[i + 1] = -C[i] / (A[i] * alpha[i] + B[i]);
                beta[i + 1]  = (Gran[i] - A[i] * beta[i]) / (A[i] * alpha[i] + B[i]);
            }

            for (i = n - 1; i > 0; i--)
            {
                y2[i] = alpha[i + 1] * y1[i + 1] + beta[i + 1];
            }
            //теперь для третьего - производная выражается через u,u-1 и u-2
            for (i = 1; i < n; i++)
            {
                Gran[i] = 0;
                A[i]    = 3 * S[i + 1] / (8 * h) - S[i] * Gamma / (U * po * h * h) - Gamma * (D2 - D1) * pi * Dz / (U * po * L * 2 * h);
                B[i]    = 2 * S[i] * Gamma / (U * po * h * h);
                C[i]    = 6 * S[i - 1] / (8 * h) - S[i + 1] / (2 * h) - S[i] * Gamma / (U * po * h * h) + Gamma * (D2 - D1) * pi * Dz / (U * po * L * 2 * h);
                D[i]    = -S[i - 2] / (8 * h); //условия на концах массива- подробнее
            }
            alpha[1] = 0;                      //y[i]=alpha[i+1]*y[i+1]+beta[i+1], то есть i+1 от 0 до _n, определяем альфу начиная с 1го элемента, нулевой элемент массива не используется и не инициализируется, хотя так писать плохо
            beta[1]  = Y0;
            for (i = 1; i < n; i++)
            {//условия на концах массива- подробнее
                alpha[i + 1] = -C[i] / (A[i] * alpha[i] + B[i]);
                beta[i + 1]  = (Gran[i] - A[i] * beta[i]) / (A[i] * alpha[i] + B[i]);
            }
            for (i = 0; i < n + 1; i++)
            {
                //ser0.Points.Add(new OxyPlot.DataPoint(x[i], S[i]));
                ser1.Points.Add(new OxyPlot.DataPoint(x[i], y1[i]));
                ser2.Points.Add(new OxyPlot.DataPoint(x[i], y2[i]));
                ///ser3.Points.Add(new OxyPlot.DataPoint(x[i], y3[i]));
            }


            ListBasePlotSeries plot_ser  = new ListBasePlotSeries("x", "-", "y", "-", ser0);
            ListBasePlotSeries plot_ser1 = new ListBasePlotSeries("x", "-", "y", "-", ser1);
            ListBasePlotSeries plot_ser2 = new ListBasePlotSeries("x", "-", "y", "-", ser2);
            ListBasePlotSeries plot_ser3 = new ListBasePlotSeries("x", "-", "y", "-", ser3);

            m_results = new SimplePlotResult();
            m_results.AddSeries(plot_ser);
            m_results.AddSeries(plot_ser1);
            m_results.AddSeries(plot_ser2);
            m_results.AddSeries(plot_ser3);
        }
Ejemplo n.º 5
0
        public void Compute(bool bDataChanged)
        {
            U   = (double)InitialData["U"];
            po  = (double)InitialData["po"];
            G   = (double)InitialData["G"];
            tau = (double)InitialData["tau"];
            n   = (int)InitialData["n"];
            m   = (int)InitialData["m"];
            double     StepX = 1.0 / (m - 1);
            double     StepT = tau / (n - 1);
            int        i, j;
            LineSeries ser = new LineSeries();

            ser.Title = this.Name + " Явный метод Эйлера";
            LineSeries ser1 = new LineSeries();

            ser1.Title = this.Name + "Неявный метод Эйлера";
            LineSeries ser2 = new LineSeries();

            ser2.Title = this.Name + "Метод Кранка-Николсона";
            LineSeries ser3 = new LineSeries();

            ser3.Title = this.Name + "Трехточечный неявный метод";
            double[] x = new double[m];
            double[] t = new double[n];
            double[,] yser  = new double[m, n];
            double[,] yser1 = new double[m, n];
            double[,] yser2 = new double[m, n];
            double[,] yser3 = new double[m, n];
            double d = G * StepT / (po * StepX * StepX);
            double c = U * StepT / StepX;

            for (i = 0; i < m; i++)
            {
                x[i] = i * StepX;

                yser[i, 0]  = 0;
                yser1[i, 0] = 0;
                yser2[i, 0] = 0;
                yser3[i, 0] = 0;
            }
            for (i = 0; i < n; i++)
            {
                t[i]            = i * StepT;
                yser[0, i]      = 0;
                yser[m - 1, i]  = 1;
                yser1[0, i]     = 0;
                yser1[m - 1, i] = 1;
                yser2[0, i]     = 0;
                yser2[m - 1, i] = 1;
                yser3[0, i]     = 0;
                yser3[m - 1, i] = 1;
            }
            for (j = 0; j + 1 < n; j++)//явный метод Эйлера
            {
                for (i = 1; i < m - 1; i++)
                {
                    if (i == m - 2)
                    {
                        yser[i + 1, j + 1] = (1 - 2 * d) * yser[i + 1, j] + (d + (c / 2)) * yser[i, j];//??
                    }
                    else
                    {
                        yser[i + 1, j + 1] = (1 - 2 * d) * yser[i + 1, j] + (d - (c / 2)) * yser[i + 2, j] + (d + (c / 2)) * yser[i, j];
                    }
                }
            }

            for (j = n - 2; j > 0; j--)//неявный метод Эйлера
            {
                for (i = 1; i + 1 < m; i++)
                {
                    yser1[i, j] = (-d - (c / 2)) * yser1[i - 1, j + 1] + (d + 1) * yser1[i, j + 1] + (-d + (c / 2)) * yser1[i + 1, j + 1];
                }
            }

            for (j = 0; j + 1 < n; j++)         //метод Кранка-Николсона. В презентации ОШИБКА.
            {
                double[] A     = new double[m]; //Ai*y[i-1][n]+Bi*y[i][n]+Ci*y[i+1][n]=Di; i from 0 to m-1
                double[] B     = new double[m];
                double[] C     = new double[m];
                double[] D     = new double[m];
                double[] alpha = new double[m];
                double[] beta  = new double[m];
                A[0]     = 0;
                C[0]     = 0;
                D[0]     = 0;
                B[0]     = 1;
                A[m - 1] = 0;
                C[m - 1] = 0;
                B[m - 1] = 1;
                D[m - 1] = 0;
                for (i = 1; i < m - 1; i++)
                {
                    D[i] = yser2[i, j] * (1.5 - d) + yser2[i - 1, j] * (d / 2 + c / 4) + yser2[i + 1, j] * (d / 2 - c / 4);
                    A[i] = -d / 2 + c / 4;
                    B[i] = 1 + d / 2 + c / 4;
                    C[i] = -1 - d / 2;
                }//y[i-1]=alpha[i]*y[i]+beta[i]
                alpha[1] = beta[1] = 0;
                for (i = 2; i < m; i++)
                {
                    alpha[i] = -C[i - 1] / (A[i - 1] * alpha[i - 1] + B[i - 1]);
                    beta[i]  = (D[i - 1] - A[i - 1] * beta[i - 1]) / (A[i - 1] * alpha[i - 1] + B[i - 1]);
                }
                for (i = m - 2; i > 0; i--)
                {
                    yser2[i, j + 1] = yser2[i + 1, j + 1] * alpha[i + 1] + beta[i + 1];
                }
                //память можно не удалять!!!
            }

            /*
             * double[] alpha2 = new double[3];
             *  double beta2;
             *  alpha2[0] = 1 / (2 * StepT * (c / 2 - d));
             *  alpha2[1] = 2 / (StepT * (c / 2 - d));
             *  alpha2[2] = ((-3) / (2 * StepT) - 2 * d) / (c / 2 - d);
             *  beta2 = (d + c / 2) / (c / 2 - d);
             *  double[] Phi = new double [n-1];//n-1 член массива: от координаты по временной оси,равной 1, до равной n-1
             *  Phi =  Phi1Coef(m - 1, alpha2, beta2,n);//фи[m-1] должно быть равно вектору из единиц. Функция Phi1Coef(m-1,alpha2,beta2) - это то, во сколько раз каждый элемент m-1 - го вектора больше, чем соотв.элемент 1-го вектора
             *  for(i=0;i<n-1;i++)
             *  {
             *      Phi[i] = 1 / Phi[i]; //так как фи[m-1]=1, то ищем фи[1], теперь у нас есть фи[1]
             *  }
             *  for(j=1;j<n-1;j++)
             *  {
             *      yser3[1,j] = Phi[j - 1];
             *  }
             *  for(i=2;i<m-1;i++)
             *  {
             *      Phi = Phi1Coef(i, alpha2, beta2,n);
             *      yser3[i,j + 1] = yser1[i,j + 1] * Phi[i];
             *  }*/
            //алгоритм для y[3] следующий - представляем пространственные координаты как вектор(состоящий из n-1 компонент) и вектор этих координат для i+1 ячейки равен альфа*вектор координат для iтой ячейки + бета*вектор координат для i-1той ячейки, далее можно рекурсивно задать функцию
            for (i = 0; i < m; i++)
            {
                ser.Points.Add(new OxyPlot.DataPoint(x[i], yser[i, n - 1]));
                ser1.Points.Add(new OxyPlot.DataPoint(x[i], yser1[i, n - 1]));
                ser2.Points.Add(new OxyPlot.DataPoint(x[i], yser2[i, n - 1]));
                //ser3.Points.Add(new OxyPlot.DataPoint(x[i], yser3[i,n - 1]));
            }


            ListBasePlotSeries plot_ser  = new ListBasePlotSeries("x", "-", "y", "-", ser);
            ListBasePlotSeries plot_ser1 = new ListBasePlotSeries("x", "-", "y", "-", ser1);
            ListBasePlotSeries plot_ser2 = new ListBasePlotSeries("x", "-", "y", "-", ser2);
            ListBasePlotSeries plot_ser3 = new ListBasePlotSeries("x", "-", "y", "-", ser3);

            m_results = new SimplePlotResult();
            m_results.AddSeries(plot_ser);
            m_results.AddSeries(plot_ser1);
            m_results.AddSeries(plot_ser2);
            m_results.AddSeries(plot_ser3);
        }
Ejemplo n.º 6
0
        public void Compute(bool bDataChanged)
        {
            m  = (int)InitialData["m"];
            n  = (int)InitialData["n"];
            x0 = (double)InitialData["x0"];
            X  = (double)InitialData["X"];
            if (m < 0)
            {
                m = 0;
            }

            LineSeries ser = new LineSeries();

            ser.Title = "Taylor";
            LineSeries ser1 = new LineSeries();

            ser1.Title = "Exp";
            double j;
            double exp = 2.71828182845904523536;

            double[] a   = new double[9];
            double   one = 1;

            a[0] = one;
            a[1] = one / 2;
            a[2] = one / 6;
            a[3] = one / 24;
            a[4] = one / 120;
            a[5] = one / 720;
            a[6] = one / 5040;
            a[7] = one / 40320;
            a[8] = one / 362880;

            for (int i = 0; i < n; i++)
            {
                double x = x0 + i * (X - x0) / (n - 1);
                double y = 0;
                for (j = 0.5; j <= (double)m / 2; j += 0.5)
                {
                    if (j >= 5)
                    {
                        break;
                    }
                    y += a[(int)(2 * j - 1)] * Math.Pow(x, j);
                }
                ser.Points.Add(new OxyPlot.DataPoint(x, y));
                double z = Math.Pow(x, 0.5);
                ser1.Points.Add(new OxyPlot.DataPoint(x, (Math.Pow(exp, z) - 1)));
            }

            ListBasePlotSeries plot_ser  = new ListBasePlotSeries("x", "-", "y", "-", ser);
            ListBasePlotSeries plot_ser1 = new ListBasePlotSeries("x", "-", "y", "-", ser1);

            /* LineSeries ser1 = new LineSeries();
             *
             * ser1.Title = "Exp";
             *
             * for (int i = 0; i < 100; i++)
             * {
             *   double x = 0.01 * i;
             *   ser1.Points.Add(new OxyPlot.DataPoint(x, Math.Pow(exp, x)));
             * }
             *
             * ListBasePlotSeries plot_ser1 = new ListBasePlotSeries("x", "-", "y", "-", ser1);*/

            m_results = new SimplePlotResult();
            //m1_results = new SimplePlotResult();
            //m1_results.AddSeries(plot_ser1);
            m_results.AddSeries(plot_ser);
            m_results.AddSeries(plot_ser1);
        }
Ejemplo n.º 7
0
        public void Compute(bool bDataChanged)
        {
            Phi0  = (double)InitialData["Phi0"];
            Phi1  = (double)InitialData["Phi1"];
            n     = (int)InitialData["n"];
            L     = (double)InitialData["L"];
            po    = (double)InitialData["po"];
            Gamma = (double)InitialData["Gamma"];
            U     = (double)InitialData["U"];
            double     Pe = po * U * L / Gamma;
            int        i;
            LineSeries ser0 = new LineSeries();

            ser0.Title = this.Name + "Anal";
            LineSeries ser1 = new LineSeries();

            ser1.Title = this.Name + "CDS";//здесь и в следующих 2 - аппроксимация диффузного члена
            LineSeries ser2 = new LineSeries();

            ser2.Title = this.Name + "UDS";
            LineSeries ser3 = new LineSeries();

            ser3.Title = this.Name + "CDSalt";
            LineSeries ser4 = new LineSeries();

            ser4.Title = this.Name + "UDSalt";
            double[] x  = new double [n + 1];
            double[] y0 = new double[n + 1];
            double[] y1 = new double[n + 1];
            double[] y2 = new double[n + 1];
            double[] y3 = new double[n + 1];
            double   h  = L / (n);

            for (i = 0; i < n + 1; i++)
            {
                x[i]  = i * L / (n);
                y0[i] = Phi0 + ((Math.Exp(x[i] * Pe / L) - 1) / (Math.Exp(Pe) - 1)) * (Phi1 - Phi0);
            }

            //A*коэффициент перед yi-1+*коэффициент перед yi+C*коэффициент перед yi+1 = F; Первое значение - это нулевой коэффт(i=0), второе - это при i от 1 до n-2 и третье при i=n-1
            Coef   Y1   = new Coef();
            double adif = -2 * Gamma / (2 * h * h);
            double cdif = -2 * Gamma / (2 * h * h);
            double bdif = (adif + cdif) * (-1);
            double aUDS = (Math.Max(po * U, 0)) / h;//2h
            double cUDS = (Math.Min(po * U, 0)) / h;
            double bUDS = (aUDS + cUDS) * (-1);
            double aCDS = -po * U / (2 * h);
            double cCDS = po * U / (2 * h);
            double bCDS = 0;
            double a    = aCDS + adif;
            double b    = bCDS + bdif;
            double c    = cCDS + cdif;

            double[] A0 = new double[] { 0, a, 0 };
            double[] B0 = new double[] { 1, b, 1 };
            double[] C0 = new double[] { 0, c, 0 };
            double[] F0 = new double[] { Phi0, 0, Phi1 };
            Y1.init(A0, B0, C0, F0);
            y1 = Solve(Y1, n, Phi0, Phi1);
            Coef Y2 = new Coef();

            a = adif - aUDS;
            b = bdif - bUDS;
            c = cdif - cUDS;
            double[] A = new double[] { 0, a, 0 };
            double[] B = new double[] { 1, b, 1 };
            double[] C = new double[] { 0, c, 0 };
            double[] F = new double[] { 0, 0, 1 };
            Y2.init(A, B, C, F);
            y2 = Solve(Y2, n, Phi0, Phi1);

            for (i = 0; i <= n; i++)
            {
                ser0.Points.Add(new OxyPlot.DataPoint(x[i], y0[i]));
                ser1.Points.Add(new OxyPlot.DataPoint(x[i], y1[i]));
                ser2.Points.Add(new OxyPlot.DataPoint(x[i], y2[i]));
            }

            ListBasePlotSeries plot_ser  = new ListBasePlotSeries("x", "-", "y", "-", ser0);
            ListBasePlotSeries plot_ser1 = new ListBasePlotSeries("x", "-", "y", "-", ser1);
            ListBasePlotSeries plot_ser2 = new ListBasePlotSeries("x", "-", "y", "-", ser2);


            m_results = new SimplePlotResult();
            m_results.AddSeries(plot_ser);
            m_results.AddSeries(plot_ser1);
            m_results.AddSeries(plot_ser2);
        }
Ejemplo n.º 8
0
        public void Compute(bool bDataChanged)
        {
            R1 = (double)InitialData["x0"]; //R1
            R2 = (double)InitialData["x1"]; //R2
            _n = (int)InitialData["n"];     //число узлов
            T1 = (double)InitialData["T1"];
            T2 = (double)InitialData["T2"];
            int        i;
            LineSeries ser = new LineSeries();

            ser.Title = this.Name + "Chisl";
            LineSeries ser1 = new LineSeries();

            ser1.Title = this.Name + "Anal";
            double[] x = new double [_n + 1];

            for (i = 0; i < _n + 1; i++)
            {
                x[i] = R1 + i * (R2 - R1) / (_n);
            }

            double[] A     = new double[_n + 1];//from 0 to N
            double[] B     = new double [_n + 1];
            double[] C     = new double [_n + 1];
            double[] alpha = new double[_n + 1];
            double[] beta  = new double[_n + 1];
            double[] Gran  = new double[_n + 1];
            double[] T     = new double[_n + 1];
            A[0]     = 0;
            C[0]     = 0;
            B[0]     = 1;
            A[_n]    = 0;
            C[_n]    = 0;
            B[_n]    = 1;
            Gran[0]  = T1;
            Gran[_n] = T2;
            T[0]     = T1;
            T[_n]    = T2;
            for (i = 1; i < _n; i++)
            {
                Gran[i] = 0;
                A[i]    = ((_n - 1) / (R2 - R1)) - 1 / (x[i]);
                B[i]    = -2 * (_n - 1) / (R2 - R1);
                C[i]    = ((_n - 1) / (R2 - R1)) + 1 / (x[i]); //условия на концах массива- подробнее
            }
            alpha[1] = 0;                                      //T[i]=alpha[i+1]*T[i+1]+beta[i+1], то есть i+1 от 0 до _n, определяем альфу начиная с 1го элемента, нулевой элемент массива не используется и не инициализируется, хотя так писать плохо
            beta[1]  = T1;
            for (i = 1; i < _n; i++)
            {//условия на концах массива- подробнее
                alpha[i + 1] = -C[i] / (A[i] * alpha[i] + B[i]);
                beta[i + 1]  = (Gran[i] - A[i] * beta[i]) / (A[i] * alpha[i] + B[i]);
            }

            /* for (i =1;i<_n;i++)
             * {
             *   T[i] = (Gran[i] - A[i] * beta[i]) / (C[i] + A[i] * alpha[i]);
             * }*/
            for (i = _n - 1; i > 0; i--)
            {
                T[i] = alpha[i + 1] * T[i + 1] + beta[i + 1];
            }
            T[0]  = T1;
            T[_n] = T2;
            for (i = 0; i < _n + 1; i++)
            {
                ser.Points.Add(new OxyPlot.DataPoint(x[i], T[i]));
            }
            for (i = 0; i < 500; i++)
            {
                double x1 = R1 + i * (R2 - R1) / 499;
                double y1 = (1 / (R2 - R1)) * (T2 * R2 * (1 - (R1 / x1)) - T1 * R1 * (1 - (R2 / x1)));
                ser1.Points.Add(new OxyPlot.DataPoint(x1, y1));
            }

            ListBasePlotSeries plot_ser  = new ListBasePlotSeries("x", "-", "y", "-", ser);
            ListBasePlotSeries plot_ser1 = new ListBasePlotSeries("x", "-", "y", "-", ser1);

            m_results = new SimplePlotResult();
            m_results.AddSeries(plot_ser);
            m_results.AddSeries(plot_ser1);
        }