Python:运行时警告:在square、add、multiply、subs中遇到溢出

2024-03-29 06:22:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我是从Python开始的,所以我可能会问一个不那么微妙的问题,但是经过大量的研究,我无法解决这个错误。 实际上,我正试图用Gray-Scott模型来解决一个物理问题,但我一直停留在代码的最后:结果不被视为数字,在square、add、multiply和substract中会遇到溢出。

这里有人知道这是从哪里来的吗?

谢谢!

以下是我试图解决的问题的初始条件:

n = 192
Du, Dv, F, k = 0.00016, 0.00008, 0.035, 0.065 
dh = 5/(n-1)  
T = 8000
dt = .9 * dh**2 / (4*max(Du,Dv))
nt = int(T/dt)

uvinitial = numpy.load('./uvinitial.npz')

Uin = uvinitial['U']
Vin = uvinitial['V']

下面是我的功能:

def Nd1(U,V) :
    return - U*(V)**2 + F*(1-U)


def Nd2(U,V) :
    return U*(V)**2 -(F+k)*V


def gray_scott_solve(Du, Dv, dh, dt, nt, Uin, Vin, Nd1, Nd2):

    Uplus = Uin.copy()
    Vplus = Vin.copy()

    for n in range(nt):

        U = Uplus.copy()  
        V = Vplus.copy()

        Uplus[1:-1,1:-1] = ( Nd1(U[1:-1,1:-1], V[1:-1,1:-1]) + Du/(dh**2) \
                            *(U[2:,1:-1] + U[:-2,1:-1] - 4*U[1:-1,1:-1]) \
                            + U[1:-1,2:] + U[1:-1,:-2] )*dt \
                            + U[1:-1,1:-1]

        Uplus[:,-1] = Uplus[:,-2]    
        Uplus[-1,:] = Uplus[-2,:]
        Uplus[:,0] = Uplus[:,1]
        Uplus[0,:] = Uplus[1,:]

        Vplus[1:-1,1:-1] = ( Nd2(U[1:-1,1:-1], V[1:-1,1:-1]) + Du/(dh**2) \
                            *(V[2:,1:-1] + V[:-2,1:-1] - 4*V[1:-1,1:-1]) \
                            + V[1:-1,2:] + V[1:-1,:-2] )*dt \
                            + V[1:-1,1:-1]

        Vplus[:,-1] = Vplus[:,-2]
        Vplus[-1,:] = Vplus[-2,:]
        Vplus[:,0]= Vplus[:,1]
        Vplus[0,:]= Vplus[1,:]


    return U, V

我现在要打印我要查找的结果:

U, V = gray_scott_solve(Du, Dv, dh, dt, nt, Uin, Vin, Nd1, Nd2)

print(U[100,::40])

最后我得到了这个错误:

[ nan  nan  nan  nan  nan]

C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:2: RuntimeWarning: overflow encountered in square from ipykernel import kernelapp as app
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:2: RuntimeWarning: overflow encountered in multiply from ipykernel import kernelapp as app
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:5: RuntimeWarning: overflow encountered in square
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:5: RuntimeWarning: overflow encountered in multiply
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:11: RuntimeWarning: invalid value encountered in add
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:11: RuntimeWarning: overflow encountered in multiply
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:11: RuntimeWarning: invalid value encountered in subtract
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:18: RuntimeWarning: invalid value encountered in add
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:18: RuntimeWarning: overflow encountered in multiply
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:18: RuntimeWarning: invalid value encountered in subtract

Tags: inpymainlibpackagessiteplususers
1条回答
网友
1楼 · 发布于 2024-03-29 06:22:17

正如您所写的,在python 2中,空间步dh将等于零:

n  = 192
...
dh = 5 / ( n - 1 )

如果您使用的是python 3,那么dh将被正确地视为一个浮点数。

否则,正如@WarrenWeckesser所说,您使用的是直线法,并与前向Euler方法进行了时间积分,该方法与您的约束集(您说您的讲师指定了您的时间步长和其他参数值)显然是不稳定的。但是,使用Runge-Kutta Two方法对您的dt有效(我已经验证了这一点),但是您的讲师可能提到了您应该使用的时间积分。

不管怎样,如果Runge Kutta Two看起来让人望而生畏,那么使用二阶中心空间方法:

u_{n+1} = u_{n-1} + 2 * dt * f(t_n,u_n)

其中f(t,u)是右手边,u_{n-1}是时间t_{n-1}u的值,或者是向后euler方法。

相关问题 更多 >