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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }