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