【问题标题】:Take Python Function and Generate All Derivatives取 Python 函数并生成所有导数
【发布时间】:2012-12-20 03:05:23
【问题描述】:

我有一个参数数量可变的python函数:

F(x1, x2, ... , xN)

我想自动生成 N 个函数,表示 F 对每个参数的导数。

F'_1 = dF/dx1
F'_2 = dF/dx2
...
F'_N = dF/dxN

例如,我可以同时提供 F(x1) = 罪(x1) 和 F(x1, x2) = sin(x1) * cos(x2) 并自动获取所有导数。


编辑2: 如果函数 F 是 2 个变量(固定数量的参数),我可以使用

   def f(x,y):
      return  sin(x)*cos(y)

   from sympy import *
   x, y = symbols('x y')
   f_1 = lambdify((x,y), f(x,y).diff(x))

【问题讨论】:

  • 要明确 - 函数类似于 def F(x): return math.sin(x)? (也就是说,它不是sin(x)的符号表示,而是一个实际的Python函数?)
  • 如果 F(x) 有可能是非符号的,那就更好了。 (即使用lambdify获取符号表达式)。
  • 您是否已经有一种方法可以在具有一个参数的函数上生成数值导数?
  • 我需要符号导数函数。即对于 sin(x),我希望 cos(x) 不是数值导数。
  • 已发布答案 - 它假定您想要每个函数的 lambidy 版本。如果你取出lambdify 部分,你会看到结果是[cos(x)*cos(y), -sin(x)*sin(y)]

标签: python lambda python-2.7 scipy sympy


【解决方案1】:

诀窍是使用inspect.getargspec 来获取函数的所有参数的名称。之后,就是一个简单的列表推导:

import inspect
from sympy import *

def get_derivatives(func):
    arg_symbols = symbols(inspect.getargspec(func).args)
    sym_func = func(*arg_symbols)

    return [lambdify(arg_symbols, sym_func.diff(a)) for a in arg_symbols]

例如:

def f(x, y):
    return sin(x)*cos(y)

all_derivatives = get_derivatives(f)

【讨论】:

  • 如果 OP 可以使用表达式而不是函数,事情就会变得简单得多:{v: expr.diff(v) for v in expr.free_symbols}
  • 非常感谢!我如何调用生成的导数。即 F_1(0,0) 或 F_2(0,0)
  • F1all_derivatives[0]F2all_derivatives[1],所以你可以像 all_derivatives[0](0, 0) 这样称呼它。
  • @Hesam: OP == 原始海报 == 提问者 == 你 :)
  • 如果您坚持使用函数,只需传递符号虚拟参数即可获得符号对象。
猜你喜欢
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 2020-09-26
  • 2012-10-25
相关资源
最近更新 更多