首页 > 解决方案 > Python 在 ODE 函数中出现错误:无法将数组数据从 dtype('complex128') 转换为 dtype('float64')

问题描述

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

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'

谢谢你的帮助。

标签: pythonarrayspython-3.xode

解决方案


您的表达式中可能存在负数的幂。例如(-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)
    

推荐阅读