我正在用Python编写程序,我需要找到函数的导数(以字符串表示的函数)。

  • 例如: x^2+3*x
  • 其导数为: 2*x+3

有可用的脚本吗?或者您可以告诉我一些有用的信息吗?

有帮助吗?

解决方案

同情 做得很好。

其他提示

如果您仅限于多项式(似乎是这种情况),则基本上需要三个步骤:

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

如果您需要处理多项式,例如 a*x^15125 + x^2 + c, , 用一个 dict 因为系数列表可能有意义,但在通过该列表进行迭代时需要多加注意。

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

该业务基于算子重载和导数的链式法则。例如,导数 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

链式法则允许您“链接”操作:每个单独的导数都很简单,你只需将复杂性“链接”起来即可。另一个例子,导数 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

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

现在,运算符重载。

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

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

干杯,

胡安

符号微分 是对这个主题的令人印象深刻的介绍——至少对于像我这样的非专业人士来说:)顺便说一句,代码是用 C++ 编写的。

抬头 自动微分. 。有 Python 工具. 。还, .

迟到总比不到好?

我总是通过使用解析树来对任何语言进行符号微分。但我最近也意识到另一种方法使用 复数.

解析树方法包括将以下微小的 Lisp 代码翻译成您喜欢的任何语言:

(defun diff (s x)(cond
  ((eq s x) 1)
  ((atom s) 0)
  ((or (eq (car s) '+)(eq (car s) '-))(list (car s)
    (diff (cadr s) x)
    (diff (caddr s) x)
    ))
  ; ... and so on for multiplication, division, and basic functions
  ))

然后使用适当的化简器,这样就可以去掉 0 的加法、乘以 1 等。

但复杂的方法虽然完全是数字化的,但具有一定的神奇品质。不要以双精度对计算 F 进行编程,而以双精度复数进行。然后,如果需要计算变量 X 的导数,请将 X 的虚部设置为非常小的数字 h,例如 1e-100。然后进行计算,得到结果R。现在,真实(R)是您通常会得到的结果,并且Imag(R)/H = DF/DX的精度非常高!

它是如何工作的?以复数相乘为例:

(a+bi)(c+di) = ac + i(ad+bc) - bd

现在假设虚部全部为零,除非我们想要关于 a。我们设置 b 为极少数 h. 。现在我们得到什么?

(a+hi)(c) = ac + hci

所以真正的部分是 ac, ,如您所料,虚部除以 h, , 是 c, ,这是 ac 关于 a.

同样的推理似乎适用于所有微分规则。

如果您正在考虑从头开始编写微分程序,而不利用其他库作为帮助,那么我在中描述的计算任何代数方程的导数的算法/方法 我的博客 会有帮助的。

您可以尝试创建一个严格表示极限的类,然后当 x 接近 a 时评估它的 (f(x)-f(a))/(x-a)。这应该给出一个相当准确的极限值。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top