2013-01-06 83 views
2

我有可變參數數目的Python函數:取Python函數和生成的所有衍生物

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

我想自動生成表示F的衍生物相對於每個參數N個函數。

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

例如,我可以給兩個 F(X1)= SIN(X1) 和 F(X1,X2)= SIN(X)* 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)) 
+1

要clear-的功能是一樣的東西'高清F(X):返回math.sin(X)'? (也就是說,它不是'sin(x)'的符號表示,而是一個真正的Python函數?) –

+0

如果F(x)可能是非符號的,那就更好了。 (即使用lambdify獲得符號表達式)。 – Hesam

+0

您是否已經有一種方法可以用一個參數生成函數的數值導數? –

回答

5

的技巧是使用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) 
+3

如果OP可以使用表達式而不是函數,事情就變得簡單了:'{v:expr.free_symbols中v的expr.diff(v)'''。 – DSM

+0

@DSM:那是非常真實的。 –

+0

非常感謝!我如何可以稱之爲生成的衍生物。即F_1(0,0)或F_2(0,0) – Hesam