我试图在表面上积分以下方程:强度=(2*J1(z)/z)^2,z=A*sqrt((x-mu1)^2+(y-mu2)^2), A(L) x 和 y 的常数和 J1 一阶贝塞尔函数。为此,我使用 dblquad 函数,如下所示:
resultinf = dblquad(lambda r,phi:intensity(mu1,mu2,L,r,phi),0,inf,lambda phi:0,lambda phi:2*pi)
这里唯一重要的参数是极坐标中的 r 和 phi(其他参数取决于此处不重要的其他参数),其中 x=r cos(phi) 和 y=r sin(phi) 但是当我尝试整合函数时,我得到了这个信息:
C:\pyzo2013b\Lib\pyzo-packages\scipy\integrate\quadpack.py:289:UserWarning:已达到最大细分数(50)。如果增加限制没有改善,建议分析被积函数以确定困难。如果可以确定局部难度的位置(奇点、不连续性),则可能会从拆分区间并调用子范围上的积分器中获益。也许应该使用专用的积分器。
警告。警告(味精)
然后是一个完全不准确的结果,然后是:
C:\pyzo2013b\Lib\pyzo-packages\scipy\integrate\quadpack.py:289:UserWarning:积分可能是发散的,或者是慢慢收敛的。警告。警告(味精)
我确实理解此消息的含义,但我有两个问题:
- 除了将我的积分区间划分为更小的部分之外,我还有什么方法可以避免这种细分错误(我想通过将它们与无限域上的范数进行比较来检查我的其他结果,我将无法做到所以如果我不能正确整合无限域)?也许有一个特殊用途的集成商?但我不知道它是什么或如何使用它们。
- 为什么当 z 收敛到零时(就像窦基数一样),我知道 J1(z)/(z) 收敛到 1 时会收到关于发散积分或奇点的警告?
有人有答案吗?
这是完整的有用代码行(所有其他参数都以其他方式定义):
def intensity(mu1,mu2,L,r,phi):# distribution area for a diffracted beam
x=r*cos(phi)
y=r*sin(phi)
X=x-mu1
Y=y-mu2
R=sqrt(X**2+Y**2)
scaled_R = R*Dt *pi/(lambd*L)
return (4*(special.jv(1,scaled_R)**2/scaled_R**2)
resultinf = dblquad(lambda r,phi:intensity(mu1,mu2,L,r,phi),0,inf,lambda phi:0,lambda phi:2*pi)
print(resultinf)
(为了更好地理解该功能,我根据 gboffi 的建议对其进行了修改。)