Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Runge-Kutta C中的返回值错误_C# - Fatal编程技术网

C# Runge-Kutta C中的返回值错误

C# Runge-Kutta C中的返回值错误,c#,C#,有人能告诉我,为什么它总是返回相同的y值?我在网上搜索了很多,但我仍然不知道为什么它不起作用 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Inżynierkuuuu { class Lecimy { double t, y, krok, cel; public Lecim

有人能告诉我,为什么它总是返回相同的y值?我在网上搜索了很多,但我仍然不知道为什么它不起作用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Inżynierkuuuu
{
class Lecimy
{
    double t, y, krok, cel;

    public Lecimy(double t, double y, double krok, double cel)
    {
        this.t = t;
        this.y = y;
        this.krok = krok;
        this.cel = cel;
    }

    public delegate double funkcja(double t, double y);

    public double RK(double t, double y, double krok, funkcja yp)
    {
        double k1 = krok * yp(t, y);
        double k2 = krok * yp(t + krok * 0.5, y + k1 * 0.5);
        double k3 = krok * yp(t + krok * 0.5, y + k2 * 0.5);
        double k4 = krok * yp(t + krok, y + k3);

        double reszta = 1 / 6 * (k1 + 2 * k2 + 2 * k3 + k4);

        this.y = y + reszta;

        return y;
    }

    public void Run()
    {
        while(t < cel)
        {
            y = RK(t, y, krok, FN1);
            t = t + krok;
            Console.WriteLine("t: {0}, y: {1}", t, y);
        }
    }

    public double FN1(double t, double y)
    {
        return y;
    }

}
}

我不知道你想做什么,但我相信下面这句话不是你想要的:

double reszta = 1 / 6 * (k1 + 2 * k2 + 2 * k3 + k4);

reszta将始终为零。1/6是0,因为1和6都是整数。使用1.0/6或类似的工具。

我不知道您想要做什么,但我确信下面这行不是您想要的:

double reszta = 1 / 6 * (k1 + 2 * k2 + 2 * k3 + k4);

reszta将始终为零。1/6是0,因为1和6都是整数。使用1.0/6或类似的版本。

尽管我不明白您想做什么,但您的代码有两个明显的问题

1/6永远是零,你应该做1.0/6。原因是在前者中,选择了/int,int重载。 您正在将参数y与类字段y合并。 不要使用相同的名称命名局部变量/参数/字段,这会使人感到困惑和非常不安 容易出错;在方法RK中,您确定不应该返回吗 这是什么?你确定这个.y=y+reszta是正确的吗 不应该是这个。y+=reszta。看到这有多混乱了吗?
尽管我不明白你想做什么,但是你的代码有两个明显的问题

1/6永远是零,你应该做1.0/6。原因是在前者中,选择了/int,int重载。 您正在将参数y与类字段y合并。 不要使用相同的名称命名局部变量/参数/字段,这会使人感到困惑和非常不安 容易出错;在方法RK中,您确定不应该返回吗 这是什么?你确定这个.y=y+reszta是正确的吗 不应该是这个。y+=reszta。看到这有多混乱了吗?
现在还不清楚这意味着什么,这使得很难帮助你。您是否已通过代码了解了哪些精确计算的行为与您预期的不同?我想在FN1方法中实现微分方程的RK方法,例如dy/dt=t^2。不管有什么等式,输出值总是和第二节课中指出的一样。这不符合逐步通过的方面。你应该理解你希望你的每一行代码都能做些什么——这样你就可以知道什么时候没有发生。是的@JonSkeet Skeet监视列表和逐步检查非常有用。我注意到在RK方法中y值没有改变。对,所以你应该确定你希望改变哪一行,然后你可以缩小问题的范围。只是结果是错误的,这表明缺乏诊断过程。不清楚这意味着什么,这使得很难帮助你。您是否已通过代码了解了哪些精确计算的行为与您预期的不同?我想在FN1方法中实现微分方程的RK方法,例如dy/dt=t^2。不管有什么等式,输出值总是和第二节课中指出的一样。这不符合逐步通过的方面。你应该理解你希望你的每一行代码都能做些什么——这样你就可以知道什么时候没有发生。是的@JonSkeet Skeet监视列表和逐步检查非常有用。我注意到在RK方法中y值没有改变。对,所以你应该确定你希望改变哪一行,然后你可以缩小问题的范围。只是结果是错误的,说明诊断过程的不足。谢谢!它实际上帮助了我。终于开始工作了,谢谢!它实际上帮助了我。它终于起作用了。