본문 바로가기

Software/MATLAB

MATLAB에서 다변함수에 대한 문자연산을 이용한 미분

예전에 MATLAB에서 문자연산을 이용해서 미분하는 법에 대한 이야기[관련글]를 했었습니다.

그런데 만약 사용할 변수가 어떤 변수(대체로 시간 t)에 대해 종속이면서, 여러 함수를 사용 중 이라면, 문자연산을 이용한 미적분의 적용에 애를 먹게 됩니다. 물론 애초 syms로 선언할 당시 시간에 관한 함수라고 선언하면 되지만, 그렇게 하면 일반적 수식이 아니라 텍스트형태로 나오는 결과가 해당 식이 아주 복잡할 때는 더더욱 알아보기 힘들게 됩니다. 이것을 극복하는 많은 방법이 있습니다만, 간단히 MATLAB이 제공하는 문자치환(subs) 명령어를 이용해서 극복해 보겠습니다.

그리고, 마지막에는 이를 함수(function)로 만들어 두고두고 사용할 수 있도록 한번 해보죠.

간단한 예제를 통해 프로그램의 흐름을 잡아보겠습니다.


위에 문자연산에 사용할 변수를 

syms x y a b z t

로 선언했습니다. 예제로 사용할 함수 z는

z = a*x^2 + b*y^2

으로 두겠습니다. 여기서 x, y는 모두 시간에 대한 함수입니다. 그러니 z라는 함수를 시간에 대해 미분했다면, 

dot_z = 2*a*x*dox_x + 2*b*y*dox_y

여야합니다. 그러나 실제 MATLAB의 diff 명령을 이용해서 미분을 해보면


저런 결과가 나옵니다. 다변수함수인 경우, diff를 옵션없이 사용하면, x에 관해 미분을 수행하기 때문인데요.


저렇게 옵션을 줘도 편미분의 결과가 나타납니다. 뭐 당연히 x, y가 시간에 관한 함수라고 선언하지 않았기 때문이지요^^


그래서 x는 x(t)로 y는 y(t)로 문자를 바꾸기 위해서 위와 같이 tmp1, tmp2를 선언합니다.


그리고, subs 명령을 이용해 바꿔버리는 거지요.


subs 명령의 마지막, 옵션 '0'는 설명이 필요하겠네요.

tmp = subs(A, b, c)

라고만 명령을 주면, A라는 문자열에서 b를 c로 바꿔라는 명령인데요. 만약 A의 문자열에 b라는 글자가 없으면, 역으로 c를 찾아서 b로 바꿔버립니다. 그걸 하지 말라는 옵션이 마지막에 붙은 '0'입니다.

그리고 나서, 

diff(z, t) 

라고 명령을 주면, z를 t에 대해 미분하라가 되죠.



위 그림과 같은 결과가 나옵니다. 

그러나 일반적으로는 diff(x(t), t)라는 표현보다 우리한테는 dot_x가 익숙하고, 또, x(t)는 애초에 그냥 x라고 표현하고 싶었으니 다시 subs 명령을 사용해서



위와 같이 하면, 제가 원하는 출력이 나왔네요.

위 결과를 한글처럼 수식입력기에 넣기 전에, 한글에서 제공하는 스크립트를 사용해서 모든 *기호를 없애버리고, dot_x 은 dot{x} 이런 식으로 변환해주면, 일반 보고서를 작성하는데도 아주 도움이 됩니다.

마지막으로 이를 함수(function)화 하면


위와 같이 만들 수 있습니다. 위의 함수코드는 제가 만든것이 아니라 저의 지도교수님께서 만드신 것인데요. 저희 지도교수님은 사용자함수를 만들때 함수 이름앞에 'Z_'를 붙이는 습관을 가지고 계시지요^^. 위 함수는 제가 앞서 설명한 스텝을 흘러가기 때문에 별도로 설명드릴것은 없어보입니다. 


반응형