![](/img/trans.png)
[英]How Do I Compute Orbits Using Runge-Kutta in C# Over Multiple Timesteps?
[英]Wrong return value in Runge Kutta 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 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;
}
}
}
第二类:这里的“ y”值为1,当我将其更改为5时,它将始终在“输出”窗口中返回5。
static void Main(string[] args)
{
Lecimy e = new Lecimy(0.0, 1.0, 0.0001, 1.0);
e.Run();
//Application.EnableVisualStyles();
//Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
}
我不知道您想做什么,但是我确定以下行不是您想要的:
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
,您确定不应该返回this.y
吗? 您确定this.y = y + reszta
是正确的,而不应该是this.y += reszta
。 看到这是多么令人困惑?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.