Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:在双标量中遇到溢出_Python_Nan_Odeint - Fatal编程技术网

Python:在双标量中遇到溢出

Python:在双标量中遇到溢出,python,nan,odeint,Python,Nan,Odeint,我有一个由5个微分方程组成的系统,我用odeint求解,在我的一个微分方程中,我遇到了被零除的误差。顺便说一下,我尝试了两种方法- (a) 如果分母达到0,则创建一个函数并返回0.1 (b) 在分母上加一个小的正数。 然而,两者都没有给我想要的结果。 当我没有使用这两种解决方案中的任何一种时,我的代码运行正常,并且我得到了所需的图形,直到分母变为0。我还附上了图表。正如我们所看到的,图形被正确绘制,直到3秒后,由于除以zerror,值变为“nan”。请帮我解决这个问题!提前谢谢 PFA 我的代码

我有一个由5个微分方程组成的系统,我用odeint求解,在我的一个微分方程中,我遇到了被零除的误差。顺便说一下,我尝试了两种方法- (a) 如果分母达到0,则创建一个函数并返回0.1 (b) 在分母上加一个小的正数。 然而,两者都没有给我想要的结果。 当我没有使用这两种解决方案中的任何一种时,我的代码运行正常,并且我得到了所需的图形,直到分母变为0。我还附上了图表。正如我们所看到的,图形被正确绘制,直到3秒后,由于除以zerror,值变为“nan”。请帮我解决这个问题!提前谢谢 PFA

我的代码是

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint

t=np.linspace(0,250,10000)
c=5
k=50
eta=2.5
gamma,gamma1,gamma2=10,9,10
b,a1,a2=2,3,4
def check(x1,u,a1,x2,a2,b):
    return (.1 if np.sin(x1)==0 else b*(1/(np.sin(x1)))*u-a1*x2-a2*x1**2)


def f(Y,t):
    x1,x2,h,h1,h2=Y[0],Y[1],Y[2],Y[3],Y[4]
    #x"+a1x'+a2x^2=bcosec(x)u
    e=x1-np.sin(t)
    de=x2-np.cos(t)
    s=c*e+de
    u=-k*s-eta*np.tanh(s)+s*h1*x2+np.sin(x1)*h2*x1**2-np.sin(x1)*h*np.sin(t)-h*np.sin(t)*c*de-h*np.cos(x1)*s/2
    x1dot=x2
    #x2dot=b*(1.0/(np.sin(x1)+1e-8))*u-a1*x2-a2*x1**2
    x2dot=check(x1,u,a1,x2,a2,b)
    hdot=gamma*(s*np.tanh(10*np.sin(x1))*(s*np.cos(x1)/2+np.sin(x1)*np.sin(t)-np.sin(x1)*c*de))
    h1dot=gamma1*(s*np.tanh(10*np.sin(x1))*np.sin(x1)*x2)
    h2dot=gamma2*(s*np.tanh(10*np.sin(x1))*np.sin(x1)*x1**2)
    return[x1dot,x2dot,hdot,h1dot,h2dot]

y0=[0.1,0.2,0,0,0]
sol=odeint(f,y0,t,mxstep=500000,atol=1e-6)
x=sol[:,0]
xd=sol[:,1]
h=sol[:,2]
h1=sol[:,3]
h2=sol[:,4]
e,de=x-np.sin(t),xd-np.cos(t)
s=c*e+de
u=-k*s-eta*np.tanh(s)+s*h1*xd+np.sin(x)*h2*x**2-np.sin(x)*h*np.sin(t)-h*np.sin(t)*c*de-h*np.cos(x)*s/2
plt.subplot(2,3,1)
plt.plot(t,x,t,e,'r--')
plt.subplot(2,3,2)
plt.plot(x,xd)
plt.subplot(2,3,3)
plt.plot(t,u)
plt.subplot(2,3,4)
plt.plot(t,h)
plt.subplot(2,3,5)
plt.plot(t,h1)
plt.subplot(2,3,6)
plt.plot(t,h2)
print(x)
plt.show()

中,检查您的

    if np.sin(x1)==0

它将numpy浮点族值与整数进行比较,以获得精确匹配。虽然从数学上讲,0的倒数只能得到一个未定义的值,但在计算机中,浮点取一个非常小的数的倒数,可以使你得到一个比所能表示的更大的值。尝试检查正弦值是否小于
math.exp(math.log(2.0)*-32.0)
。这个值很小,可以精确地表示为二进制的浮点值,对于像0.000000001这样的十进制数转换为二进制浮点数来说,这是不正确的。

中检查

    if np.sin(x1)==0

它将numpy浮点族值与整数进行比较,以获得精确匹配。虽然从数学上讲,0的倒数只能得到一个未定义的值,但在计算机中,浮点取一个非常小的数的倒数,可以使你得到一个比所能表示的更大的值。尝试检查正弦值是否小于
math.exp(math.log(2.0)*-32.0)
。这个值很小,可以精确地表示为二进制的浮点值,对于像0.000000001这样的十进制数转换为二进制浮点数来说,这是不正确的。

不,它仍然不起作用,我在特定时间实例后得到的输出为零。我的意思是,我试着按照你的建议用逻辑更改检查函数,但它仍然没有给我正确的答案。我修改了我的检查函数如下-{def check(x1,u,a1,x2,a2,b):p=1.0/np.sin(x1)如果np.sin(x1)=0:l=1e-6返回b*(1.0/l)*u-a1*x2 a2*x12 elif np.sin(x1)>=-1e-6和np.sin(x1)不,它仍然不起作用,在特定的时间实例后,我得到的输出为零。我的意思是,我尝试按照您的建议用逻辑更改检查函数,但仍然没有给出正确的答案。我修改了我的检查函数,如下-{def check(x1,u,a1,x2,a2,b):p=1.0/np.sin(x1)如果np.sin(x1)=)==0:l=1e-6返回b*(1.0/l)*u-a1*x2-a2*x12 elif np.sin(x1)>=-1e-6和np.sin(x1)