【问题标题】:How to get a numeric derivative function in python?如何在python中获得数值导数函数?
【发布时间】:2020-02-24 11:14:37
【问题描述】:

我想知道如何在 Python 中得到一个导数函数来组成一个泰勒级数。 我知道各种获取导数的方法。 符号使用SymPy库,方式如下:

x = sy.Symbol('x')
y = 3*x**2 + 4*x**3
y.diff(x)

结果我得到了一个新函数,但我不能用这个函数做任何事情。

第二种方法是使用scipy库进行区分,方法如下:

def f(x):
    return 3*x**2 + 4*x**3
sc.derivative(f, 2)

但它会计算某个点的导数。

但只需要获取另一个函数f',它是f 的派生。

有人知道怎么解决吗?

非常感谢。

【问题讨论】:

  • y.diff(x).evalf(subs={x: 2.4})
  • 数值导数是什么意思?
  • 也许我对 数字导数 有误,但我的问题是从初始函数 f(x) 得到一个导数函数 g(x)

标签: python sympy derivative


【解决方案1】:

使用 evalf()

from sympy import *
x = Symbol('x')
y = 3*x**2 + 4*x**3
t = y.diff(x)
print(t.evalf(subs={x: 2}))

结果:

t = y.diff(x)

t = 12 * (x**2) + (6*x)

t.evalf(subs={x: 2})

t(at x =2) : 60

【讨论】:

  • 感谢您的回答。但我需要得到的只是导数函数,而不是特定点的导数值。
  • g = t.diff(x)
【解决方案2】:

只需将导数分配给变量,然后在要使用导数的地方使用该变量。采用牛顿-拉夫森形式的方程:f(x) = f(x0) + (x - x0)/f'(x0)。我们需要一个f(x)。我们就叫它fx

>>> fx = 3*x**2 + 4*x**3

我们需要导数。称之为 f1x:

>>> f1x = fx.diff(x)

假设f(x) = 0 我们将xx0 计算为x = x0 - f(x0)/f'(x0)。我们将xxnewx0称为x

>>> xnew = x - fx/f1x; xnew
x - (4*x**3 + 3*x**2)/(12*x**2 + 6*x)

要从 x = 1 计算 xnew,您可以使用替换(使用整数时)或使用替换进行评估,以便在使用浮点数时更好地保持准确性)

>>> xnew.subs(x, 1)
>>> xnew.subs(x,1)
11/18
>>> xnew.n(subs={x:1})
0.611111111111111

如果使用f(x) 表单让您感觉更好,您可以执行以下相同操作(这里我将仅展示步骤):

>>> f = Lambda(x, 3*x**2 + 4*x**3)
>>> f1 = Lambda(x, f(x).diff(x))
>>> xnew = x - f(x)/f1(x); xnew
x - (4*x**3 + 3*x**2)/(12*x**2 + 6*x)
>>> xnew.subs(x, 1)
11/18

在任何一种情况下,请注意不要将 x 用作除 SymPy 符号 x 之外的任何东西的 Python 变量。如果你这样做了,你将失去(暂时并且可能神秘地,如果你是 Python/SymPy 的新手)你用 x 重新创建 f(x) 的能力:

>>> f(x)
4*x**3 + 3*x**2
>>> x = 2
>>> f(x)  # now interpreted as f(2)
44

哎呀!让x 再次指向一个符号

>>>> from sympy.abc import x
>>> f(x)
4*x**3 + 3*x**2

注意:如果您想同时使用多个衍生品,您可以将它们存储在一个列表中并按衍生品的顺序访问它们:

>>> deriv = [f(x).diff(x, i) for i in range(4)]
>>> deriv[2]
6*(4*x + 1)

【讨论】:

    【解决方案3】:

    您的要求并不完全清楚。然而,在这种情况下,澄清问题的最简单方法似乎是提出解决方案。

    考虑

    from scipy.misc import derivative
    
    def f(x):
        return 3*x**2 + 4*x**3
    
    fprime = lambda x : derivative(f, x, dx=1e-6)
    print(fprime(2))
    

    返回

    60.000000004833964
    

    这是一个数值导数。然后,您可以重复该过程以获得对应于更高导数的函数,并使用所有这些来评估您的泰勒级数作为特定点。

    【讨论】:

    • 我的问题是如何获得函数g(x) = f'(x)?然后 cind 派生 s(x) = g'(x) 等等。我需要它来组成泰勒级数。我不需要在特定点计算f'(x) 的值。我只想得到一个函数。
    • @DavidBijoyan,函数 is 代码用于获取 any 特定点的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 2018-11-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多