C 前向模式自动微分与数值微分与符号微分的计算效率

C 前向模式自动微分与数值微分与符号微分的计算效率,c,numerical-methods,symbolic-math,differentiation,automatic-differentiation,C,Numerical Methods,Symbolic Math,Differentiation,Automatic Differentiation,我试图用C语言中的Newton-Raphson(NR)方法解决一个求函数根的问题。我想求根的函数主要是多项式函数,但也可能包含三角函数和对数函数 NR方法要求找到函数的微分。实施差异化有三种方法: 象征性 数字的 自动(子类型为正向模式和反向模式。对于这个特殊问题,我想重点讨论正向模式) 我有数千个这样的函数,所有这些函数都需要在尽可能快的时间内找到根 据我所知,一般来说,自动微分比符号微分更快,因为它能更有效地处理“表达式膨胀”的问题 因此,我的问题是,在所有其他条件相同的情况下,哪种微分

我试图用C语言中的Newton-Raphson(NR)方法解决一个求函数根的问题。我想求根的函数主要是多项式函数,但也可能包含三角函数和对数函数

NR方法要求找到函数的微分。实施差异化有三种方法:

  • 象征性
  • 数字的
  • 自动(子类型为正向模式和反向模式。对于这个特殊问题,我想重点讨论正向模式)
我有数千个这样的函数,所有这些函数都需要在尽可能快的时间内找到根

据我所知,一般来说,自动微分比符号微分更快,因为它能更有效地处理“表达式膨胀”的问题


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

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

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

还请注意,与导数的数值计算相比,您需要对函数进行多次计算,最多两次。然后实际收敛速度下降到√2,其表现优于无导数方法


还要注意,导数的符号表达式通常比函数本身的计算成本更高。因此,牛顿的一次迭代至少要花费两次函数求值,破坏了收敛速度的优势。

我可能遗漏了一些东西,但如果你只处理多项式函数,那么直接找到微分函数。aX^n->naX^n-1我的道歉,后期编辑。它们大多包含多项式,但也可以包含其他更复杂的表达式。如何显示触发器和日志?是否有多项式的三角函数,或多项式的对数等。?(例如,在有限的加法和乘法步骤下,这是涉及x、sin(a+bx)、cos(a+bx)和log(a+b*x)的函数的完整空间吗)?或者它们是简单的触发器、日志——可能是x的幂函数空间、简单触发器和简单日志在加法下完成?简言之,对上述所有内容都是肯定的,即需要应用链式规则对其进行评估。也就是说,trig函数可以包含多项式,例如sin(2x^2+3x),对数函数可以包含多项式,例如ln | 2x^2 |。正确,涉及多项式、三角函数和逻辑函数的完整函数空间可以识别纯多项式函数,并将其作为特例处理,因为微分函数易于计算。对于更复杂的函数,我不确定,但我想我会开始尝试数值方法。我的道歉,后期编辑。它们大多包含多项式,但也可以包含其他更复杂的函数expressions@4386427在C中,是的;我写这篇文章时没有考虑任何编程语言。我希望你能接受我的建议。我投票赞成regula falsi的建议——从未听说过。我真的很好奇专有软件包使用什么样的方法Matlab@DeanP:最可能的是更复杂的方法,包括括号和处理多个根。