作为我正在研究的项目的一部分,我需要使用四阶Runge-Kutta方法模拟恒星周围物体的轨道。我需要将该对象的位置和速度写入每个RK4方法实现的.dat文件中。如何使用C#中的Runge-Kutta在多个时间步计算轨道?
我的问题是,我无法弄清楚如何在后续的时间间隔内重复整个方法,或者如何在每个步骤中写入文件而不会将事情与静态和/或实例相混淆,而我没有太多经验。
This是我能找到的最一致的例子,虽然我知道它不是用于轨道,但我想用它作为获得框架工作的基础。当一切正常时,我想我会将其内容更改为更像this的内容。
要写入的.dat,我修改的例子的run()函数:
public void Run()
{
while (x < target) {
y = RungeKutta.rk4(x, y, dx, dy_dt);
x += dx;
}
print("x = " + x + ", y = " + y);
DataLine = x + " " + y;
DustHandler.DataWriter();
}
其中的DataLine是一个公共静态字符串。
然后我在我的主脚本包含以下功能:
// void Update() {
// if(Input.GetButtonDown("Space")==true) {
// Transformers.Equation e = new Transformers.Equation(Transformers.Equation.x, Transformers.Equation.y, 0.0001, 1.0);
// e.Run();
// }
// }
public static void DataWriter() {
using (StreamWriter writetext = new StreamWriter("Orbit.dat"))
{
writetext.Write(Transformers.Equation.DataLine);
writetext.Close();
}
}
现在,DataWriter()工作正常,但只要我未评论更新(),我得到的所有类型的相关问题它如何调用数据。所以我走进去,尽量做出任何静止的东西,但是其他一切都会变得不合时宜。我不知道是否使用实例会修复它,我不熟悉它们的工作方式。
我在这里忽略了一个更明显的解决方案吗?我很感激在这件事上的任何帮助。 (顺便说一下,任何人都可以澄清的例子中的目标/ dy_dt实际上意味着什么?)
*我最初试图数字食谱在C,但它似乎无可救药地过时了,我使用C比我想象的更生疏了。
请注意,您找到的代码是错误的,因为它在'k2'和'k3'的参数中同时使用'dx'作为斜率因子和'halfdx'。这意味着'k2'的计算中的第二个参数实际上是'y + 0.5 * dx * dx * f(x,y)'。 – LutzL
@LutzL我注意到他们使用'dx'而不是'dt'作为他们的时间步,这让我有点失落。但是,是的,我可以看到那里的错误。尽管如此,它仍然会抛出一些数字,而我试图解决的主要问题是写入数据/重复这个过程,之后我将用轨道数据替换原始方程并更正“k”值。谢谢你指出。 – Kratos