2017-02-22 95 views
2

我試圖解決任意n(多變量索引)值的Lane-Emden方程。爲了使用SciPy,我將二階ODE表示爲一組兩個一階耦合一階ODE。我有以下代碼:用SciPy解決ODE在double_scalars錯誤中遇到無效值

import matplotlib.pyplot as plt 
import numpy as np 
from scipy.integrate import odeint 

def poly(y,xi,n): 
    theta, phi = y 
    dydt = [phi/(xi**2), -(xi**2)*theta**n] 
    return dydt 

在這裏,我所定義披= THETA」

y0 = [1.,0.] 
xi = np.linspace(0., 16., 201)  
for n in range(0,11): 
    sol = odeint(poly, y0, xi, args=(n/2.,)) 
    plt.plot(xi, sol[:, 0], label=str(n/2.)) 
plt.legend(loc='best') 
plt.xlabel('xi') 
plt.grid() 
plt.show() 

但是,運行該代碼的結果在下面的錯誤:

RuntimeWarning: invalid value encountered in double_scalars
app.launch_new_instance()

起初,我認爲這是xi = 0方程奇異性的結果,所以我改變了我的積分間隔:

xi = np.linspace(1e-10, 16., 201) 

這樣可以解決n = 0時的問題,但不會解決其他n值問題。我得到的情節沒有任何意義,而且顯然是錯誤的。

爲什麼我會收到此錯誤消息,以及如何修復我的代碼?

回答

1

以下適用於我(與Wikipedia entry類似)。衍生物被錯誤地寫入(在錯誤的元素上是負的)並且衍生物的輸入被簡單地改變爲n

import matplotlib.pyplot as plt 
import numpy as np 
from scipy.integrate import odeint 

def poly(y,xi,n): 
    theta, phi = y 
    dydxi = [-phi/(xi**2), (xi**2)*theta**n] 
    return dydxi 

fig, ax = plt.subplots() 

y0 = [1.,0.] 
xi = np.linspace(10e-4, 16., 201) 

for n in range(6): 
    sol = odeint(poly, y0, xi, args=(n,)) 
    ax.plot(xi, sol[:, 0]) 

ax.axhline(y = 0.0, linestyle = '--', color = 'k') 
ax.set_xlim([0, 10]) 
ax.set_ylim([-0.5, 1.0]) 
ax.set_xlabel(r"$\xi$") 
ax.set_ylabel(r"$\theta$") 
plt.show() 

​​


使用多方指數,所以像後續可用於調查這些值的分數值,原來的問題...

for n in range(12): 
    sol = odeint(poly, y0, xi, args=(n/2.,)) 

    if np.isnan(sol[:,1]).any(): 
     stopper = np.where(np.isnan(sol[:,1]))[0][0] 
     ax.plot(xi[:stopper], sol[:stopper, 0]) 
    else: 
     ax.plot(xi, sol[:, 0]) 

fractional polytropic index values

+0

謝謝你的回覆!這很好,我的代碼現在可以工作了!你有什麼想法,爲什麼它只適用於n的整數值? –

+1

我覺得'theta'小於或等於零時不喜歡它。如果你看看解決方案的輸出,它會在'theta = 0'停下來。 –

+1

這很有道理,因爲那會導致複雜的解決方案。有沒有辦法使用ODEint直到theta <0? –