如何在多个时间步长的C#中使用Runge-Kutta计算轨道?

时间:2017-01-23 22:20:03

标签: c# physics runge-kutta

作为我正在研究的项目的一部分,我需要使用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(),我就会遇到与它如何调用数据有关的所有问题。所以我进去,尝试做出任何静态的东西,但其他一切都变得混乱。我不知道是否使用实例会修复它而且我不熟悉它们的工作方式。

我有一个更明显的解决方案吗?我对此事的任何帮助表示感谢。 (顺便说一下,任何人都可以澄清示例的目标/ dy_dt实际意味着什么吗?)

*我最初在C中尝试过数字食谱,但它似乎已经过时了,而且我对C的反应比我想象的还要多。

1 个答案:

答案 0 :(得分:0)

我通过将所有内容放在同一个脚本和类中来解决问题。它有效,但似乎是一种欺骗性的方式。