【发布时间】:2017-01-23 22:20:03
【问题描述】:
作为我正在进行的项目的一部分,我需要使用 4 阶 Runge-Kutta 方法模拟物体围绕恒星的轨道。对于 RK4 方法的每个实现,我都需要将此对象的位置和速度写入 .dat 文件。
我的问题是,我无法弄清楚如何在随后的时间间隔内重复整个方法,或者如何在每个步骤中写入文件而不会将事物与静态和/或实例混淆,我没有太多经验和。
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() 工作正常,但是一旦我取消注释 Update(),我就会遇到与它如何调用数据有关的各种问题。所以我进去了,试着把它变成静态的,但是其他的一切都变得混乱了。我不知道使用实例是否可以解决问题,而且我根本不熟悉它们的工作原理。
我在这里忽略了一个更明显的解决方案吗?对于此事,我将不胜感激。 (顺便说一句,有人能澄清一下示例的 target/dy_dt 的实际含义吗?)
* 我最初在 C 中尝试过数字食谱,但它似乎已经过时了,而且我对 C 的使用比我想象的更生疏。
【问题讨论】:
-
请注意,您找到的代码是错误的,因为它在
k2和k3的参数中同时使用了dx作为斜率因子和halfdx。这意味着k2计算中的第二个参数实际上是y+0.5*dx*dx*f(x,y)。 -
@LutzL 我注意到他们使用
dx而不是dt作为他们的时间步长,这让我有点失望。但是,是的,我可以在那里看到错误。不过,它仍然会抛出一些数字,而我要解决的主要问题是编写数据/重复该过程,之后我将用轨道方程替换原始方程并更正k值。感谢您指出这一点。
标签: c# physics runge-kutta