ChrisR
2017-03-16 13:19:26 UTC
我正在尋找可以生成豬排情節的免費工具。我這樣做是為了將我的工具的輸出與第三方之一進行比較。另外,如果有人有解決Lambert邊值問題的特定測試用例,我將非常渴望查看。
這純粹是為了驗證。
我正在尋找可以生成豬排情節的免費工具。我這樣做是為了將我的工具的輸出與第三方之一進行比較。另外,如果有人有解決Lambert邊值問題的特定測試用例,我將非常渴望查看。
這純粹是為了驗證。
我使用開普勒問題求解器測試蘭伯特問題求解器。例如:如果我想生成各種測試用例,其中要改變偏心率和半長軸,則只需解決:
$$ M_0 + \ sqrt {\ frac {\ mu} {a ^ 3 }} \ Delta t = E-e \ sin(E)$$
用於多種$(e,a,\ Delta t)$組合。解決了許多開普勒問題(由於開普勒方程必須成立,我可以立即進行測試),所以我解決了相應的蘭伯特問題並驗證是否獲得了相同的偏心距。
以下代碼說明了這種方法
import numpy as npdef kepler(a,e,mu = 1.0):#給定偏心距,對飛行時間進行顯式計算#[in 0,2 pi] n = np.sqrt(mu / pow(a,3))E = np.linspace(0,2 * np.pi,360)#每度一個點t =(E-e * np.sin(E))/ n return(t,E) def笛卡爾(sma,ecc,ean,mu = 1.0):smp = sma *(1- ecc ** 2)能量= -mu /(2 * sma)f = 2 * np.arctan(np.sqrt((1 + ecc)/(1-ecc))* np.tan(ean / 2))r = smp /(1 + ecc * np.cos(f))v = np.sqrt(2 *(能量+ mu / r ))如果f < 0:f = 2 * np.pi + f返回np.array([r,v,f])#讓我們測試給定sma / ecc組合的算法。在真實測試中,您將添加更多值,並考慮多個轉速(對於大多數multirev情況,您將獲得兩個解決方案)sma = 1.0ecc = 0.1#這將計算飛行時間和偏心距異常注意:顯式計算tof,ean =開普勒(sma,ecc)#這會將量轉換為笛卡爾矢量幅度和#無限制的真實異常(以計算傳遞角) ])r = rvf [:, 0] v = rvf [:, 1] f = rvf [:, 2]#在這裡,我將只調用自己的Lambert求解器(在C ++中實現)import ctypeslib = ctypes.CDLL(“ libsolve.so“)vs =(ctypes.c_double * 2)()N = len(tof)max_diff = 0.0#這個醜陋的循環簡單地比較了每個分段成對組合
#單次修訂(您也可以進行多次修訂,只需要增加TOF和f即可)。您將在此處附加自己的#Lambert求解器。對於xrange(N)中的n1:對於xrange(n1 + 1,N)中的n2:lib.solve(ctypes.c_double(1.0),#gm ctypes.c_double(r [n1 ]),#第一位置ctypes.c_double(r [n2])的範數,#第二位置ctypes.c_double(f [n2]-f [n1])的範數,#角行程ctypes.c_double(tof [n2]- tof [n1]),#飛行時間ctypes.byref(vs))#輸出#比較速度的範數(可以在#徑向/切向中分解)diff = np.sqrt((v [n1]-vs [0 ])** 2 +(v [n2]-vs [1])** 2)如果diff > max_diff:max_diff = diff#報告最大差異,請打印max_diff
注意可以計算出給定的飛行時間一系列的偏心距,偏心距和半長軸。在這種情況下,我僅考慮單次發布,但推廣很簡單。
借助偏心異常,您可以計算真實的異常和飛行時間(後者通過開普勒方程,但是您不需要迭代求解)。
該信息用於獲取軌道上不同點的距離和速度。
然後,您可以使用範圍,速度,飛行時間和傳輸角度(由於軌道為開普勒人而在真實異常中的差異)的所有這些組合來測試Lambert求解器。
我使用自己的Gooding算法實現方案進行了快速測試,得出最大差值為 8.76111591946e-14
,對於雙精度計算而言,這是非常合理的。
為進行比較,我生成了一個類似的圖表-它與您的圖表比較好。我建議您將到達時間的軸數增加到2016年1月1日之後的420天,以確保您的Lambert求解器能夠檢測到轉移節點(另外,請注意我們到達日期的基線時間不同)。