Python在ODE函数中出错:无法将数组数据从dtype('complex128')转换为dtype('float64')

时间:2018-09-05 17:32:51

标签: python arrays python-3.x ode

我编写了以下代码,类似于我编写的众多代码。这个发送了一个错误,我无法解决。有什么帮助吗?

def HUB(H,z,rc,beta,b,w,c,Om):
    H1 = ((1/H**2)*(3*b-3+beta)*Om*(1/(z+1))**(3*b-3+beta))-0.33*beta**3*w*(1/(z+1))**(-2*beta)
    H2 = (2*(1-beta-0.166*(beta**2*w*(1/(z+1))**(-2*beta))-2*c**2*(1-(1/(2*rc*H)))))
    hubble = -(H/(1+z))*(H1/H2)
    return hubble

def solution(z1,z,H0,rc,beta,b,w,c,Om):
    U = odeint(HUB,H0,[z1,z], args=(rc,beta,b,w,c,Om)) [-1]                 
    return U

for z in np.arange(-1,2.05,0.05):
    q=solution(0,z,69.9,0.08,0.498,0.035,20,0.69,0.235)[-1]
    print(z,q)

... 错误是

Traceback (most recent call last):
  File "C:\Users\esadr21\Desktop\INHDEFC\ANHDEIFC\m1\1st Model .py", line      24, in <module>
    q=solution(0,z,69.9,0.08,0.498,0.035,20,0.69,0.235)[-1]
  File "C:\Users\esadr21\Desktop\INHDEFC\ANHDEIFC\m1\1st Model .py", line 20, in solution
    U = odeint(HUB,H0,[z1,z], args=(rc,beta,b,w,c,Om)) [-1]
  File "C:\Python36-32\lib\site-packages\scipy\integrate\odepack.py", line 215, in odeint
    ixpr, mxstep, mxhnil, mxordn, mxords)
TypeError: Cannot cast array data from dtype('complex128') to dtype('float64') according to the rule 'safe'

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

表达式中某处可能有一个负数的幂。例如,对于(-1)**(1/2),Python返回6.123233995736766e-17+1j,它是一个复数。这里的ODES例程仅适用于实数值。

我对您的代码做了两件事。

  1. 我为z给出-1以上的值
  2. 我将odeint的“时间”参数更改为一系列的点,而不仅仅是两个。

    def HUB(H,z,rc,beta,b,w,c,Om):
        H1 = ((1/H**2)*(3*b-3+beta)*Om*(1/(z+1))**(3*b-3+beta))-0.33*beta**3*w*(1/(z+1))**(-2*beta)
        H2 = (2*(1-beta-0.166*(beta**2*w*(1/(z+1))**(-2*beta))-2*c**2*(1-(1/(2*rc*H)))))
        hubble = -(H/(1+z))*(H1/H2)
        return hubble
    
    def solution(z1,z,H0,rc,beta,b,w,c,Om):
        U = odeint(HUB,H0,np.linspace(z1,z,3), args=(rc,beta,b,w,c,Om))[-1]
        return U
    
    for z in [-0.5, 1., 2.]:
        q=solution(0,z,69.9,0.08,0.498,0.035,20,0.69,0.235)[-1]
        print(z,q)