Dix*_*osa 3 math calculus derivative
我正在用Python编写程序,我需要找到一个函数的派生(一个表示为字符串的函数).
x^2+3*x2*x+3有没有可用的脚本,或者有什么有用的东西可以告诉我吗?
如果你只限于多项式(看起来是这种情况),基本上会有三个步骤:
如果你需要处理类似的多项式a*x^15125 + x^2 + c,使用a dict作为系数列表可能有意义,但在通过此列表进行迭代时需要更多注意.
您可能会在已经提供的答案中找到您正在寻找的内容。然而,我想对如何计算符号导数给出一个简短的解释。
该业务基于算子重载和导数的链式法则。例如, 的导数v^n是n*v^(n-1)dv/dx,对吧?那么,如果有v=3*x和n=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*v是v*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++ 代码)。但了解这些东西如何运作总是很有趣的。