Вычислить методом прогонки область, разделенная на 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();
}
}