NIntegrate无法收敛到不在我的定积分内的点附近?

Oct*_*iaQ 7 wolfram-mathematica

我试图计算一个确定的积分.我写:

NIntegrate[expression, {x, 0, 1}, WorkingPrecision -> 100]
Run Code Online (Sandbox Code Playgroud)

"表达"描述如下.添加了WorkingPrecision以帮助解决另一个错误.

我收到一个错误:

"NIntegrate :: ncvb:NIntegrate在{x} = {<< 156 >>}附近的9个递归二分之后未能收敛到规定的精度.NIntegrate获得了<< 157 >>和<< 160 >>的积分和误差估计.>>"

near{x} = {<<156>>}当我只看时,为什么会出现此错误0<x<1?数字周围的双尖括号是什么意思?

表达式真的很长,所以我认为展示如何生成它会更有意义.这是一个基本版本(一些指数我需要变量,但这些是最低值,我仍然得到错误).

F[n_] := (1 - (1 - F[n-1])^2)^2;
F[0] = x;
Expr[n_]:= (1/(1-F[n]))Integrate[D[F[n],x]*x,{x,x,1}];
Run Code Online (Sandbox Code Playgroud)

当我集成Expr [3]或更高版本时,我收到错误.奇怪的是,当我使用常规积分然后在最后使用// N时,我得到一个n = 2的复数.

abc*_*bcd 18

<<156>>并不意味着正在评估积分x=156.<<>>被调用Skeleton,用于表示大输出被抑制.从文档:

Skeleton[n] 表示nShort或打印的表达式中的一系列省略元素Shallow.标准打印表格Skeleton<<n>>.


来到你的积分,这是我得到的错误:

在此输入图像描述

因此,您可以看到这个长数字在您的情况下被抑制(取决于您的偏好).最后>>一个链接将您带到文档中的相应错误消息.

如果你尝试增加文档中的建议MaxRecursion,你最终会得到一个新的错误::slwcon

在此输入图像描述

所以这现在告诉你,要么你WorkingPrecision的太小,要么你有一个奇点(这是由一个小的工作精度引起的).增加WorkingPrecision200提供以下输出:

在此输入图像描述


您可以进一步了解表达式的本质.

num = Numerator@Expr@3;
den = Denominator@Expr@3;
Plot[{num, den}, {x, 0, 1}, WorkingPrecision -> 100, PlotRange -> All]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

因此,超过0.7ish,你的表达可能会出现严重的稳定性问题,导致出现奇点.它是分子而不是分母,需要高精度才能收敛到正确的值.

num /. x -> 0.99
num /. x -> 0.99`100

Out[1]= -0.015625
Out[2]= 1.2683685178049112809413795626911317545171610885215799438968\
06379991565*10^-14

den /. x -> 0.99
den /. x -> 0.99`100

Out[3]= 1.28786*10^-14
Out[4]= 1.279743968014714505561671861369465844697720803022743298030747945923286\
915425027352809730413954909*10^-14
Run Code Online (Sandbox Code Playgroud)

当你没有足够的精度时,你可以看到分子和分母之间的差异,导致接近奇点.

  • 这只是因为不稳定导致的"0"左右的波动.如果你只保留分子中的前两个项并在'x = 0.99`处计算,那么你得到一个负项.精度不足的情况是高阶项有效为零.通过提高精确度,每个术语的微小贡献都会复合并增加,从而得到接近正确的结果. (3认同)