아래 내용은 본인이 직접 MATLAB 메뉴얼을 참조하여 적고 있으며, 저작권 문제가 있을 수 있으므로, 복사하시지는 말고 링크만 걸어 주시기 바랍니다.
MATLAB에서의 Symbolic Math 1
Contents
1. Symbolic 계산이란?
2. MATLAB 커맨드상의 Symbolic Math Toolbox
2.1. Symbolic 변수
2.2. Symbolic 상수
__________________________________________________________________________________
MATLAB은 기본적으로 수치해석적으로 모든 연산을 계산하며, 그 연산의 정확도는 IEEE에서 지정하는 double precision을 만족시킨다. MATLAB이 기본적으로 제공하는 함수 이외에도 산업 분야나 특별한 학문 분야에 관련된 함수는 Toolbox라는 이름으로 제공한다. 다양한 종류의 Toolbox를 제공하며, 이런 Toolbox도 마찬가지로 수치해석적인 방법을 이용한다. 하지만 유일한 예외가 있으니, 바로 Symbolic Math Toolbox이다.
1 Symbolic 계산이란?
MATLAB에서의 Symbolic Math Toolbox를 설명하기 전에 먼저 알아야 할게 Symbolic 계산이 어떤것인지 알아 보자.
Symbolic 계산은 고등학교때 배웠던 식 (1a)와 같은 이차 함수의 근을 구하는 공식을 생각하면 쉽게 이해할 수 있다. 식 (1a)의 근을 구하는 공식은 식 (1b)처럼 구할 수 있으며, 이와 같이 미지수를 포함해서 식으로 계산하는 것을 Symbolic 계산이라고 한다.

식 (1a)를 MATLAB에서 계산하기 위해서는 MATLAB이 이해할 수 있는 형태로 입력하고 함수를 이용해서 근을 구해야 한다. MATLAB에서는 식 (1b)1b와 같은 수식을 구할 수가 없다. 즉 미지수를 이용해서 계산할 수 없기 때문에, a,b,c의 값을 입력해야 한다. 즉 a = 1,b = 2,c = 3의 경우의 근을 구한다고 하면, 아래와 같이 한다.
>> p1 = [1, 2, 3];
>> roots(p1)
ans =
-1.0000 + 1.4142i
-1.0000 - 1.4142i
위와 같이 수치적으로 값을 계산하는 것이 MATLAB의 기본 기능이며, 이를 Symbolic 계산으로 확장해 주는 것이 Symbolic Math Toolbox의 기능이다.
2 MATLAB 커맨드상의 Symbolic Math Toolbox
2.1 Symbolic 변수
MATLAB에서 식 (1a)1a를 Symbolic Math Toolbox를 쓰면 다음과 같이 할 수 있다. 아래에 보이는 것처럼 syms를 사용한다. 일반적으로 MATLAB 커맨드상에서 변수들을 설정하면 값을 대입하는 변수가 되어야 한다. 하지만, syms 명령어로 변수를 설정하면 Symbolic 변수로 설정되어서 값이 대입되지 않아도 되는 변수가 된다. 그리고 solve() 함수를 이용하여 실제 이차방정식을 x에 대해서 풀게 되면 Symbolic으로 계산을 하게 된다. 이렇게 되면 나온 결과도 Symbolic 변수에 대입된다. MATLAB의 Workspace에서 a,b,c,x를 보면 sym 이라는 데이타 타입임을 알 수있다. 여기에 값을 대입해서 계산하기 위해서는 subs()를 이용한다. 아래에 보이는 것처럼 Symbolic 변수인 x를 a,b,c에 각각 값을 1, 2, 3을 대입하여 계산하라는 함수이다. 그 결과를 보면 앞에서 수치적인 연산을 했던 것과 같은 결과 임을 알 수 있다.
>> syms a b c
>> x = solve(’a*x^2 + b*x + c = 0’)
x =
-(b + (b^2 - 4*a*c)^(1/2))/(2*a)
-(b - (b^2 - 4*a*c)^(1/2))/(2*a)
>> subs(x, {a, b, c}, {1, 2, 3})
ans =
-1.0000 - 1.4142i
-1.0000 + 1.4142i
2.2 Symbolic 상수
(2.1)를 보면 변수를 Symbolic 변수로 만든 내용인데, 숫자까지 Symbolic 상수로 만들수 있다. 숫자를 Symbolic 상수로 만들었을때는 어떤 잇점이 있냐면 정확도에서 수치적인 값보다는 유리하다는 것을 알 수 있다. 식 (2)2를 보면 당연한 것이라고 생각하겠지만, MATLAB에서는 실제로 그렇지 않다.

아래를 보면 식 (2)를 보면 제대로 6으로 답이 나온것 같지만, 실제로는 그렇지 않다는것을 바로 그 아래에 있는 format long으로 하고 결과를 보면 알 수 있다. 이는 sqrt()함수의 결과를 먼저 계산하고, 그 계산 값을 다시 제곱하는 것으므로 ∘ - (6) 의 경우 무리수이므로 결과값이 딱 떨어지지 않기 때문에 어느 정도의 소숫점 자리수에서 자르게 된다. 그 잘리 결과에 대해서 다시 제곱을 하므로 결과가 정확하게 맞지 않게 된다. 하지만 워낙에 낮은 소숫점 자리수에서 잘리기 때문에 거의 영향을 안 주는 경우가 사실이다. 하지만 이를 sym() 함수를 써서 Symbolic 상수로 만들어서 사용하게 되면 정확하게 계산하는 것을 볼 수 있다.
>> sqrt(6)^2
ans =
6.0000
>> format long
>> sqrt(6)^2
ans =
5.999999999999999
>> sqrt(sym(’6’))^2
ans =
6
아래 예를 보면 2∕3 + 1∕5를 일반적인 MATLAB에서 계산하는 형태로 계산하면 아래와 같이 소수점을 가진 숫자로 나오는데, sym() 명령어로 Symbolic 상수로 만들어서 계산할 경우 정확하게 소숫점이 떨어지지 않는 경우 정확도를 위해서 분수 형태로 보여 준다. 이를 MATLAB 처럼 숫자로 표현하기 위해서는 double() 함수를 써서 할 수 있다.
>> 2/3 + 1/5
ans =
0.866666666666667
>> sym(’2/3’) + sym(’1/5’)
ans =
13/15
>> double(ans)
ans =
0.866666666666667
Symbolic 변수를 써서 행렬의 역행렬과 행렬의 determinant를 공식형태로도 구할 수 있다.
>> A = [a, b, c;c, b, a;b, a, c]
A =
[ a, b, c]
[ c, b, a]
[ b, a, c]
>> inv(A)
ans =
[ -(b*c - a^2)/((a - b)*(a - c)*(a + b + c)), -c/((a - c)*(a + b + c)), -b/((a - b)*(a + b + c))]
[ -(a*b - c^2)/((a - b)*(a - c)*(a + b + c)), -c/((a - c)*(a + b + c)), (a + c)/((a - b)*(a + b + c))]
[ -(a*c - b^2)/((a - b)*(a - c)*(a + b + c)), (a + b)/((a - c)*(a + b + c)), -b/((a - b)*(a + b + c))]
>> det(A)
ans =
a*b^2 - a^3 + a*b*c + a*c^2 - b^2*c - b*c^2




댓글을 달아 주세요
좋은자료 감사합니다.
symbolic math toolbox에 관심이 있어서 찾던중 젤 처음 나오는 글이 이글이라 유심히 봤는데 다읽고 보니 이영준님의 글이네요. 안녕하세요 한때 울산대학교 이영석입니다. 교육을 아주 많이 갔던..
근데 드디어 책을 내셨네요. 바로 주문해야겠습니다. ㅎ
이번 컨퍼런스에 뵐수 있을꺼 같네요. ㅎ 그럼 그때 뵙겠습니다.
반갑습니다.
학교 후배 분이 교육 들어와서 근황을 들어 보니 좋은 곳에 취직하셨더군요.
Symbolic Math Toolbox는 여기에 적은 부분은 전체 기능에 아주 작은 부분입니다. 조만간 시간을 내서 훨씬 좋은 mupad 기능에 대해서 소개해 드리도록 하겠습니다. 컨퍼런스에 오시면 Symbolic Math Toolbox에 대해서 더 잘아는 엔지니어가 Workshop에서 소개해 드릴겁니다. 단, 좌석이 한정되어 있어서 컨퍼런스 오시는 분중에 선착순으로 받는 거라서 들으실 수 있다고 장담은 하지 못하겠네요.
그럼 컨퍼런스에서 뵙죠...