我希望在SciPy中复制以下MATLAB代码的结果.

MATLAB Version:

f = @(x, y) besselh(0, 2, x.^2 + y.^2);
integral2(f, -0.1, 0.1, -0.1, 0.1)

MatLab结果为:

ans = 
    0.0400 + 0.1390i

SciPy Version:

f = lambda x, y: scipy.special.hankel2(0, x**2 + y**2)
scipy.integrate.dblquad(f, -0.1, 0.1, lambda x: -0.1, lambda x: 0.1)

但是,当我运行SciPy代码时,我收到以下警告:

IntegrationWarning: The occurrence of roundoff error is detected ...

并且结果与MatLab的输出不同:

(nan, 2.22e-15)

有没有人能解释一下为什么我会收到这个警告,以及如何获得类似于MatLab的结果?

推荐答案

我认为问题是积分穿过原点,这就产生了H0的NaN.这是因为H0=J0-i*Y0,而Y0使y轴渐近.

对于这种特定的情况,您可以使用上面的H0定义将积分分成实数部分和复数部分.这样做时,可以确保积分的复数部分不会超过0.

import scipy

j0 = lambda x, y: scipy.special.jv(0, x**2 + y**2)
y0 = lambda x, y: scipy.special.yv(0, x**2 + y**2)
r1 = scipy.integrate.dblquad(j0, -0.1, 0.1, -0.1, 0.1)
r21 = scipy.integrate.dblquad(y0, 1e-10, 0.1, -0.1, 0.1)
r22 = scipy.integrate.dblquad(y0, -0.1, -1e-10, -0.1, 0.1)
res = r1[0] - 1j*(r21[0]+r22[0])  # 0.039999377783047595+0.13896313686573833j

Python相关问答推荐

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

有症状地 destruct 了Python中的regex?

从numpy数组和参数创建收件箱

发生异常:TclMessage命令名称无效.!listbox"

PMMLPipeline._ fit()需要2到3个位置参数,但给出了4个位置参数

NP.round解算数据后NP.unique

Pandas计数符合某些条件的特定列的数量

Python+线程\TrocessPoolExecutor

有没有一种ONE—LINER的方法给一个框架的每一行一个由整数和字符串组成的唯一id?

Plotly Dash Creating Interactive Graph下拉列表

从列表中获取n个元素,其中list [i][0]== value''

如何在Python中使用Iscolc迭代器实现观察者模式?

如何合并具有相同元素的 torch 矩阵的行?

什么是一种快速而优雅的方式来转换一个包含一串重复的列,而不对同一个值多次运行转换,

如何用FFT确定频变幅值

如何设置nan值为numpy数组多条件

极点替换值大于组内另一个极点数据帧的最大值

按列表分组到新列中

如何让PYTHON上的Selify连接到现有的Firefox实例-我无法连接到Marionette端口

如何计算Pandas 中具有特定条件的行之间的天差