Python 我的积分需要花费很长时间,或者在运行2个或更多小时后给出错误答案

Python 我的积分需要花费很长时间,或者在运行2个或更多小时后给出错误答案,python,numerical-integration,Python,Numerical Integration,基本上,我试图计算四元积分,这取决于四个变量,但它持续花费太多的时间,最终给出了错误的答案。它还给出了积分警告:积分可能发散,或缓慢收敛。我不知道我哪里做错了,哪里做错了。多好的锻炼啊,一大早 积分方程概述 我将使用一些屏幕截图,因为stackoverflow不支持公式 这可以重新安排为 从被积函数来看,z上的积分可以解析求解。积分中最困难的部分是s和y都接近零时。表达式最右侧的对数项和左侧平方根中的分母都将接近零 数值复杂性实验 由于您提到这需要花费很长时间,并且我们发现在积分s和y时存

基本上,我试图计算四元积分,这取决于四个变量,但它持续花费太多的时间,最终给出了错误的答案。它还给出了积分警告:积分可能发散,或缓慢收敛。我不知道我哪里做错了,哪里做错了。

多好的锻炼啊,一大早

积分方程概述 我将使用一些屏幕截图,因为stackoverflow不支持公式

这可以重新安排为

从被积函数来看,
z
上的积分可以解析求解。积分中最困难的部分是
s
y
都接近零时。表达式最右侧的对数项和左侧平方根中的分母都将接近零

数值复杂性实验 由于您提到这需要花费很长时间,并且我们发现在积分
s
y
时存在一些困难,因此第一个测试是对
F(z,y)

integrate.nqad(F[bounds,bounds\u y])
它很容易积分,所以让我们使用术语
G(w,y)
并求解三重积分

integrate.nqad(
λw,s,y:w**2*(1-fd1(w))*(1-fd123(w,y))*F(s,y),
[边界w,边界s,边界y])
速度较慢,精确到小数点后7位,运行时间为1分钟。 那么,让我们试着解析地求解
z
中的积分

z中的积分

我将利用sympy制作这件作品

导入sympy
从sympy.abc进口a、b、z
Iz=辛积分(1/(1+辛经验(2*a)+辛余弦(b*z)),z)
伊兹
那就

在我们的例子中,
b
总是非零

最终计算 上面的表达式给出了不定积分,现在计算这个表达式的差,替换
z=y
z=-y
来计算定积分。这给了我们更多的功能

def-Iwyz(w,y):
a=(w*y+w-mu)/TTF
b=1/TTF;
tz=np.tanh(b*y/2);
ea=np.exp(-2*a)
c=np.sqrt(1+2*ea);
#对数可能有问题,如果给定非正数
#将对数之和写成乘积的对数
#因为我们知道积分是正的,所以
#论点也必须是肯定的
#
#还利用tanh(-b*y/2)=-tanh(b*y/2)和重用tz
返回(ea/c)*(np.log((-c-tz)*(c+tz)/(-c+tz)*(c-tz));
最后我们可以计算初始积分为

integrate.nqad(lambda w,s,y:w**2*(1-fd1(w))*(1-fd123(w,y))*F(s,y)*Iwyz(w,y),[bounds_w,bounds_s,bounds_y])
数值考虑 当
w
较大时,上述积分将出现问题,因为如果
a
b*y
较大,则
c
tz
将非常接近。然后可以应用近似值

考虑一下您拥有的大型正
a
b*y
的情况

因此术语
log(c-tz)
可以很好地近似于
log(exp(-2*a)+2*exp(-b*y))
。您可以为
a
b*y
的四种符号组合编写类似的表达式。但是由于积分发生在非负的
w
y

更新后的函数可以是

def-Iwyz(w,y):
a=(w*y+w-mu)/TTF
如果w==0:
返回z/(np.exp(2*a)+2)
其他:
b=w/TTF;
tz=np.tanh(b*y/2);
ea=np.exp(-2*a)
c=np.sqrt(1+2*ea);
#对数可能有问题,如果给定非正数
#将对数之和写成乘积的对数
#因为我们知道积分是正的,所以
#论点也必须是肯定的
#
#还利用tanh(-b*y/2)=-tanh(b*y/2)和重用tz
eby=np.exp(-b*y)
#w和y都是非负的,我们只需要处理这个问题
如果eby+ea<1e-6:
返回(ea/c)*(2*log(2)-log(ea+2*eby))
其他:
返回(ea/c)*(np.log(abs(c+tz)/(abs(c-tz)));
您可能希望选择不同的条件切换到渐近近似,也可以选择不同的近似

如果
eby+ea<1e-6

   Wall time: 1min 5s
  (5107.5853057484455, 0.00022839419762021862)
为了评估近似值的影响,我将根据不同的条件重新计算在中应用近似值

如果
eby+ea<1e-9

3min 41s
(0.038781260929779036, 1.4898372223919173e-08)
结果匹配小数点后13位,这意味着积分的误差高于渐近近似引入的误差。

一些评论:(i)请始终发布格式良好且足够运行的代码,无需进行太多修补。(ii)你的界限包括无穷大,对吗?它们似乎不适用于F(iii)边界函数上的参数名称具有误导性(例如,边界_z(w,y,z)不接受z作为参数,但接受w,s和y),(iv)您的函数F似乎未定义点F(0,0),这是积分域的一部分,如果我理解正确(v)您的公式正确吗?integrand1(0,0,0,0)除以0(它在你的范围内)。(i)好的,我下次会注意。(ii)是的边界是正确的,但您可以替换10或20而不是无穷大。(iii)边界的参数(例如,边界_z(w,y,z)可以用任何其他字母进行更改。参数的基本用途是我们的位置参数驻留(python中的集成规则)。(iv)您可能是对的,它是未定义的,但问题是如何删除
   Wall time: 1min 5s
  (5107.5853057484455, 0.00022839419762021862)
3min 41s
(0.038781260929779036, 1.4898372223919173e-08)
Wall time: 3min 44s
(0.038781260929776414, 1.4898372223919173e-08)