首页 > 解决方案 > 在 x,y=0 处评估具有明确定义值的函数

问题描述

我正在尝试编写一个在进一步计算中使用数组的程序。我使用 NumPy 初始化一个等距点的网格,并根据下面提供的代码片段在每个点上分配一个值。我试图用这个数组描述的函数在 x=y 处给我一个除以 0 的错误,它通常会在它周围爆炸。我知道所述函数的实部band_D/(2*math.pi) 以 x=y 为界,我尝试在对角线上手动分配这个值,但它周围的点似乎仍然表现不佳,所以我没有得到任何正确的值。有没有办法解决这个问题?这就是函数在 matplotlib 中的样子

gamma=5
band_D=100
Dt=1e-3
x = np.arange(0,1/gamma,Dt)
y = np.arange(0,1/gamma,Dt)
xx,yy= np.meshgrid(x,y)
N=x.shape[0]
di = np.diag_indices(N)

time_fourier=(1j/2*math.pi)*(1-np.exp(1j*band_D*(xx-yy)))/(xx-yy)
time_fourier[di]=band_D/(2*math.pi)

标签: pythonnumpymath

解决方案


你有一个经典的0 / 0问题。弄清楚申请 De L'Hospital 并为您解决这个问题并不是 Numpy 的真正工作......我看到,正如其他人所评论的那样,您尝试在对角线上设置极限值是正确的想法(其中x大约y) ,但是当你到达那条线时,警告已经发出(只是一个警告,顺便说一句,不是例外)。

为了快速修复(但有点软糖),在这种情况下,您可以尝试为差异添加一个小值:

xy = xx - yy + 1e-100
num = (1j / 2*np.pi) * (1 - np.exp(1j * band_D * xy))
time_fourier = num / xy

这也表明您的极限计算有问题......(time_fourier[0,0]大约157.0796...,不是15.91549...)。

而不是band_D / (2*math.pi)

为了正确计算:

def f(xy):
    mask = xy != 0
    limit = band_D * np.pi/2
    return np.where(mask, np.divide((1j/2 * np.pi) * (1 - np.exp(1j * band_D * xy)), xy, where=mask), limit)

time_fourier = f(xx - yy)

推荐阅读