using System.Collections.Generic;
using System.Threading.Tasks;
public const double A_const = 0.5 + 0.1 * 7;
public const double L = 1;
public const double N = 10, M = 10;
public const double T = 1;
public const double H = 1 / N;
public const double Tau = T / M;
public static double S_func => (Tau * Tau) / (H * H);
public static double A_func(double x) => 1 / (1 + x);
public static double A_func_2diff(double x) => 2 / Math.Pow(1 + x, 3);
public static double B_func(double x) => -A_const / Math.Pow(1 + x, 2);
public static double Y0_func(double t) => 1 / (A_const * t + 1);
public static double Y1_func(double t) => 1 / (A_const * t + 2);
public static double F_func(double x, double t) => 2 * (A_const * A_const- 1) / Math.Pow(x + A_const * t + 1, 3);
public static double Get_x(double i) => H * i;
public static double Get_t(double i) => Tau * i;
public static void PrintMassive(double[,] mass, double[] t, double[] x)
Console.WriteLine(" t - ");
for (int i = 0; i <= mass.GetUpperBound(0); i++)
Console.Write("| {0,3:0.0} |",t[t.Length-1-i]);
for (int j = 0; j <= mass.GetUpperBound(1); j++)
Console.Write(" {0,5:0.000}", mass[i, j]);
Console.Write(" x -> |");
for (int i = 0; i < x.Length; i++)
Console.Write(" {0,3:0.0} |", x[i]);
static void Main(string[] args)
double[] x = new double[(int)N + 1];
double[] t = new double[(int)N + 1];
double[,] y = new double[(int)N + 1, (int)M + 1];
for (int i = 0; i <= M; i++)
y[i, 1] = A_func(x[i]) + Tau * B_func(x[i]) + ((Tau * Tau) / 2) * (A_func_2diff(x[i]) + F_func(x[i], 0));
y[0, i] = Y0_func(Get_t(i));
y[(int)N, i] = Y1_func(t[i]);
for (int j = 1; j < N; j++)
for (int i= 1; i < M; i++)
y[i, j + 1] = S_func * y[i + 1, j] + 2 * (1 - S_func) * y[i, j] + S_func * y[i - 1, j] - y[i, j - 1] + Tau * Tau * F_func(Get_x(i), Get_t(j));
public static double[,] Transpose(double[,] m)
int N = m.GetUpperBound(0);
int M = m.GetUpperBound(1);
double[,] t = new double[M + 1, N + 1];
for (int i = 0; i <= N; i++)
for (int j = 0; j <= M; j++)