如何在 C# 中使用 Runge-Kutta 计算多个时间步长的轨道?
How Do I Compute Orbits Using Runge-Kutta in C# Over Multiple Timesteps?
作为我正在进行的项目的一部分,我需要使用四阶 运行ge-Kutta 方法模拟物体围绕恒星的轨道。我需要为每个 RK4 方法的实现将这个对象的位置和速度写入一个 .dat 文件。
我的问题是我无法弄清楚如何在随后的时间间隔内重复整个方法或如何在每个步骤写入文件而不混淆静态 and/or 实例,我不知道没有太多经验。
This was the most coherent example I could find* and while I know it isn't for orbits, I wanted to use it as a basis to get the framework working. When everything works, I imagine I'll change its contents to something more like this.
为了写入 .dat,我已将示例的 运行() 函数修改为:
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 是 public 静态字符串。
然后我在主脚本中包含了以下函数:
// 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 中尝试过 Numerical Recipes,但它似乎已经无可救药地过时了,而且我对 C 的使用比我想象的还要生疏。
我通过将所有内容放在同一个脚本中并 class 解决了这个问题。它有效,但似乎是一种作弊的方式。
作为我正在进行的项目的一部分,我需要使用四阶 运行ge-Kutta 方法模拟物体围绕恒星的轨道。我需要为每个 RK4 方法的实现将这个对象的位置和速度写入一个 .dat 文件。
我的问题是我无法弄清楚如何在随后的时间间隔内重复整个方法或如何在每个步骤写入文件而不混淆静态 and/or 实例,我不知道没有太多经验。
This was the most coherent example I could find* and while I know it isn't for orbits, I wanted to use it as a basis to get the framework working. When everything works, I imagine I'll change its contents to something more like this.
为了写入 .dat,我已将示例的 运行() 函数修改为:
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 是 public 静态字符串。
然后我在主脚本中包含了以下函数:
// 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 中尝试过 Numerical Recipes,但它似乎已经无可救药地过时了,而且我对 C 的使用比我想象的还要生疏。
我通过将所有内容放在同一个脚本中并 class 解决了这个问题。它有效,但似乎是一种作弊的方式。