python - 在 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)
解决方案
你有一个经典的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)
推荐阅读
- jetbrains-ide - 是否可以禁用库中的导航?
- acumatica - 如何在网格中添加一列以显示 Acumatica 中另一个屏幕的值?
- node.js - 为什么 nodemon 在终端中抛出一些错误?
- ruby-on-rails - 将 AWS Red Shift 与 Rails 项目连接起来
- ios - 所选文本的范围与实际 html 属性字符串的范围不同
- python - 如何编写一个约束,使 1 个任务仅由 1 个工人完成 | 谷歌或工具| 调度问题
- arrays - 我的二维数组创建和打印的 C 代码不返回任何值
- mysql - Elasticseach 查询时区
- postgresql - Databricks 错误:org.postgresql.util.PSQLException:不支持身份验证类型 10
- javascript - 如何在typeorm中加入树结构中的每个子实体