2016-08-09 8 views
2

定義されている変数のすべての値をとり、式が定義されていない場合は式と評価する式を定義したいと考えています。これと同様に : -sympyを使用して条件関数を定義するにはどうすればよいですか?

import numpy as np 
    import sympy as sp 

    def expr(k1, k2): 
     x, y =sp.symbols('x y') 
     if x == k1 : 
      fn = 0 
     else: 
      fn = np.divide(1,(x-k1)*(y-k2)) 
     return fn, x, y 

    f,x, y = expr(1,2) 
    print(f) 
    fx = f.subs({x:1,y:4}) 
    print(fx) 

それでは、どのように平等やコンディショナリティーは、関数が定義された後にチェックすることになるだろうか?

fn = 1 /(x-1)(y-2)。どのようにx = 1またはy = 2に対して0に設定するのですか?

答えて

3

関数内に関数を定義し、それを返す必要があります。このように:

import numpy as np 
import sympy as sp 

def expr(k1, k2): 
    x, y =sp.symbols('x y') 
    def fn(x, y): 
     if x==k1: 
      return 0 
     else: 
      return np.divide(1, (x-k1)*(y-k2)) 
    return fn, x, y 


f, x, y = expr(1, 2) 
print(f(x, y)) 
print(f(1, 4)) 

編集:ここでは

はコメントで尋ねたようsp.lambdifyを使用する1つの方法です:

x_dot = 1/((x - 1) * (y - 2)) 
f = lambda a, b : 0 if a==1 or b==2 else sp.lambdify((x,y), xdot, "numpy")(a,b) 

別のオプションは使用することですsp.subs

f = lambda a, b: 0 if a==1 or b==2 else float(x_dot.subs({x:a, y:b})) 
+0

定義時にxの値がわからない場合はどうすればよいですか?私は本当にそれを外部的に定義したいと思っています。 – Manish

+0

@Manish - 'expr'を呼び出すときに' x'が定義されていません。これは戻り関数のパラメータです。 'k1'と' k2'だけが定義されています。コードを試してみてください。 – Aguy

+0

私が与えたコードはうまくいっています。x_dot = 1 /(x-1)(y-2)のような表現ができればいいと思います。 f1 = sp.lambdify((x、y)、x_dot、 "numpy")、次にu = f1(1,2)を使用して0を取得します。 – Manish

6

シンボリック・ファンクションが必要な場合イオン、私はnumpyのとSymPyをミックスしようとしているお勧めしませんあなたは後で数値にこの式を評価する場合は、lambdify

f = lambdify((x, y, k1, k2), expr, 'numpy') 

で数値関数に変換する必要がありPiecewise

expr = Piecewise((0, Eq(x, k1)), (1/(x - k1)/(y - k2), True)) 

を使用それは一般的には機能しません。 NumPy関数はSymPy式の操作方法を知らず、SymPy関数はNumPy配列の操作方法を知らない。 symPyでシンボリック式を作成し、必要に応じて操作してから、lambdifyを使用してNumPy関数に変換することをお勧めします。

+0

これは良い方法です! – Labo

関連する問題