2014-04-04 45 views
2

我想使用integrate.ode模塊在2D中集成粒子路徑。我的情況有點不同的是,我只想整合到某個位置,由粒子的最大允許x座標決定:x_maxPython中的自適應ODE算法

我的主要問題是,粒子可能先移動得非常慢,然後再收集更多速度。因此,我不想在這個地區花費很少的時間來浪費精力。該算法應該能夠進行調整,以便在粒子速度變高時使用較小的時間步長。

下面我有一些粗糙的僞代碼用於此目的:

backend = "dopri5" 
x_max = 1 
solver = ode(f) 
solver.set_integrator(backend) 
solver.set_initial_value(y0, t0) 
t, y = [t0], [y0] 
k = 1.2 
while solver.successful() and solver.y[0] < x_max 
    solver.integrate(solver.t+dt) 
    t.append(solver.t) 
    y.append(solver.y) 
    v_current = numpy.linalg.norm(y[-1]) 
    v_previous = numpy.linalg.norm(y[-2]) 
    if numpy.abs(v_current-v_previous) > k * v_previous: 
     dt = 0.8*dt 
     del y[-1] 
    else: 
     dt = dt*1.2 

麻煩的是這種算法可能不那麼強勁,因爲選擇的值k, 1.2, 0.8是有點任意的,可能會導致該算法的一些穩定性問題。

任何人都可以提出一個更好的方法來做到這一點?

+0

的空間真的,這可能是更適合於http://scicomp.stackexchange.com/ –

+0

@AndrewWalker對不起,我應該在那裏重新發布我的問題嗎? – Jack

+0

海事組織它不是脫離主題,但它是相當具體的,我想你可能會從scicomp的觀衆得到更好的答案。 –

回答

4

爲了將離散事件(交叉)與ODE組合起來,您可能需要嘗試一個專門爲此類問題設計的函數庫。似乎有幾個:

如果你的模型的結構意味着你總是會發現事件,您可以採取大步驟並使用二分查找來查找事件發生的時間/地點。這通常在有多個維度的情況下不起作用。

這種類型的問題經常發生在遊戲編程/實時物理/碰撞檢測中,並且您可能會使用該領域的技術(認爲快速移動的子彈穿過緩慢移動的實體)有一定的運氣。

如果你想對事件發生的歷史作出迴應,說像一個反彈球,你在hybrid systems