C# 如何通过龙格库塔4传递硬编码微分方程

C# 如何通过龙格库塔4传递硬编码微分方程,c#,numerical-analysis,C#,Numerical Analysis,例如,我试图实现Runge Kutta C#中的dy/dt=y-t^2+1和dy/dt=t*y+t^3,我似乎无法得到我期望的输出。我把我的程序分为几个班,试着单独看一下。我认为我的主要错误是试图使用委托将一个方法作为变量传递给Runge-Kutta过程 方程类: namespace RK4 { public class Eqn { double t; double y; double dt; double b;

例如,我试图实现Runge Kutta C#中的dy/dt=y-t^2+1和dy/dt=t*y+t^3,我似乎无法得到我期望的输出。我把我的程序分为几个班,试着单独看一下。我认为我的主要错误是试图使用委托将一个方法作为变量传递给Runge-Kutta过程

方程类:

namespace RK4
{
    public class Eqn
    {
        double t;
        double y;
        double dt;
        double b;
        public Eqn(double t, double y, double dt, double b)
        {
            this.t = t;
            this.y = y;
            this.dt = dt;
            this.b = b;
        }
        public void Run1()
        {
            double temp;
            int step = 1;
            RK4 n = new RK4();
            while (t < b)
                    {
                        temp = n.Runge(t, y, dt, FN1);
                        y = temp;
                        Console.WriteLine("At step number {0}, t: {1}, y: {2}", step, t, y);
                        t = t + dt;
                        step++;
                    }
        }
        public void Run2()
        {
            int step = 1;
            RK4 m = new RK4();
            while (t < b)
            {
                y = m.Runge(t, y, dt, FN2);
                Console.WriteLine("At step number {0}, t: {1}, y: {2}", step, t, y);
                t = t + dt;
                step++;
            }
        }
        public static double FN1(double t, double y)
        {
            double x = y - Math.Pow(t, 2) + 1;
            return x;
        }
        public static double FN2(double t, double y)
        {
            double x = t * y + Math.Pow(t, 3);
            return x;
        }
    }
}

无论如何,这不是一个优雅的编程,但我没有工作知识来知道我在这一点上做错了什么。从我所读到的内容来看,我认为RK4类中的委托将能够通过我的硬编码差分等式。

您在RK4实现中犯了一个经典错误:有两个变量来定位与
dt的乘法,您可以选择,您同时使用了这两个变量

要么是

k2 = dt*f(t+0.5*dt, y+0.5*k1)


与算法的其他行类似。

您得到的是哪一个输出?具体点。尝试将问题缩小到一条得到错误值的直线上。使用区间[0,1]和步长0.02以及初始条件y(0)=2:在第1步使用方程y'=y-t^2+1,在第2步使用t:0,y:2,在第3步使用t:0.02,y:2,t:0.04,y:2等。在步骤2,y应该更新,这意味着我的错误在Eqn类中的while循环中。我希望每次通过while循环时都能更改y。进行逐步调试,将断点放在
while
,继续按
F11
,然后在“局部变量”窗口中亲自查看错误。我无法在您的代码中发现问题。代理部分应该工作。可能是公式中的一个错误。谢谢你,我发现了,你对像我这样的编程新手很有帮助。结果是我的循环结构出现了错误。我放入一个临时变量,该变量将保存RK4类的输出,并将其添加到每个循环的y值中。
k2 = dt*f(t+0.5*dt, y+0.5*k1)
k2 = f(t+0.5*dt, y+0.5*dt*k1)