我如何避免在numpy中具有nan值

发布于 2025-02-02 07:39:59 字数 2916 浏览 2 评论 0原文

我有一个非线性的PDE系统,并且我试图使用有限差异方法来解决它。但是我一直遇到以下错误,并且图形不正确:

Runtime Warning:在Double_scalars中遇到的零分隔

的代码在下面:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d

Lx = 1.0
Ly = 1.0
Time = 4  #Integration time
#constants :
D = 0.001
xi0=0.38
gho = 0.34
alpha = 0.6
mu = 0.1
beta = 0.05
gamma = 0.1
# NUMERICAL PARAMETERS
NX = 100
NT = 100

dx = Lx/(NX-1)
dt = Time/NT
#initial conditions
def n0(x, y):
    return np.exp(-1*(x**2)/(0.001))*(np.sin(6*np.pi*y))**2
def c0(x,y):
    return np.exp(-1*(1-x)**2/0.45)
def f0(x,y):
    return 0.75*np.exp(-1*(x)**2/0.45)
def xi(y):
    return xi0/(1+alpha*y)


def grad(x,y,a):
    p = np.array([(y-x)/dx,(y-a)/dx])
    return p

def laplacien(a,b,c,d,f):
    s = (a+c+d+f-4*b)/(dx**2)
    
    return s



def G(Z,j,i):
    n = Z[0]
    f = Z[1]
    c = Z[2]
    d21 = laplacien(n[j-1,i],n[j,i],n[j+1,i],n[j,i-1],n[j,i+1])
    d22 = laplacien(f[j-1,i],f[j,i],f[j+1,i],f[j,i-1],f[j,i+1])
    d23 = laplacien(c[j-1,i],c[j,i],c[j+1,i],c[j,i-1],c[j,i+1])
    d11 = grad(n[j-1,i],n[j,i],n[j,i-1])
    d12 = grad(f[j-1,i],f[j,i],f[j,i-1])
    d13 = grad(c[j-1,i],c[j,i],c[j,i-1])
    d14 = grad(xi(c[j-1,i]),xi(c[j,i]),xi(c[j,i-1]))
    n[j,i] +=dt*(D*d21 -(np.dot(d14,d13) + xi(c[j,i])*d23 +gho*d22)*n[j,i]-np.dot((xi(c[j,i])*d13 + gho*d12),d11))
    f[j,i] += dt*(beta-gamma*f[j,i])*n[j,i]
    c[j,i] += -dt*mu*n[j,i]*c[j,i]
    

    

I = np.linspace(0,1,NX)
J = np.linspace(0,1,NX)
X,Y = np.meshgrid(I,J)



N = n0(X,Y)
F = f0(X,Y)
C = c0(X,Y)
A = np.array([N,F,C])
for n in range(1,NT+1):

    for j in range (1, NX-1):
        for i in range(1, NX-1):
            G(A,j,i)
    
    
    N1 = A[0]
    F1 = A[1]
    C1 = A[2]
    

    for i in range(1, NX-1):
        d1 = (N1[2,i]-N1[1,i])/dx
        d2 = (F1[2,i]-F1[1,i])/dx
        d3 = (C1[2,i]-C1[1,i])/dx
        d4 = (N1[NX-1,i]-N1[NX-2,i])/dx
        d5 = (F1[NX-1,i]-F1[NX-2,i])/dx
        d6 = (C1[NX-1,i]-C1[NX-2,i])/dx
        ki = xi(C1[0,i])*d3 + gho*d2
        N1[0,i] = D*d1/ki
        kf = xi(C1[NX-1,i])*d6 + gho*d5
        N1[NX-1,i] = D*d4/kf
    
    
    
    for j in range (1, NX-1):
        d1 = (N1[j,2]-N1[j,1])/dx
        d2 = (F1[j,2]-F1[j,1])/dx
        d3 = (C1[j,2]-C1[j,1])/dx
        d4 = (N1[j,NX-1]-N1[j,NX-2])/dx
        d5 = (F1[j,NX-1]-F1[j,NX-2])/dx
        d6 = (C1[j,NX-1]-C1[j,NX-2])/dx
        ki = xi(C1[j,0])*d3 + gho*d2
        N1[j,0] = D*d1/ki
        kf = xi(C1[j,NX-1])*d6 + gho*d5
        N1[j,NX-1] = D*d4/kf

    if (n%25 == 0):

        fig = plt.figure()
        ax = plt.axes()

        plt.imshow(N1
            , origin='lower' 
            , cmap='RdGy'
            )
        plt.colorbar()
        ax.set_xlabel('x')
        ax.set_ylabel('y')
        plt.show()

我 差异方法使nan值不显示,还是此方法对PDE非线性系统不起作用?

I have a PDE system that is non-linear, and I was trying to solve it using the finite difference method. But I keep getting the following error and the graphs are not correct:

RuntimeWarning: divide by zero encountered in double_scalars

My code is below:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d

Lx = 1.0
Ly = 1.0
Time = 4  #Integration time
#constants :
D = 0.001
xi0=0.38
gho = 0.34
alpha = 0.6
mu = 0.1
beta = 0.05
gamma = 0.1
# NUMERICAL PARAMETERS
NX = 100
NT = 100

dx = Lx/(NX-1)
dt = Time/NT
#initial conditions
def n0(x, y):
    return np.exp(-1*(x**2)/(0.001))*(np.sin(6*np.pi*y))**2
def c0(x,y):
    return np.exp(-1*(1-x)**2/0.45)
def f0(x,y):
    return 0.75*np.exp(-1*(x)**2/0.45)
def xi(y):
    return xi0/(1+alpha*y)


def grad(x,y,a):
    p = np.array([(y-x)/dx,(y-a)/dx])
    return p

def laplacien(a,b,c,d,f):
    s = (a+c+d+f-4*b)/(dx**2)
    
    return s



def G(Z,j,i):
    n = Z[0]
    f = Z[1]
    c = Z[2]
    d21 = laplacien(n[j-1,i],n[j,i],n[j+1,i],n[j,i-1],n[j,i+1])
    d22 = laplacien(f[j-1,i],f[j,i],f[j+1,i],f[j,i-1],f[j,i+1])
    d23 = laplacien(c[j-1,i],c[j,i],c[j+1,i],c[j,i-1],c[j,i+1])
    d11 = grad(n[j-1,i],n[j,i],n[j,i-1])
    d12 = grad(f[j-1,i],f[j,i],f[j,i-1])
    d13 = grad(c[j-1,i],c[j,i],c[j,i-1])
    d14 = grad(xi(c[j-1,i]),xi(c[j,i]),xi(c[j,i-1]))
    n[j,i] +=dt*(D*d21 -(np.dot(d14,d13) + xi(c[j,i])*d23 +gho*d22)*n[j,i]-np.dot((xi(c[j,i])*d13 + gho*d12),d11))
    f[j,i] += dt*(beta-gamma*f[j,i])*n[j,i]
    c[j,i] += -dt*mu*n[j,i]*c[j,i]
    

    

I = np.linspace(0,1,NX)
J = np.linspace(0,1,NX)
X,Y = np.meshgrid(I,J)



N = n0(X,Y)
F = f0(X,Y)
C = c0(X,Y)
A = np.array([N,F,C])
for n in range(1,NT+1):

    for j in range (1, NX-1):
        for i in range(1, NX-1):
            G(A,j,i)
    
    
    N1 = A[0]
    F1 = A[1]
    C1 = A[2]
    

    for i in range(1, NX-1):
        d1 = (N1[2,i]-N1[1,i])/dx
        d2 = (F1[2,i]-F1[1,i])/dx
        d3 = (C1[2,i]-C1[1,i])/dx
        d4 = (N1[NX-1,i]-N1[NX-2,i])/dx
        d5 = (F1[NX-1,i]-F1[NX-2,i])/dx
        d6 = (C1[NX-1,i]-C1[NX-2,i])/dx
        ki = xi(C1[0,i])*d3 + gho*d2
        N1[0,i] = D*d1/ki
        kf = xi(C1[NX-1,i])*d6 + gho*d5
        N1[NX-1,i] = D*d4/kf
    
    
    
    for j in range (1, NX-1):
        d1 = (N1[j,2]-N1[j,1])/dx
        d2 = (F1[j,2]-F1[j,1])/dx
        d3 = (C1[j,2]-C1[j,1])/dx
        d4 = (N1[j,NX-1]-N1[j,NX-2])/dx
        d5 = (F1[j,NX-1]-F1[j,NX-2])/dx
        d6 = (C1[j,NX-1]-C1[j,NX-2])/dx
        ki = xi(C1[j,0])*d3 + gho*d2
        N1[j,0] = D*d1/ki
        kf = xi(C1[j,NX-1])*d6 + gho*d5
        N1[j,NX-1] = D*d4/kf

    if (n%25 == 0):

        fig = plt.figure()
        ax = plt.axes()

        plt.imshow(N1
            , origin='lower' 
            , cmap='RdGy'
            )
        plt.colorbar()
        ax.set_xlabel('x')
        ax.set_ylabel('y')
        plt.show()

Equation

My question is: Is there a way to do the finite difference method so the NAN values don't show up or does this method not work on PDE non-linear systems?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

就是爱搞怪 2025-02-09 07:39:59

您可以尝试的方法之一是为除数增加一个很小的价值。

找到发生零除以零的线,然后以y/x形式更改代码y/(x+1e-5)

调整少量数量的大小,注意您要处理的数字范围。

One of the ways you can try is to add a very small value to divisor.

Find the line where dividing by zero occurs and change the code in the form of y/x to the form y/(x+1e-5).

Adjust the size of the small number, paying attention to the range of numbers that you are dealing with.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文