python中贝塞尔函数的集成:细分问题

python中贝塞尔函数的集成:细分问题,python,integration,singular,bessel-functions,Python,Integration,Singular,Bessel Functions,我试图在曲面上积分以下等式: 强度=(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=rcos(p

我试图在曲面上积分以下等式: 强度=(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=rcos(phi)和y=rsin(phi) 但当我尝试集成该功能时,我得到了以下信息:

C:\pyzo2013b\Lib\pyzo-packages\scipy\integrate\quadpack.py:289: UserWarning:已设置最大细分数(50) 实现。如果提高限值不会带来任何改善,那么它就是 建议分析被积函数以确定 困难。如果一个地方的位置有困难可以 确定(奇点、不连续性)一个人可能从 拆分间隔并调用上的积分器 子范围。也许应该使用专用积分器。
警告。警告(msg)

然后是一个完全不符合要求的结果,然后是:

C:\pyzo2013b\Lib\pyzo-packages\scipy\integrate\quadpack.py:289: 用户警告:积分可能发散,或缓慢收敛。 警告。警告(msg)

我确实理解这些信息的含义,但我有两个问题:

  • 除了将积分区间划分成更小的段之外,还有什么方法可以避免这种细分错误吗(我想通过将它们与无限域上的范数进行比较来检查我的其他结果,如果我不能在无限域上正确积分,我将无法这样做)?也许有一个特殊用途的积分器?但我不知道它是什么,也不知道如何使用它们
  • 为什么我会得到一个关于发散积分或奇点的警告,知道当z收敛到零时J1(z)/(z)收敛到1(就像一个正弦基数)
有人有答案吗

以下是完整的有用代码行(所有其他参数均以其他方式定义):


(为了更好地理解函数,我根据GBOFI的建议对其进行了修改。)

我错了,还是您的结果不依赖于
mu1
mu2
?如果用
R
命名从
P=(mu1,mu2)
的(缩放)距离,则除幂外,被积函数是
jv(1,R)/R
,且不依赖于
phi
,因此,您可以避免二重积分。@GBOFI mu1和mu2应该在这里移动我的曲线的中心,并且由于函数random.gauss(它本身取决于sigma(t)的时间),根据正态分布随机生成。事实上,一开始我是在X和Y上积分,但我意识到我会被建议使用极坐标来减少积分面积。但是现在我不确定μ1和μ2是否只与光束(曲线)中心相互作用,我可能忘记了用极坐标对它们进行变换。一维的想法是用μ的平均值控制光束中心(红色曲线)。让我们试着简化你的表达式:
x,y=r cos phi,r sin phi
፨ <代码>X,Y=X-mu1,Y-mu2፨ <代码>R=sqrt(X**2+Y**2
፨ <代码>标度R=R*Dt*π/(λ*L)፨ <代码>被积函数=4*jv(1,缩放)**2/缩放**2፨ 被积函数只取决于距离你所说的光束中心的距离。你所写的东西可能不是你想写的吗?好吧,我们的想法是取圆孔的1D Franhofer衍射方程,并在二维中使用它。原始方程由
integrand=4*jv给出(1,scale_R)**2/scaled_R**2
带有
scaled_R=d*Dt*π/(λ*L)
。现在,我用你描述的R代替d。我可以在x和y上积分,得到函数形状的这个结果(这里mu1=mu2=0),但我选择在极坐标上积分。函数值不依赖于φ,但我需要在曲面上积分。我错了,或者你的结果不依赖于
mu1
mu2
?如果你用
P=(mu1,mu2)
R
命名(缩放)距离,则被积函数是,除幂外,
jv(1,R)/R
,不依赖于φ,因此可以避免二重积分。@GBOFI mu1和mu2应该在这里移动曲线的中心,并根据正态分布随机生成,这要归功于函数random.gauss,它本身取决于时间和σ(t).事实上,一开始我是在X和Y上积分,但我意识到建议我使用极坐标来减小积分面积。但现在我不确定mu 1和mu 2是否只与光束(曲线)相互作用中心,我可能忘了用极坐标变换它们。一维中的想法是用平均值mu控制光束中心(红色曲线)。让我们试着简化你的表达式:
x,y=r cos phi,r sin phi
፨ <代码>X,Y=X-mu1,Y-mu2፨ <代码>R=sqrt(X**2+Y**2፨ <代码>标度R=R*Dt*π/(λ*L)፨ <代码>被积函数=4*jv(1,缩放)**2/缩放**2፨ 被积函数只取决于距离你所说的光束中心的距离。你所写的东西可能不是你想写的吗?好吧,我们的想法是取圆孔的1D Franhofer衍射方程,并在二维中使用它。原始方程由
integrand=4*jv给出(1,scale_R)**2/scaled_R**2
带有
scaled_R=d*Dt*π/(λ*L)
。现在,我用你描述的R代替d。我可以在x和y上积分,得到函数形状的这个结果(这里mu1=mu2=0)但我选择在极坐标上积分。函数值不依赖于φ,但我需要在曲面上积分
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)