Решить систему диффиренциальных уравнений методом сеток - 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); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д