2013-01-06 53 views
2

我百思不得其解,爲什麼在回答下面的代碼是10,而不是1人可以幫我瞭解正在發生的事情與lambdify或什麼是創造了錯誤的錯誤答案回答?蟒蛇-sympy:lambdify返回時,函數定義分段

import sympy 
from sympy.utilities.lambdify import lambdify 
from sympy import Function 
from sympy.abc import x, y 

def kFct(xIndex,loc,k1,k2): 
... if xIndex <= loc: 
...  return k1 
... else: 
...  return k2 
... 
loc = 0.5 
k1 = 1 
k2 = 10 

kfun = lambdify((x,y), kFct(x,loc,k1,k2)) 
print kfun(0,0) 
>>> 10 

爲什麼不是答案​​或1,因爲x = 0,小於loc = 0.5

但是,它返回正確的答案,如果我做

print kfct(0,loc,k1,k2) 
>>> 1 

我需要有kfun爲x和y的函數,因爲後來,我把它作爲一個整體的參數的一部分。它也將最終取決於y。

我在Mac 10.6.x上使用python 2.6.8。他們通過前

回答

3

lambdify的參數進行評估,所以你實際上並不傳遞你的函數lambdify,你傳遞的10號:

>>> kFct(x, loc, k1, k2) 
10 

你得到10這裏,是因爲

>>> x <= loc 
x <= 0.5 
>>> bool(x <= loc) 
False 

等等第二個分支被採取。由於Python的工作方式,我認爲你不能讓這個工作 - 你不能只抑制一個分支。 (原則,程序可以做一些瘋狂的字節碼反省,但我敢肯定sympy沒有。)

你可以使用implemented_function,雖然:

>>> f = implemented_function(Function('kFct'), lambda x,y: kFct(x, loc, k1, k2)) 
>>> kfun = lambdify((x,y), f(x,y)) 
>>> kfun(0,0) 
1 
>>> kfun(0.5,0) 
1 
>>> kfun(0.51,0) 
10 
>>> kfun(1, 0.0) 
10 

我不知道有多少這真的有利於你,雖然,考慮到額外的間接:我大概只是​​函數本身的工作(假設你最終想要的積分的數值計算)

2

你想用Piecewise,它代表如果按SymPy可以使用的符號方式分支。

下面是您的示例,其中顯式地顯示了loc,​​和k2的值。你當然可以象徵性地使用它們,如果你的代碼規定了這個,用subs代替它們。

>>> kFct = Piecewise((1, x < 0.5), (10, True)) 
>>> kfun = lambdify(x, kFct) 
>>> kfun(0) 
1 
>>> kfun(1) 
10