Решить систему диффиренциальных уравнений методом сеток - 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);
        }
    
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.214 из 5
Похожие ответы