2011-11-10 2 views
2

내 프로젝트에서 Add 또는 Mul 개체를 생성 할 때 evaluate=false을 사용해야합니다. 이 경우 이러한 객체에 대한 동등성 검사를 적용 할 때 문제가 발생합니다. 문제는 논쟁의 순서 때문입니다.Python-Sympy evaluate = False 일 때 식 평형 검사 문제

아래의 예를 고려하십시오 :

k2=Mul(*[x,y,2],evaluate=False) 
k1=Mul(*[x,2,y],evaluate=False) 
print k1==k2 

결과는 (x,y,2)을하고 k1.args(x,2,y)입니다 falsek2.args 같습니다. 비교 결과 튜플이 동일한 지 확인하는 동안 false을 반환합니다. 원하는 결과를 얻을 수있는 방법이 있습니까? I는 (순서를 반대로하고 검사 등) 튜플에 어떤 동작을 세우면 k1k2Mul 개체 상이한로부터 형성 될 때

또한,이 경우에는 실패 (같은 경우 k1.args = 2*x,yk2.args = 2*y,x)

여기서는 정렬을 사용할 수 없습니다.이 경우 Add([x+y,z],evaluate=False)Add([x+z,y],evaluate=False)은 두 가지 다른 표현식입니다. 또한 evalaute=True을 사용하는 경우,이 경우 Add([x+y],x])Add([2*x+y])은 같지 않으므로 원하지 않습니다.

답변

0

하나 발견. 식 형성에서 추가/도난 클래스에서

코드

flatten_args = [] 
      for arg in args: 
       if (arg.__class__==cls): 
        flatten_args.extend(arg.args) 
       else: 
        flatten_args.append(arg) 

      obj = Expr.__new__(cls, *flatten_args) 

아래 평등 검사시 사용하는 모든 인수를 평평하게, 나는 인수가 처음 arg_list.sort() 및보다 목록을 하나 추가 검사를 종류를 걸었습니다 두 목록을 비교하십시오

1

Mul은 x와 y가 모두 스칼라임을 나타냅니다. 행렬 곱셈은 인수의 순서에 따라 다르므로 k1과 k2가 반드시 같지는 않습니다. 프로그램에서 x와 y가 항상 스칼라 (또는 곱셈이 교환 가능하고 연관성이있는 다른 유형의 값)임을 알면 각 항에서 상수를 제외하고 상수를 비교하고 정렬 된 값을 비교하는 방법이있을 수 있습니다 용어 목록.

+0

나는이 질문을 게시하여 어떤 사람이 저를 비교할 수있는 방법을 제안 할 수 있도록했습니다. 네, 곱셈은 항상 교환 적입니다. 내 질문에 편집 된 섹션을 참조하십시오 – gsagrawal

0

다음 정보는 도움이됩니까?

print simplify(k1 - k2) == 0 # True 
print k1 == k2 # Still False 
+0

실제로 없습니다. 이 경우와 같이 "x + 2y"와 "x + y + y"는 동일합니다. sympy가 어떤 연산을 수행하기를 원하지 않습니다. 하나의 해결 방법을 찾았지만. 나는 먼저 그것을 정렬하고 비교하는 것보다 모든 논쟁을 평평하게하고있다. – gsagrawal

관련 문제