在下面的代码中,我试图使用SciPy的odeint解决ODE问题。 sigma_sq
是一个单调递减函数,在函数Ptot
中,我取sigma_sq(m) - sigma_sq(m0)
的分数幂,其中m
应始终小于m0
。但是,当运行odeint
时,python会返回错误negative number cannot be raised to a fractional power
。在P1(m)
中调用rhs
时会发生这种情况,当我打印值m,m0
时,我发现m
超过m0
,即使在mlist
中也是如此最大值为m0
。
我遇到的另一个问题是该函数返回nan
以供以后迭代。
x1 = 0.44
sigma8 = 0.82
spectral_index = 0.971
m0 = 1e13
dw = 1e-6
def sigma_sq(m):
return sigma8**2 * m**((-2*(spectral_index+3.))/3.)
def dsdm(m):
return (-2.*(spectral_index+3.)/3.) * m**((-2*(spectral_index+3.))/3. - 1)
def heavi(m):
if type(m) == numpy.float64:
return (1 if m > 0 else 0)
else:
return np.array([(1 if mv>0 else 0) for mv in m])
def Ptot(m):
print sigma_sq(m) - sigma_sq(m0),m,m0
return (1./np.sqrt(2.*np.pi)) * (m0/m) * (dw / (sigma_sq(m) - sigma_sq(m0))**(3./2.)) * np.abs(dsdm(m))
def P1(m):
return Ptot(m)*np.heaviside(m-x1*m0,1./2.)
def P2(m):
return Ptot(m) - P1(m)
def rhs(f,m):
return -P1(m)/P2(f)
mlist2 = np.linspace(x1*m0,m0,10000)
y0 = x1*m0
f2 = odeint(rhs,y0,mlist2)