2017-01-23 37 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

我解決了這個問題,只是將所有內容放在同一個腳本和類中。它的工作,但似乎是一個虐待的方式來做到這一點。