找到导数的算法

Dix*_*osa 3 math calculus derivative

我正在用Python编写程序,我需要找到一个函数的派生(一个表示为字符串的函数).

  • 例如: x^2+3*x
  • 它的衍生物是: 2*x+3

有没有可用的脚本,或者有什么有用的东西可以告诉我吗?

ndi*_*dim 5

如果你只限于多项式(看起来是这种情况),基本上会有三个步骤:

  1. 将输入字符串解析为x ^ n的系数列表
  2. 取该系数列表,并根据导出多项式的规则将它们转换为新的系数列表.
  3. 获取导数的系数列表,并创建一个描述导数多项式函数的漂亮字符串.

如果你需要处理类似的多项式a*x^15125 + x^2 + c,使用a dict作为系数列表可能有意义,但在通过此列表进行迭代时需要更多注意.


Esc*_*alo 5

您可能会在已经提供的答案中找到您正在寻找的内容。然而,我想对如何计算符号导数给出一个简短的解释。

该业务基于算子重载和导数的链式法则。例如, 的导数v^nn*v^(n-1)dv/dx,对吧?那么,如果有v=3*xn=3,导数是什么?答案:如果f(x)=(3*x)^3,则导数为:

f'(x)=3*(3*x)^2*(d/dx(3*x))=3*(3*x)^2*(3)=3^4*x^2
Run Code Online (Sandbox Code Playgroud)

链式法则允许您“链接”操作:每个单独的导数都很简单,而您只需“链接”复杂性即可。另一个例子, 的导数u*vv*du/dx+u*dv/dx,对吗?如果你得到一个复杂的函数,你只需将它链接起来,比如:

d/dx(x^3*sin(x))
u=x^3; v=sin(x)
du/dx=3*x^2; dv/dx=cos(x)
d/dx=v*du+u*dv
Run Code Online (Sandbox Code Playgroud)

如您所见,微分只是一系列简单的操作。

现在,运算符重载。

如果您可以编写一个解析器(尝试 Pyparsing),那么您可以要求它评估函数和导数!我这样做(使用 Flex/Bison)只是为了好玩,而且它非常强大。为了让您明白这个想法,导数是通过重载相应的运算符并递归地应用链式法则来递归计算的,因此 的求值"*"将对应于函数值和u*der(v)+v*der(u)导数值的 u*v (在 C++ 中尝试一下,它是也很有趣)。

好了,我知道您并不是要编写自己的解析器 - 无论如何都要使用现有代码(访问www.autodiff.org以自动区分 Fortran 和 C/C++ 代码)。但了解这些东西如何运作总是很有趣的。


Jac*_*ack -2

除非任何已经制作的库派生它是相当复杂的,因为您需要解析和处理函数和表达式。

单独推导它是一项简单的任务,因为它是机械的并且可以通过算法完成,但您需要一个基本结构来存储函数。