Math 求导数的算法

Math 求导数的算法,math,calculus,derivative,Math,Calculus,Derivative,我正在用Python编写程序,我需要找到一个函数的导数(一个用字符串表示的函数) 例如:x^2+3*x 它的导数是:2*x+3 是否有可用的脚本,或者您可以告诉我一些有用的信息?做得很好。除非任何已经生成的库派生它非常复杂,因为您需要解析和处理函数和表达式 推导它本身是一项简单的任务,因为它是机械的,可以通过算法来完成,但你需要一个基本的结构来存储函数。如果你仅限于多项式(似乎是这样),基本上有三个步骤: 将输入字符串解析为x^n的系数列表 根据推导多项式的规则,将该系数列表转换为新的系数列

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

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

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

做得很好。

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


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

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

  • 将输入字符串解析为x^n的系数列表
  • 根据推导多项式的规则,将该系数列表转换为新的系数列表
  • 取导数的系数列表,创建一个描述导数多项式函数的漂亮字符串

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

    是一个令人印象深刻的入门,至少对于像我这样的非专家来说是这样的:代码是用C++ BWT.< /P> < P>查找的。有。另外,.

    您可以在已经提供的答案中找到您要查找的内容。一、 不过,我想简单解释一下如何计算符号导数

    该业务基于运营商超载和衍生品链规则。例如,
    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
    
    链规则允许您“链”操作:每个单独的衍生工具都很简单,而您只是“链”复杂性。另一个例子,
    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
    
    正如您所见,差异化只是一系列简单的操作

    现在,运算符重载

    如果您可以编写解析器(尝试Pyparsing),那么您可以请求它同时计算函数和导数!我这样做(使用Flex/Bison)只是为了好玩,它非常强大。为了获得这个思想,导数通过重载相应的操作符递归计算,递归地应用链规则,因此对<函数> > * >代码的评价将对应于函数值的u*v和<代码> u*dE(v)+v*DER(u)< /代码>求导值(在C++中尝试,它也是有趣的)。 好了,我知道你不是想写你自己的解析器——一定要使用现有的代码(访问www.autodiff.org以自动区分Fortran和C/C++代码)。但是知道这些东西是如何工作的总是很有趣的

    干杯


    Juan

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

    迟做总比不做好

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

    解析树方法包括将以下微小的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
    ,正如你所期望的,虚部除以
    h
    ,就是
    c
    ,它是
    ac
    相对于
    a
    的导数


    同样的推理似乎适用于所有的差异化规则。

    如果您想从头开始编写差异化程序,而不使用其他库作为帮助,然后,计算我在中描述的任何代数方程的导数的算法/方法将非常有用。

    如果您使用字符串作为输入,您可以使用+或-char作为分隔符分隔各个术语,这将为您提供各个术语。现在你可以用幂律来解每一个项,假设你有x^3,用幂律会得到3x^2,或者假设你有一个更复杂的项,比如a/(x^3)或a(x^-3),同样你可以把其他变量作为常数,现在解x^-3会得到-3a/(x^2)。单凭幂律就足够了,但它需要广泛使用因式分解。

    @Gurdas Nijor:导数是微积分中常用的一个方程式,用于确定函数中给定点的切线。你在说同样的话。函数的导数,对于任何给定的值x,将产生切线斜率。把它转换成切线函数很简单,链接断了吗?或404 ed;)你的链接断了。也许你的意思是或。