2

次のコードの答えがなぜ 10 ではなく 10 なのか、私は困惑して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

が より小さいのに、答えがk11 でないのはなぜですか?x = 0loc = 0.5

ただし、そうすると正しい答えが返されます

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

kfun後で積分の引数の一部として使用するため、x と y の関数として持つ必要があります。また、最終的には y に依存します。

Mac 10.6.xでpython 2.6.8を使用しています。

4

2 に答える 2

3

への引数lambdifyは渡される前に評価されるため、実際には に関数を渡すのではなくlambdify、数値 10 を渡しています。

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

ここで 10 を取得します。

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

したがって、2 番目のブランチが取得されます。Python の仕組みのため、これを機能させることはできないと思います。分岐が 1 つだけ取られるのを抑制することはできません。(原則として、プログラムはクレイジーなバイトコードのイントロスペクションを行うことができますが、そうではないことは確かです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

ただし、余分な間接性を考えると、これが実際にどれほど役立つかはわかりません。おそらく、関数自体を操作するだけです(最終的に積分の数値評価を探していると仮定します)。

于 2013-01-06T20:23:05.437 に答える
2

PiecewiseSymPy が使用できるシンボリックな方法で分岐するかどうかを表すを使用します。

lock1、およびの値をk2明示的に入力した例を次に示します。subsもちろん、それらを記号的に使用して、コードで指示されている場合は 後で置き換えることができます。

>>> kFct = Piecewise((1, x < 0.5), (10, True))
>>> kfun = lambdify(x, kFct)
>>> kfun(0)
1
>>> kfun(1)
10
于 2013-01-08T23:13:34.983 に答える