2010년 9월 7일 화요일

상수 모으기

매스매티카를 쓰다 보면, 간단한 수식인데 깔끔하게 정리하기 어려울 때가 있다. 예를 들어, Collect[2/x - 2/y, 2]의 결과가


이렇게 나오면 좋겠지만, 결과는 2/x - 2/y이다. 2로 묶어주려면, 어떻게 해야 할까? 이런 어려움에 봉착했을 땐 우선 풀폼을 확인한다.
FullForm[2/x - 2/y]
 

풀폼에서 알 수 있듯이, 첫 번째 항은 2가 두 번째 항은 -2가 곱해져 있어서 2로 묶지 못한다. 답답하게도 -2에서 2를 빼내지 못하는군. 그럼, -2-1*2로 바꿔주면 되겠다 싶지만, 여기에도 문제가 있다. 매스매티카는 -1*2를 입력하면 바로 -2로 바꿔버리므로, 바꾸지 못하게 해야 한다.
2/x - 2/y
% /. -2 -> HoldForm[-1] 2
% // Collect[#, 2] & // ReleaseHold
이제 됐을까? 결과를 보면 알겠지만, 이번에도 실패다. Collect가 문제인데, Collect는 변수만을 모을 수 있기 때문이다. 그럼, 2는 변수가 아닌데 어떻게 해야 할까? 2HoldForm[2]로 치환해서 변수처럼 만들어주면 된다.
2/x - 2/y
% /. -2 -> HoldForm[-1] 2 /. 2 -> HoldForm[2]
% // Collect[#, HoldForm[2]] & // ReleaseHold
이제야 원하는 결과가 나오는군. 휴~

댓글 없음:

댓글 쓰기