[英]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.