Python RuntimeWarning:在true_divide中遇到被零除

Python RuntimeWarning:在true_divide中遇到被零除,python,division,zero,Python,Division,Zero,所以基本上我有随时间变化的值(坐标)。我在func()中定义了它们,并用odeint和start值解决了它们。现在我试图检查它们是否在每一时刻都满足条件H=0(代码中定义了H),否则我的轨迹是错误的。但是我不知道错误是从哪里来的,我不明白为什么这不起作用。有人有主意吗?如果你需要更多的信息,我正在为一个史瓦西黑洞的光轨道编程。(如有的话)≠0,这些不是光子轨道) 我尝试过改变值和移动括号,但老实说,我真的不知道还有什么可以尝试 import numpy as np from scipy.inte

所以基本上我有随时间变化的值(坐标)。我在func()中定义了它们,并用odeint和start值解决了它们。现在我试图检查它们是否在每一时刻都满足条件H=0(代码中定义了H),否则我的轨迹是错误的。但是我不知道错误是从哪里来的,我不明白为什么这不起作用。有人有主意吗?如果你需要更多的信息,我正在为一个史瓦西黑洞的光轨道编程。(如有的话)≠0,这些不是光子轨道)

我尝试过改变值和移动括号,但老实说,我真的不知道还有什么可以尝试

import numpy as np
from scipy.integrate import odeint
from sympy import *
import sympy as sp



# coordinates who won't change
ptheta = 0
rs = 2
t0 = 0
theta = sp.pi/2

def func(f, T, rs):
       # f
       t, r, theta, phi, pt, pr, ptheta, pphi = f
       # derivatives
       dtdT = (1+(rs/r))*pt # 1/(1-rs/r)
       drdT = (1-(rs/r))*pr
       dthetadT = 0 #ptheta/(r**2)
       dphidT = pphi/((r**2))#*(sp.sin(theta)**2))
       dptdT = 0
       dprdT = ((pphi**2)/(r**3))-((rs/2)/((r-rs)**2))-(((rs/2)*    (pr**2))/(r**2))
       dpthetadT = 0 #(cos(theta)*(ptheta)**2)/((r**2)*sp.sin(phi)**3)
       dpphidT = 0 #pphi/((r**2)*(sp.sin(theta)**2)) #0
       return(dtdT, drdT, dthetadT, dphidT, dptdT, dprdT, dpthetadT, dpphidT)

# initial conditions  
r0 = 12*rs
phi0 = sp.pi
pr0 = 0
pphi0 = 5 
pt0 = sqrt((((1-(rs/r0))**2)*(pr0**2)) + (pphi0**2)*(1-rs/r0)/(r0**2))
f0=[t0, r0, theta, phi0, pt0, pr0, ptheta, pphi0]
T = np.linspace(0, 2250, 9000)
xx=odeint(func, f0, T, args=(rs,))

# calling coordinates from odeint
r00 = xx[:, 1]
theta00 = xx[:, 2]
phi00 = xx[:, 3]
pt00 = xx[:, 4]
pr00 = xx[:, 5]
pphi00 = xx[:, 7]

# hamiltonian
H0 = -((1-rs/r00)**-1)*(pt00**2)/2 + (1-rs/r00)*(pr00**2)/2 +    (pphi00**2)/(2*(r00**2))

print(H0)
if np.amax(H0) < 6e-12:
print("Your results are correct")
else:
print("Your results are wrong")
将numpy导入为np
从scipy.integrate导入odeint
从sympy进口*
将sympy作为sp导入
#谁不会改变
ptheta=0
rs=2
t0=0
θ=sp.pi/2
def func(f、T、rs):
#f
t、 r,θ,φ,pt,pr,ptheta,pphi=f
#衍生工具
dtdT=(1+(rs/r))*pt#1/(1-rs/r)
drdT=(1-(rs/r))*pr
dthetadT=0#ptheta/(r**2)
dphidT=pphi/((r**2))#*(sp.sin(θ)**2))
dptdT=0
dprdT=((pphi**2)/(r**3))-((rs/2)/((r-rs)**2))-((rs/2)*(pr**2))/(r**2))
dpthetadT=0(cos(theta)*(ptheta)**2/(r**2)*sp.sin(phi)**3)
dpphidT=0#pphi/(r**2)*(sp.sin(θ)**2))#0
返回(dtdtdt、drdT、dthetadT、dphidT、dptdT、dpdt、dpthetadT、dpphidT)
#初始条件
r0=12*rs
phi0=sp.pi
pr0=0
pphi0=5
pt0=sqrt(((1-(rs/r0))**2)*(pr0**2)+(pphi0**2)*(1-rs/r0)/(r0**2))
f0=[t0,r0,θ,phi0,pt0,pr0,ptheta,pphi0]
T=np.linspace(022509000)
xx=odeint(func,f0,T,args=(rs,)
#从odeint调用坐标
r00=xx[:,1]
θ0=xx[:,2]
phi00=xx[:,3]
pt00=xx[:,4]
pr00=xx[:,5]
pphi00=xx[:,7]
#哈密顿量
H0=-((1-rs/r00)**-1)*(pt00**2)/2+(1-rs/r00)*(pr00**2)/2+(pphi00**2)/(2*(r00**2))
打印(H0)
如果np.amax(H0)<6e-12:
打印(“您的结果是正确的”)
其他:
打印(“您的结果错误”)

我应该得到非常小的汉密尔顿值(xe-17或更小),但我一直得到ne-02,它太大了,不正确

如果没有代码,很难判断出哪里出了问题