4

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

  • 例如:x^2+3*x
  • 它的导数是:2*x+3

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

4

10 回答 10

6

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

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

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

于 2009-11-22T20:34:58.850 回答
5

sympy做得很好。

于 2009-11-22T20:25:58.577 回答
4

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

业务基于算子重载和衍生品的链式法则。例如,是 的导数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++ 代码)。但是知道这些东西是如何工作的总是很有趣。

干杯,

胡安

于 2009-11-25T08:10:54.587 回答
3

Symbolic Differentiation is an impressive introduction to the subject-at least for non-specialist like me :) The code is written in C++ btw.

于 2009-11-22T20:59:52.117 回答
3

迟到总比不到好?

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

解析树方法包括将以下微小的 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。现在 real(R) 是您通常会得到的结果,而 imag(R)/h = dF/dX 的精度非常高!

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

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

现在假设虚部都为零,除了我们想要关于 的导数a。我们设置b为一个很小的数字h。现在我们得到了什么?

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

因此ac,正如您所期望的那样,它的实部是 ,而除以 的虚部hc,它是关于 的导aca

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

于 2016-05-17T20:08:47.423 回答
2

查找自动微分。有Python 的工具。另外,.

于 2009-11-22T21:51:21.790 回答
1

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

于 2017-05-23T05:58:01.603 回答
0

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

于 2014-11-26T04:13:22.553 回答
0

如果您使用字符串作为输入,您可以使用 + 或 - 字符作为分隔符分隔各个术语,这将为您提供各个术语。现在您可以使用幂规则来解决每个项,假设您有 x^3,使用幂规则会给您 3x^2,或者假设您有一个更复杂的项,例如 a/(x^3) 或 a(x^ -3),您可以再次将其他变量作为常数单独列出,现在求解 x^-3 将为您提供 -3a/(x^2)。单独的幂规则就足够了,但是它需要大量使用分解。

于 2021-01-31T08:59:36.637 回答
-2

除非任何已经生成的库派生它都非常复杂,因为您需要解析和处理函数和表达式。

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

于 2009-11-22T20:27:10.050 回答