Решить систему диффиренциальных уравнений методом сеток - C#
Формулировка задачи:
Доброго времени суток! Помогите перевести код с Pascal в C#. Не обязательно весь) Мне главное понять концепцию такого перевода и используемые инструменты!
Program Kanal;
Const
R0=2.0E-3;
H=0.2
T=0.001;
hi=0.3;
Q1=8.0;
Q2=8.0;
J12=0.1;
J21=0.1;
k1=0.07;
Gamma=0.1;
Fi1_0=0.25;
Fi2_N=0.25;
N=100;
Ct=0.5;
Type
Mass=Array[0..N] of Real;
Var
Fi1, Fi2,R : Mass;
dx,dt,time : Real;
j : Integer;
Function k(x:Real):Real;
Begin
k:=k1;
End;
Function Diff(Fi:Real):Real;
Begin
Diff:=(Fi-1)/Fi;
End;
Procedure Progon(Number:Integer; Var Fi,R,W,R_part:Mass);
Var
j: Integer;
d,aj,bj,cj,znam: Real;
Alfa, Beta : Mass;
Begin
If Number=1
Then Begin
Alfa[1]:=0;
End
Else Begin
Alfa[1]:=1;
End;
d:=2*dt/Sqr(dx);
For j:=1 To N-1 Do
Begin
aj:=d*W[j-1];
bj:=d*W[j];
cj:=aj+bj;
znam:=cj-aj;
Alfa[j+1]:=bj/znam;
Beta[j+1]:=R_part[j]+aj;
End;
End;
Begin {Program}
dx:=H/N;
dt:=Ct*Sqr(dx);
Time:=0;
For j:=0 To N Do
Begin
Fi1[j]:=1.0E-3; Fi2[j]:=1.0E-3; R[j]:=R0;
End;
Fi1[0]:=Fi1_0;
Fi2[N]:=Fi2_N;
End;
End.Решение задачи: «Решить систему диффиренциальных уравнений методом сеток»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static double k1 = 0.07;
static int N = 100;
static double dx = 0;
static double dt = 0;
static double Q1 = 8.0;
static double T = 0.001;
static double hi = 0.3;
static double Q2 = 8.0;
static double J12 = 0.1;
static double J21 = 0.1;
static double Gamma = 0.1;
static double Diff(double Fi)
{
return (Fi - 1) / Fi;
}
static double k(double x)
{
return k1;
}
static void Progon(int Number, double[] Fi, double[] R, double[] W, double[] R_part)
{
int j;
double d = 0, aj, bj, cj, znam;
double[] Alfa = new double[N];
double[] Beta = new double[N];
if (Number == 1)
{
Alfa[1] = 0;
}
else
{
Alfa[1] = 1;
}
d =2*dt/Math.Sqrt(dx);
for (j = 1; j <= N - 1; j++)
{
aj = d * W[j - 1];
bj = d * W[j];
cj = aj + bj;
znam = cj - aj;
Alfa[j+1] =bj/znam;
Beta[j+1] =R_part[j]+aj;
}
}
static void Step_time(double[] Fi1, double[] Fi2, double[] R)
{
int j;
double[] W = new double[Program.N];
double[] R_part = new double[Program.N];
for (j = 0; j <= Program.N; j++)
{
W[j] = Math.Sqrt(R[j]) * Diff(Fi1[j]) * Program.Q1;
R_part[j] = Fi1[j] * Math.Sqrt(R[j]) - 2 * dt * Program.Gamma * R[j] - dt * Program.J12 * Math.Sqrt(R[j]) * Fi2[j];
}
Progon(1, Fi1, R, W, R_part);
for (j = 0; j <= Program.N; j++)
{
W[j] = Diff(Fi2[j]) * Program.Q2;
R_part[j] = Fi2[j] - Program.J21 * Fi1[j];
}
Progon(2, Fi2, R, W, R_part);
for (j = 0; j <= Program.N; j++)
R[j] = R[j] + dt * k(j * dt) * Fi1[j];
}
static void Main(string[] args)
{
#region values
const double R0 = 2.0E-3;
const double H = 0.2;
const double Fi1_0 = 0.25;
const double Fi2_N = 0.25;
const double Ct = 0.5;
double[] Fi1 = new double[Program.N];
double[] Fi2 = new double[Program.N];
double[] R = new double[Program.N];
//double Time = 0;
//int j;
#endregion
//dx = H / Program.N;
//dt = Ct * Math.Sqrt(dx);
//for (j = 0; j <= Program.N; j++)
//{
// Fi1[j] = 1.0E-3; Fi2[j] = 1.0E-3; R[j] = R0;
//}
//Fi1[0] = Fi1_0;
//Fi2[N] = Fi2_N;
dx = H / N;
dt = Ct * Math.Sqrt(dx);
double Time = 0;
for (int j = 0; j <= Program.N; j++)
{
Fi1[j] = 1.0E-3; Fi2[j] = 1.0E-3; R[j] = R0;
}
Fi1[0] = Fi1_0;
Fi2[N] = Fi2_N;
while (Time < T)
{
Time = Time + dt;
Step_time(Fi1, Fi2, R);
}
Console.WriteLine(" time= {0}", Time);
}
}
}