作爲我正在研究的項目的一部分,我需要使用四階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比我想象的更生疏了。
請注意,您找到的代碼是錯誤的,因爲它在'k2'和'k3'的參數中同時使用'dx'作爲斜率因子和'halfdx'。這意味着'k2'的計算中的第二個參數實際上是'y + 0.5 * dx * dx * f(x,y)'。 – LutzL
@LutzL我注意到他們使用'dx'而不是'dt'作爲他們的時間步,這讓我有點失落。但是,是的,我可以看到那裏的錯誤。儘管如此,它仍然會拋出一些數字,而我試圖解決的主要問題是寫入數據/重複這個過程,之後我將用軌道數據替換原始方程並更正「k」值。謝謝你指出。 – Kratos