我正在尝试使用C语言中的Newton-Raphson(NR)方法来解决查找函数根的问题。我想找到根的函数主要是多项式函数,但也可能包含三角函数和对数函数。
NR方法需要找到函数的微分。有三种方法可以实现差异化:
我有成千上万的这些功能都需要在尽可能最快的时间内找到根源。
从我所知道的一点点来看,自动分化通常比符号更快,因为它处理了表达式膨胀的问题"更有效率。
因此,我的问题是,在所有其他条件相同的情况下,哪种区分方法在计算上更有效:自动微分(更具体地说,正向模式)或数字微分?
答案 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,这比无导数方法更胜一筹。
还要注意,导数的符号表达式通常比函数本身更昂贵。因此牛顿的一次迭代至少花费了两次函数评估,破坏了收敛速度的好处。