是否有找到渐近斜率的数值算法?

计算科学 算法
2021-12-08 21:02:11

我有一系列数据点我希望(大约)遵循一个函数渐近线到大本质上,接近于零,对于所有导数等。但是我不知道f(x)的函数形式是什么,如果它甚至有一个可以用基本函数来描述的形式。(xi,yi)y(x)xf(x)y(x)(ax+b)xf(x)f(x)f(x)

我的目标是获得渐近斜率a的最佳估计值a显而易见的粗略方法是挑选最后几个数据点并进行线性回归,但是如果f(x)在我有数据的xf(x)范围内没有变得“足够平坦”,这当然是不准确的。明显不那么粗暴的方法是假设f(x) \approx \exp(-x)(或其他一些特定的函数形式)并使用所有数据来适应它,但我尝试过的简单函数如\exp (-x)\dfrac1{x}与较低x处的数据不完全匹配,其中f(x)xf(x)exp(x)exp(x)1xxf(x)很大。鉴于我对数据如何接近渐近线的确切了解缺乏了解,是否有一种已知的算法来确定渐近斜率会做得更好,或者可以为斜率提供一个值以及置信区间?


在我处理各种数据集的工作中,这类任务往往会经常出现,所以我最感兴趣的是通用解决方案,但根据要求,我将链接到提示这个问题的特定数据集。正如评论中所描述的,Wynn ϵ算法给出的值,据我所知,有点偏离。这是一个情节:

渐近线性数据

(看起来在高 x 值处有一条轻微的下降曲线,但该数据的理论模型预测它应该是渐近线性的。)

1个回答

这是一个相当粗略的算法,但我会使用以下程序进行粗略估计:如果,正如你所说,代表你的的增加已经几乎是线性的,我' d 做的是取差异,然后使用像Shanks 变换这样的外推算法来估计差异的极限。结果有望很好地估计这个渐近斜率。f(x)(xi,yi)xyi+1yixi+1xi


下面是一个Mathematica演示。Wynn算法是 Shanks 变换的一种方便实现,它作为(隐藏)函数内置我们在函数上试一下程序ϵSequenceLimit[]

4x2+3+2x+e4x+3

xdata = RandomReal[{20, 40}, 25];
ydata = Table[(3 + 13*E^(4*x) + 6*E^(4*x)*x + x^2 + 3*E^(4*x)*x^2 + 
      2*E^(4*x)*x^3)/(E^(4*x)*(3 + x^2)), {x, xdata}];

SequenceLimit[Differences[ydata]/Differences[xdata],
              Method -> {"WynnEpsilon", Degree -> 2}]
1.999998

我不妨炫耀一下算法有多简单:

wynnEpsilon[seq_?VectorQ] := 
 Module[{n = Length[seq], ep, res, v, w}, res = {};
  Do[ep[k] = seq[[k]];
   w = 0;
   Do[v = w; w = ep[j];
    ep[j] = 
     v + (If[Abs[ep[j + 1] - w] > 10^-(Precision[w]), ep[j + 1] - w, 
         10^-(Precision[w])])^-1;, {j, k - 1, 1, -1}];
   res = {res, ep[If[OddQ[k], 1, 2]]};, {k, n}];
  Flatten[res]]

Last[wynnEpsilon[Differences[ydata]/Differences[xdata]]]
1.99966

此实现改编自Weniger 的论文