【问题标题】:A function generating the derivative of f产生 f 导数的函数
【发布时间】:2018-02-18 10:42:44
【问题描述】:

我正在尝试构造一个函数,它返回 f 的导数,一个变量的函数。

返回值应该是近似于f'的导数的函数 使用对称差商,因此返回的函数将计算(f(x+h) -f(x-h))/2h.

函数应该像这样开始:

def derivative(f, x):

它应该近似于函数 f 围绕点 x 的导数。 有谁知道我可以使用什么类型的代码来构造这种类型的函数?

/亚历克斯

【问题讨论】:

    标签: python symbolic-math derivative calculus


    【解决方案1】:

    对于一般函数 f(x),您可以通过标准(二阶)近似 (f(x+h) - f(x-h)) /2h 直接获得其一阶导数的数值近似。主要挑战是选择 h 与 f(x) 显示非二次变化的长度尺度相比要小,但要足够大以避免在减去 f(x) 的附近值时出现舍入误差。

    但是,如果您想要一种代数方法来区分您的函数,那么事情就更具挑战性了。简单的情况是已知 f(x) 是多项式,因此可以用 x 的幂系数向量表示。在这种情况下,numpy.polyder() 可用于计算第 n 阶导数的系数。

    更复杂的功能可以看SymPy

    numpy.polyder() 和 SymPy 选项都要求您以专门针对这些特定工​​具的方式来表示您的函数。我不知道有任何方法可以采用普通 Python 函数并构造另一个实现 exact 导数的函数。

    【讨论】:

      【解决方案2】:

      你希望函数返回什么? 如果你想要某个 x 的导数的值,你可能需要三个参数:

      def derivative(f, h, x):
          return (f(x+h) - f(x-h))/2h
      

      如果你想得到一个函数来计算上面的任何 x 你可以使用:

      def derivative(f, h):
          return lambda x: (f(x+h) - f(x-h))/2h
      

      【讨论】:

      • 感谢您的帮助。我不想要生成一般导数的函数。例如,如果 f = x^2,则函数应返回 2x。不是某个x中导数的具体值
      • 在这种情况下,您不能使用 (f(x+h) - f(x-h))/2h ,它是数字的,只有在使用符号计算时才能工作。尝试使用 Sympy:scipy-lectures.org/advanced/sympy.html
      【解决方案3】:

      您最好的选择可能是使用 SymPy,它可以进行符号整合和区分:

      >>> from sympy import *
      >>> x, y, z = symbols('x y z')
      >>> diff(x**2, x)
      2*x
      

      【讨论】:

        【解决方案4】:

        首先你可以定义一个函数f(例如:f(x) = x ^ 2):

        def f(x): return x ** 2
        

        接下来使用导数的定义:

        def derivative(function, x, accuracy = 20): # The 'Default' of accuracy is 20 and is an optional argument.
            step = 1 / accuracy
            return (function(x + step) - function(x - step)) / (step * 2)
        

        ~~~~~~~~~~~~~~~~~~~~~

        顺便说一句,我认为这是一个错字:

        def derivative(f, h):
        

        由于您正在逼近函数 f 围绕点 x 的导数,它应该是:

        def derivative(f, x):
        

        如我的代码所示

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-23
          • 1970-01-01
          • 2021-04-29
          • 1970-01-01
          相关资源
          最近更新 更多