У меня есть функция Python с переменным количеством аргументов:

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

Я хочу автоматически сгенерировать N функций, представляющих производные от F по каждому аргументу.

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

Например, я могу дать как F (x1) = sin (x1), так и F (x1, x2) = sin (x1) * cos (x2) и получить все производные автоматически.


Edit2: если функция 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))
3
Roy 6 Янв 2013 в 04:43
1
Для ясности - функция похожа на def F(x): return math.sin(x)? (То есть это не символическое представление sin(x), а реальная функция Python?)
 – 
David Robinson
6 Янв 2013 в 04:46
Если возможно, что F (x) не является символическим, это лучше. (т.е. использование lambdify для получения символьного выражения).
 – 
Roy
6 Янв 2013 в 04:49
У вас уже есть метод создания числовой производной функции с одним аргументом?
 – 
David Robinson
6 Янв 2013 в 04:54
Мне нужна символьная производная функция. то есть для sin (x) я хочу, чтобы cos (x) не числовая производная в точке.
 – 
Roy
6 Янв 2013 в 04:57
1
Ответ опубликован - предполагается, что вам нужна lambidy версия каждой функции. Если вы удалите деталь lambdify, вы увидите, что результат будет [cos(x)*cos(y), -sin(x)*sin(y)].
 – 
David Robinson
6 Янв 2013 в 05:22

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)
6
David Robinson 6 Янв 2013 в 05:25
3
Если бы OP мог работать с выражениями вместо функций, все стало бы намного проще: {v: expr.diff(v) for v in expr.free_symbols}.
 – 
DSM
6 Янв 2013 в 05:20
Огромное спасибо! Как я могу назвать сгенерированную производную. то есть F_1 (0,0) или F_2 (0,0)
 – 
Roy
6 Янв 2013 в 05:24
1
F1 равно all_derivatives[0], F2 равно all_derivatives[1], поэтому вы можете назвать это как all_derivatives[0](0, 0).
 – 
David Robinson
6 Янв 2013 в 05:25
2
@Hesam: OP == Оригинальный постер == спрашивающий == ты :)
 – 
David Robinson
6 Янв 2013 в 05:38
Если вы настаиваете на использовании функций, просто передайте им символические фиктивные аргументы, чтобы получить символический объект.
 – 
asmeurer
6 Янв 2013 в 21:18