Notice
Recent Posts
Recent Comments
Link
관리 메뉴

뛰는 놈 위에 나는 공대생

[매트랩MATLAB] Symbolic expression에서 미분 및 적분 수행 본문

프로그래밍 Programming

[매트랩MATLAB] Symbolic expression에서 미분 및 적분 수행

보통의공대생 2022. 7. 2. 20:50

MATLAB의 장점 중 하나는 복잡한 기호 연산을 symbolic toolbox를 이용해서 쉽게 구할 수 있다는 점이다.

 

손으로 직접 식을 풀고 나서 내가 제대로 했는지 확인하기에 좋고, 적분의 경우에는 analytic하게 풀고 나서 검증용으로 매트랩에서 나온 결과를 비교할 수도 있다.

 

아래에 나오는 제목은 MATLAB 내의 함수 명을 기준으로 적었다.

 

1. diff (Differentiation 함수)

 

symbolic formula에 대해서 diff(symbolic formula, 미분하고자 하는 변수)를 입력하면 미분을 수행한다.

 

예시

syms x

f = x^3 ;
diff(f, x)

다음 코드에 대한 결과

ans =
 
3*x^2

 

$x^3$을 미분한 $3x^2$이 나온다.

diff를 쓸 때 첫번째 argument는 symbol로 구성된 식을 넣고, 그 다음에는 미분하고자 하는 문자를 넣어준다.

 

만약 문자가 여러 개인 경우에는 어떻게 될까?

Matlab help 문서를 보면 다음과 같은 예시를 볼 수 있다.

 

syms x y
Df = diff(x*sin(x*y),x,y)

 

이 경우에는 $x\sin (xy)$에 대해서 x에 대해 먼저 미분하고 그 다음에 y에 대해 미분하라는 의미이다.

따라서 결과는 다음과 같다.

 

Df =
 
2*x*cos(x*y) - x^2*y*sin(x*y)

문자가 여러 개로 구성된 식은 이런 식으로 여러번 미분을 수행할 수 있다.

 

2. gradient

gradient는 scalar-valued multivariate function의 다변량 변수 미분을 의미한다.

의미로 보면 scalar-valued function이 가장 빠르게 증가하는 방향이라는 의미를 가지고 있다.

matlab에서도 gradient를 고르면 자동으로 각 변수에 대해서 미분을 수행해준다.

위의 1번 diff와 연결지어보면 여러 변수가 있는 function에 대해 각 변수로 미분해준 벡터라고 생각할 수 있다. (즉, diff만 가지고도 gradient를 구할 수 있다.)

 

예시

 

syms x y 
f = x^2 - y^2 ;
gradient(f, [x,y])

 

위와 같은 $x^2-y^2$ scalar-valued function의 gradient를 구하면 하나는 x에 대해서 미분한 결과, 다른 하나는 y에 대해서 미분한 결과가 나온다.

ans =
 
 2*x
-2*y

따라서 이 경우에는 symbolic으로 구성된 array가 return된다.

 

 

3. jacobian

 

jacobian은 vector-valued function의 다변량 변수 미분을 의미한다.

function이 벡터로 나오면서 변수가 여러 개일 때 gradient를 구하면 각 벡터 함수의 원소별로 각 변수에 대해 미분해줘야하기 때문에 matrix가 나온다.

 

예시

syms x y z
f = [x+y, z^2, x^2+y^2+z^2] ;
jacobian(f, [x,y,z])
fprintf("----comparison----\n") ;
jacobain(f, [x,y])

위 코드에서는 vector function

$f=\begin{bmatrix}x+y & z^2 & x^2+y^2+z^2 \end{bmatrix}^{\top}$

의 jacobian을 구하는 것이다.

 

그리고 밑에는 비교를 위해서 [x,y]에 대해서만 jacobian을 구하는 것을 보여준다.

 

ans =
 
[  1,   1,   0]
[  0,   0, 2*z]
[2*x, 2*y, 2*z]
 
----comparison----
 
ans =
 
[  1,   1]
[  0,   0]
[2*x, 2*y]

위의 결과를 보면 첫 번째 row는 첫 번째 함수 $x+y$는 x,y,z에 대해서 각각 미분한 것을 보여준다.

두 번째 row는 $z^2$에 대해서 x,y,z에 대해서 각각 미분한 것이다.

마찬가지로 세 번째 row도 $x^2+y^2+z^2$를 x,y,z에 대해서 미분한 것이다.

 

그런데 아래는 x,y에 대해서만 미분했으므로 column이 두 개밖에 없고, row는 벡터 함수의 갯수에서 결정된다.

 

 

4. hessian

 

scalar-valued multivariate function을 두 번 미분한 결과이다.

한 번 미분한 gradient는 벡터이므로, 똑같이 변수 벡터(다변수이기 때문)로 미분하면 행렬이 된다.

 

예시

syms x y z
f = x*y + 2*z*x ;
hessian(f,[x,y,z])
fprintf("----comparison----\n") ;
jacobian(gradient(f))

위 코드는 hessian을 사용한 것이고, 아래는 f에 대해 gradient를 구한 다음, array에 대해서 jacobian을 구한 것이다. 어차피 동일하게 두 번 미분한다는 점에서 같다.

 

ans =
 
[0, 1, 2]
[1, 0, 0]
[2, 0, 0]
 
----comparison----
 
ans =
 
[0, 1, 2]
[1, 0, 0]
[2, 0, 0]

다음과 같이 똑같은 결과가 나왔다.

 

5. int (integral 함수)

 

적분에는 두 가지가 있다.

definite integral(정적분)과 indefinite integral(부정적분)

 

definite integral은 적분 범위가 정해져있는 경우이고

indefinite integral은 적분 범위 없이 수행되는 적분이다.

MATLAB에서는 이 두 개 다 symbolic으로 수행할 수 있다. indefinite integral은 안되는 사례가 있을지도 모르겠다. definitie integral은 수치적분을 이용해서 해결하면 되는데 indefinite integral은 어떤 원리로 수행되는지 전혀 감이 안 잡혀서..

 

단순한 $\int_{0}^{1}3x^{2}dx$의 경우에는 1로 결과가 나오는데 이를 symbolic으로도 풀 수 있다.

 

 

정적분 & 부정적분 예시

syms x

% indefinite integral
f = 3 * x^2 ;
int( f, x )

% definite integral
int( f, [0,1] )

위 예시는 부정적분이고, 아래는 정적분이다.

ans =
 
x^3
 
ans =
 
1

 

적분을 근사적으로 구하고자 할 때는 vpaintegral을 사용해야 한다.

 

 

참고로 위의 예시 외에도

curl, divergence, laplacian을 계산해주는 함수도 있으므로 필요하면 Mathwork help center에서 찾아보자.

 

참고자료

 

mathwork help center

 

 

Comments