首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求导数的算法

求导数的算法
EN

Stack Overflow用户
提问于 2009-11-22 20:23:59
回答 10查看 25.2K关注 0票数 4

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

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

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

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-11-22 20:25:58

同情做得很好。

票数 5
EN

Stack Overflow用户

发布于 2009-11-22 20:34:58

如果你被限制在多项式(似乎是这样),基本上有三个步骤:

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

如果您需要处理像a*x^15125 + x^2 + c这样的多项式,那么对系数列表使用一个dict可能是有意义的,但是在通过这个列表进行迭代时需要更多的注意。

票数 6
EN

Stack Overflow用户

发布于 2009-11-25 08:10:54

你可能会在已经提供的答案中找到你正在寻找的东西。然而,我想简单地解释一下如何计算符号导数。

业务的基础是经营者超载和衍生产品的链规则。例如,v^n的导数是n*v^(n-1)dv/dx,对吗?那么,如果你有v=3*xn=3,那么导数是什么?答案是:如果是f(x)=(3*x)^3,那么导数是:

代码语言:javascript
复制
f'(x)=3*(3*x)^2*(d/dx(3*x))=3*(3*x)^2*(3)=3^4*x^2

链规则允许您“连锁”操作:每个单独的导数都是简单的,而您只是“连锁”的复杂性。另一个例子,u*v的导数是v*du/dx+u*dv/dx,对吗?如果你有一个复杂的函数,你只需把它链起来,就说:

代码语言:javascript
复制
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

正如你所看到的,微分只是一个简单的操作链。

现在操作人员超载。

如果您可以编写一个解析器(尝试编写语法分析器),那么您可以请求它同时计算函数和导数!我这样做(使用Flex/Bison)只是为了好玩,它非常强大。为了得到这个想法,通过重载相应的操作符并递归地应用链式规则来递归地计算导数,所以"*"的计算值对应于函数值u*v,而导数值则是u*der(v)+v*der(u) (在C++中尝试,这也很有趣)。

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

干杯,

胡安

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1779867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档