3

현재 matricial 형식으로 배치 할 수있는 differential operator for sympy을 개발 중입니다. 이 경우 Mul 개체를 만들 때 args 목록의 순서는 필요한 경우에만 구분을 수행하는 것을 보장하는 데 매우 중요합니다.Python 모듈에서 args 정렬을 피하십시오. Sympy

문제는 다음이 완료되면,이다 : args의 일부 재배치가 일어났다 때문에

input = (t,z,x) 
Mul(*input).args 

(t, x, z)를 반환합니다. args을 정렬하지 않으려면 어떻게해야합니까?

+0

실제 사례에서 미분 연산자는'r * D (z) * z'가'Mul' 객체를 리턴하지만 현재'(r, z, D (z)) ', 이는 조작자를 올바르게 적용하기 어렵게 만든다. [자세한 내용은 여기를 참조하십시오] (http://stackoverflow.com/questions/15463412/matrix-of-differential-operators-in-python-module-sympy). –

+0

이것은 http://stackoverflow.com/q/14624511/161801과 매우 비슷합니다 – asmeurer

답변

3

왜 올바른 arg 순서가 중요합니까?

이를 방지하는 유일한 방법은 기호를 비 교환 가능 (x = Symbol('x', commutative=False))으로 설정하는 것입니다. symPy 객체는 args을 비교하여 비교되므로 x*y*z == y*x*z이 작동하려면 args를 정식으로 정렬해야합니다. 명시 적 정렬없이 (주로 성능상의 이유로)이 작업을 수행하기 위해 some attempts이 있었지만, 우리가 그렇게하더라도 arg 순서에 대해서는 전혀 보장되지 않을 것입니다. 특히 표현식에 어떤 종류의 연산을 수행 할 경우 . SymPy에서 표현식을 다시 작성하는 함수는 매우 일반적입니다. SymPy에서는 일반적으로 원래의 다른 관련되지 않은 순서를 사용합니다.

+0

'args' 순서는 평가 될 Mul (* (r, D (z), z)'를 피하기 위해 중요합니다. 후자에서 미분 연산자'D (z) '가 제대로 적용되지 않기 때문에 나중에'r * z * D (z) '가됩니다. –

+1

이것은 제가 http : //stackoverflow.com/a/15482872/161801 (첫 번째 단락). 지금은 사용자 지정 곱셈 규칙과 관련하여 Mul 내부에서 일어나는 일을 제어 할 수있는 방법이 없습니다. 가장 좋은 방법은 연산자를 곱하여 '*'를 사용하고, 다른 방식으로 적용된 곱셈에 대해 "작업을 마친"커스텀 함수를 작성하십시오. 동일한 대답에서 언급 한 연관성 문제를 고려할 때 아마도 후자의 솔루션을 사용해야 할 것입니다. – asmeurer

+0

그게 다야! sympy.var ('t, x, z', commutative = False)'x = 기호 ('x', commutative = F alse)'모두를 위해 이제 args는 재배치되지 않습니다! 고맙습니다! –