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

时间:2017-06-07 19:53:20

标签: c numerical-methods symbolic-math differentiation automatic-differentiation

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

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

  • 符号
  • 数值
  • 自动(子类型为正向模式和反向模式。对于这个特殊问题,我想专注于正向模式)

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

从我所知道的一点点来看,自动分化通常比符号更快,因为它处理了表达式膨胀的问题"更有效率。

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

2 个答案:

答案 0 :(得分:2)

如果你的函数是真正的所有多项式,那么符号导数就很简单了。假设多项式的系数存储在具有条目p[k] = a_k的数组中,其中索引k对应于x ^ k的系数,则导数由具有条目dp[k] = (k+1) p[k+1]的数组表示。对于多变量多项式,这直接扩展到多维数组。如果多项式不是标准形式,例如如果他们包含(x-a)^2((x-a)^2-b)^3之类的术语或其他任何内容,则需要做一些工作才能将它们转换为标准形式,但这可能是您应该做的事情。

答案 1 :(得分:1)

如果衍生物不可用,您应该考虑使用割线或规则falsi方法。它们具有非常好的收敛速度(φ-阶而不是二次)。调节falsi的另一个好处是,迭代仍然局限于初始间隔,这允许可靠的根分离(牛顿不会)。

另外请注意,与衍生物的数值评估相比,您需要对函数进行多次计算,最多只需要两次。然后实际收敛速度下降到√2,这比无导数方法更胜一筹。

还要注意,导数的符号表达式通常比函数本身更昂贵。因此牛顿的一次迭代至少花费了两次函数评估,破坏了收敛速度的好处。