2

我正在尝试使用 C 语言中的 Newton-Raphson (NR) 方法来解决查找函数根的问题。我想在其中找到根的函数主要是多项式函数,但也可能包含三角函数和对数函数。

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

  • 象征性的
  • 数字
  • 自动(子类型为正向模式和反向模式。对于这个特定问题,我想专注于正向模式)

我有数千个这样的功能,所有这些功能都需要在尽可能快的时间内找到根源。

据我所知,自动微分通常比符号更快,因为它更有效地处理“表达膨胀”问题。

因此,我的问题是,在所有其他条件相同的情况下,哪种微分方法的计算效率更高:自动微分(更具体地说,正向模式)还是数值微分?

4

2 回答 2

3

如果您的函数确实都是多项式,那么符号导数非常简单。让多项式的系数存储在一个带有条目的数组中p[k] = a_k,其中索引 k 对应于 x^k 的系数,那么导数由带有条目的数组表示dp[k] = (k+1) p[k+1]。对于多变量多项式,这直接扩展到多维数组。如果您的多项式不是标准形式,例如,如果它们包含诸如(x-a)^2或之类的术语((x-a)^2-b)^3,则需要做一些工作才能将它们转换为标准形式,但这可能是您无论如何都应该做的事情。

于 2017-06-07T20:01:22.917 回答
2

如果导数不可用,则应考虑使用正割法或正则法。它们具有非常好的收敛速度(φ阶而不是二次)。regula falsi 的另一个好处是迭代仍然局限于初始间隔,这允许可靠的根分离(牛顿没有)。

另请注意,在导数的数值评估的情况下,您将需要对函数进行多次计算,最多两次。然后实际收敛速度下降到√2,这优于无导数方法。

另请注意,导数的符号表达式通常比函数本身的计算成本更高。因此,牛顿的一次迭代至少需要两次函数评估,从而破坏了收敛速度的好处。

于 2017-06-08T22:32:30.667 回答