2017-02-22 94 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? –