2017-09-06 5 views
0

죄송합니다. 나는 Sympy의 초보자이며 이것을 극복하려고 노력했다. 실패한. 그래서 여기 간다 :심피의 조건을 어떻게 합치시겠습니까?

내가 할 경우, 예를 들어 :

>>> i, j = Dummy('i'), Dummy('j') 
>>> N = symbols('N') 
>>> expr = Sum(KroneckerDelta(i,j), (i,0,N)) 
>>> expr.doit() 

나는 그것은 두 개의 서로 다른 결과, 주어진 조건이 있다는 뜻

Piecewise((1, And(0 <= _j ,_j <= N)), (0, otherwise)) 

를 얻을. 제 질문은 : 첫번째 조건이 만족 스럽다는 것을 알고 있다면 (0 < = j < = N), 어떻게하면 Sympy가 그 사실을 알게 할 수 있습니까? 그래서 첫 번째 결과 만 출력합니까?

답변

0

j를 정의 할 수있는 방법이 있는지 묻는다면 최종 결과가 단순히 1이되었거나 알고있는 것을 사용하는 방법을 알고 싶다면 (j는 음수가 아니며 N보다 크거나 같음).

전 어떻게해야할지 모르겠지만 후자는 할 수 있습니다. 당신은 조건이 참 알고 있다면 당신은 당신의 결과에 그것을 사용할 수 있습니다

>>> ans = expr.doit() 

순진 방법은 당신이 그것을 볼로 교체 할 시도하는 것입니다, _j이 DUMM ('J'는) 표현하는 방법을 그냥 것을 기억 :

>>> ans.subs(And(0 <= j, j <= N), True) 
Piecewise((1, (0 <= _j) & (_j <= N)), (0, True)) 

0는 파이썬 정수 및 0 < j를 입력하는 j > 0로 바뀌고 교체가 인식되지 않기 때문에 아무것도하지 않습니다.

>>> 0 < j 
_j > 0 

또한

>>> ans.subs(j,0) 
Piecewise((1, 0 <= N), (0, True)) 

사실 확인해야 J의 값으로 대체하려고 할 수도 있습니다 그러나 N은 양 또는 음이 될 수 있기 때문에이 실패합니다. 당신이 N은 음이 아닌 것을 알고 있다면, 당신은 시작에 그 가정에 그것을 만든 수 :

>>> N = var('N', nonnegative=True) 
>>> expr = Sum(KroneckerDelta(i, j), (i, 0, N)) 
>>> ans = expr.doit() 
>>> ans.subs(j, 0) 
1 

또는, 당신은 당신이 알고있는 원자를 통해 True입니다 정확한 표현에 액세스 할 수 있습니다. 네가 아는 조건은 사실이다. 우리는 ANS

>>> ans.atoms(Ans) 
set([(0 <= _j) & (_j <= N)]) 

에만이 하나 있습니다에 나타나는 모든 ANDS 세트를 얻을 수 있습니다, 그래서 우리는 단순히 설정에서 팝업과 ANS에 참으로 교체 :

>>> ans.subs(_.pop(), True) 
1 

(1 개 이상의 원자가 있다면, 그 세트를 목록으로 변환하고 색인을 사용하여 관심이있는 것을 선택해야합니다.)

+0

나는 그 자리에서 실제로 무엇을 대답했는지 물어 보았습니다. 고마워요! –