Вычислить методом прогонки область, разделенная на 3 части - C#
Формулировка задачи:
помогите пожалуйста. надо вычислить методом прогонки область, разделенная на 3 части(D0, D1, D2). Заданы лишь граничные условия. В D1 ρ <0, в D2 ρ>0 => D0 ρ=0.
Вычисление коэффициентов в pdf.
Я попытался вычислить D0 чтобы оно стало начальным условием:
но у меня даже это не выходит...
class Program{ const double eta = 0.5; const double l = 1.0; const double T = 1.0; const int n = 20; const int M = 20; const int m = 10; const double h = 0.05; const double tau = 0.05; const double A = 5.0; public static double rho(double t){ return t - eta; } public static double f(double x, double t, double B){ double e = Math.Exp(B*(x+t)); return A*B*e*(rho(t) - B); } public static double m1(double B, double t){ return A * Math.Exp(B*t); } public static double m2(double B, double t){ return A * Math.Exp(B*(l+t)); } public static double U(double x, double t, double B){ return A * Math.Exp(B*(x+t)); } static void Main(string[] args){ double B = double.Parse(Console.ReadLine()); double x, t; double[] alpha = new double[n]; double[] beta = new double[n]; double[] F = new double[n]; double[,] y = new double[n + 1, m + 1]; double[,] z = new double[n + 1, M + 1]; double[,] v = new double[n + 1, M]; double[] a = new double[n]; //над гл.диагональю double[] b = new double[n]; //под гл.диагональю double[] c = new double[n]; //гл.диагональ double[,] d1 = new double[n + 1, M + 1]; //абсолютная погрешность double[,] d2 = new double[n + 1, M + 1]; //относительная погрешность b[0] = 0; c[0] = 1; F[0] = m1(B, m*tau); alpha[0] = b[0] / c[0]; beta[0] = F[0] / c[0]; for (int i = 1; i <= n-1; i++) { x = i * h; alpha[i] = b[i] / (c[i] - (a[i] * alpha[i - 1])); beta[i] = (((h * h) * f(x, m, B)) + (a[i] * beta[i - 1])) / (c[i] - (a[i] * alpha[i - 1])); y[i+1, m] = alpha[i] * y[i - 1, m] + beta[i]; Console.WriteLine(y[i, m]); } //for (int i = 0; i < = n - 1; i++) {} Console.ReadLine(); } }
Решение задачи: «Вычислить методом прогонки область, разделенная на 3 части»
textual
Листинг программы
class Program{ const double eta = 0.5; const double l = 1.0; const double T = 1.0; const int n = 20; const int m = 10; const int M = 20; const double h = 0.05; const double tau = 0.05; const double A = 5.0; public static double rho(double t){ return t - eta; } public static double f(double x, double t, double B){ //double e = ; return A*B*Math.Exp(B*(x+t))*((t-eta) - B); } public static double m1(double B, double t){ return A * Math.Exp(B*t); } public static double m2(double B, double t){ return A * Math.Exp(B*(l+t)); } public static double U(double x, double t, double B){ return A * Math.Exp(B*(x+t)); } static void Main(string[] args){ Double B = double.Parse(Console.ReadLine()); double x,t; double [] v = new double[n+1]; double [,] y = new double[n + 1, m + 1]; double [,] z = new double[n + 1, M + 1]; double [] alpha = new double [n]; double [] beta = new double [n]; double [] a = new double [n+1]; double [] b = new double [n+1]; double [] c = new double [n+1]; double [] F = new double [n+1]; for (int i = 0; i <= n; i++) { x = i * h; a[i] = 1; c[i] = 2; b[i] = 1; F[i] = (h*h)*f(x, eta, B); c[0] = 1; b[0] = 0; F[0] = m1(B, eta); //a[n] = 0; c[n] = 1; F[n] = m2(B, eta); alpha[0] = b[0] / c[0]; beta[0] = F[0] / c[0]; } for (int i = 1; i <= n-1; i++) { alpha[i] = b[i] / (c[i] - (a[i] * alpha[i - 1])); beta[i] = (F[i] + (a[i] * beta[i - 1])) / (c[i] - (a[i] * alpha[i - 1])); } for (int i = 1; i <= n-1; i++ ) { v[0] = alpha[0] * v[i] + beta[0]; v[i] = alpha[i] * v[i + 1] + beta[i]; } for (int i = 0; i <= n; i++) { x = i * h; Console.WriteLine("v[" + i + "] = " + v[i] + " " + U(x, eta, B)); } /*for (int j = m - 1; j >= 0; j--)//D1 { t = j * tau; y[0, j + 1] = m1(t + tau, B); y[n, j + 1] = m2(t + tau, B); Console.WriteLine(j); } for (int j = m + 1; j <= M; j++) { t = j * tau; z[0, j] = m1(t + tau, B); z[n, j] = m2(t + tau, B); Console.WriteLine(j); }*/ Console.ReadLine(); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д