C-正向模式的计算效率自动与数字与符号分化



我正在尝试使用c语言中使用牛顿 - 拉夫森(NR(方法来查找函数的根的问题。我想找到根的功能主要是多项式函数,但也可能包含三角和对数。

NR方法需要找到函数的差异。有3种实施差异化的方法:

  • 符号
  • 数字
  • 自动(sub类型是向前模式和反向模式。对于这个特定的问题,我想关注向前模式(

我有成千上万的功能都需要在最快的时间内找到根源。

从我所知道的一点来看,自动差异通常比符号更快,因为它可以更有效地处理"表达膨胀"的问题。

因此,我的问题是,所有其他方面都是平等的,哪种分化方法在计算上更有效:自动分化(更具体地说,是向前模式(或数字差异化?

如果您的功能确实是所有多项式,则符号衍生物很简单。让多项式的系数存储在带有条目p[k] = a_k的数组中,其中索引k对应于x^k的系数,然后衍生物由带有条目dp[k] = (k+1) p[k+1]的数组表示。对于多元多项式,这直接扩展到多维阵列。如果您的多项式不采用标准形式,例如如果它们包括诸如(x-a)^2((x-a)^2-b)^3之类的术语或其他任何术语,则需要进行一些工作才能将它们转换为标准形式,但这是您无论如何都应该做的事情。

如果衍生物不可用,则应考虑使用secant或regula falsi方法。它们具有非常不错的收敛速度(φ-order而不是二次(。falsi的另一个好处是,迭代仍然局限于初始间隔,这允许可靠的根部分离(牛顿不这样做(。

还要注意的是,在衍生物的数值评估中,您将需要对其中两个函数进行几个计算。然后,实际收敛速度降至√2,√2均优于无衍生方法。

还指出,与功能本身相比,评估衍生物的符号表达通常更为昂贵。因此,牛顿的一次迭代至少要进行两次功能评估,破坏了收敛率的好处。

相关内容

  • 没有找到相关文章

最新更新