C# Runge-Kutta C中的返回值错误
有人能告诉我,为什么它总是返回相同的y值?我在网上搜索了很多,但我仍然不知道为什么它不起作用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
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值没有改变。对,所以你应该确定你希望改变哪一行,然后你可以缩小问题的范围。只是结果是错误的,说明诊断过程的不足。谢谢!它实际上帮助了我。终于开始工作了,谢谢!它实际上帮助了我。它终于起作用了。