2017-01-23 36 views
0

作为我正在研究的项目的一部分,我需要使用四阶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比我想象的更生疏了。

+0

请注意,您找到的代码是错误的,因为它在'k2'和'k3'的参数中同时使用'dx'作为斜率因子和'halfdx'。这意味着'k2'的计算中的第二个参数实际上是'y + 0.5 * dx * dx * f(x,y)'。 – LutzL

+0

@LutzL我注意到他们使用'dx'而不是'dt'作为他们的时间步,这让我有点失落。但是,是的,我可以看到那里的错误。尽管如此,它仍然会抛出一些数字,而我试图解决的主要问题是写入数据/重复这个过程,之后我将用轨道数据替换原始方程并更正“k”值。谢谢你指出。 – Kratos

回答

0

我解决了这个问题,只是将所有内容放在同一个脚本和类中。它的工作,但似乎是一个虐待的方式来做到这一点。