2013-10-21 4 views
2

Continuum Anaconda 분포의 Sympy 0.7.2를 사용하여 (자체 스택을 빌드하기에는 너무 싫어서 싫어하지 않음) 복잡한 행렬 대수를 수행 할 때이 문제가 계속 발생합니다. 기본 함수 인 '1j'를 'I'로 바꿉니다. 다른 산술 연산과 잘 작동하지 않기 때문에 기본적으로 형태를 유지하고 요약 된 결과를 계산하는 대신 요소를 추가하기 때문에 성가신 일입니다. 예 :Sympy 복합 행렬 반전/연산

>>> T 
[   1, 1.0 - 1.0*I] 
[1.0 + 1.0*I,   0] 
>>> T.inv() 
[-(0.5 + 0.5*I)*(1.0 - 1.0*I) + 1, 0.5 - 0.5*I] 
[      0.5 + 0.5*I,  -0.5] 
>>> T.inv()*T 
[-(0.5 + 0.5*I)*(1.0 - 1.0*I) + 1 + (0.5 - 0.5*I)*(1.0 + 1.0*I), (1.0 - 1.0*I)*(
-(0.5 + 0.5*I)*(1.0 - 1.0*I) + 1)] 
[                0, 
     (0.5 + 0.5*I)*(1.0 - 1.0*I)] 

T.INV() * T가 분명히있다 (단위 행렬이 아닌 숫자)이 아닌 것을 엉망 1이다 Beacause은 명확하게 지각 (도 서식 disgusti이고 어떤 이유로 든). "I"를 "1j"로 수동 교체하면 이 표시됩니다. 위의 결과는 잘못이 아닙니다().하지만 "단위 행렬을 찾을 수 없습니다"라는보다 복잡한 문제의 경우 매우 신속하게 처리 할 수 ​​있습니다.

나는 문자열로 행렬을 변환하고, '나는'.... 수동 '1J'로

#If A is a complex matrix, Let AI be its inverse. 
A_STR = string(A).replace("I", "1j").replace("\n", "") 
exec("AI=Matrix("+str(A.shape()).replace("(", "").replace(")", "")+"," + A_STR + ")") 
를 대체하는 것입니다 내가 현재 가지고있는 한,보다 더 나은 솔루션이 궁금하네요

감사합니다.

답변

1

먼저 SymPy 0.7.3 (conda update sympy)으로 업데이트해야합니다.

모두 확장하면됩니다. (T.inv()*T).expand()으로 전화하십시오. 현재 SymPy에는 j에 해당하는 부동 소수점 변형 I이 없으므로 일반적으로 수동으로 복소수를 확장해야합니다 (SymPy는 확장을 자동으로 수행하지 않습니다. 일부 사람들은 공정한 것으로 고려해야하기 때문에, 그것은 아마 행렬에서 자동으로 단순화를 수행해야하지만, 여전히 진행중입니다.)

+0

대단히 감사합니다. –