【问题标题】:How Do I Compute Orbits Using Runge-Kutta in C# Over Multiple Timesteps?如何在 C# 中使用 Runge-Kutta 计算多个时间步长的轨道?
【发布时间】: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 的使用比我想象的更生疏。

【问题讨论】:

  • 请注意,您找到的代码是错误的,因为它在 k2k3 的参数中同时使用了 dx 作为斜率因子和 halfdx。这意味着k2 计算中的第二个参数实际上是y+0.5*dx*dx*f(x,y)
  • @LutzL 我注意到他们使用dx 而不是dt 作为他们的时间步长,这让我有点失望。但是,是的,我可以在那里看到错误。不过,它仍然会抛出一些数字,而我要解决的主要问题是编写数据/重复该过程,之后我将用轨道方程替换原始方程并更正 k 值。感谢您指出这一点。

标签: c# physics runge-kutta


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多