odeint运行问题:超过集成限制

时间:2018-01-29 15:48:40

标签: python scipy odeint

在下面的代码中,我试图使用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)

0 个答案:

没有答案