2016-08-09 5 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를 사용하는 방법 중 하나입니다 :

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

관련 문제