Professional Documents
Culture Documents
Ita Matlab 07
Ita Matlab 07
김탁은
kmste2@kaist.ac.kr
1
Symbolic Math Toolbox
지금까지 우리가 해온 계산 방법
>> x = 1;
>> y = x + x
y=
2
간단한 Symbolic Expression 연산
Symbolic Expression 연산에 사용할 심볼을 정의해야 함
>> y = x + x + 2*z
y=
2*x + 2*z
3
간단한 Symbolic Expression 연산
Symbolic 형의 데이터 타입으로 선언되지 않았을 때 Symbolic Expression을
계산하려고 하면 다음과 같은 에러 발생
>> syms x
>> y = x + k
Undefined function or variable 'k'.
>> syms x
>> class(x)
ans =
sym
>> x = single(10.3125);
>> class(x)
ans =
single
4
Symbolic Toolbox의 기능
기능 분야
5
sym 함수
S = sym(A)
• A 로부터 symbolic number/variable/object를 생성
• A가 스칼라 또는 행렬인 경우, 해당 값들의 symbolic representation을 리턴
>> x = magic(2);
>> xsym = sym(x)
xsym =
[ 1, 3]
[ 4, 2]
>> class(xsym)
ans =
sym
6
sym 함수
x = sym(‘x’)
• “x”라고 이름을 가진 symbolic variable을 정의
>> A = sym('A', [2 3])
x= sym(‘x’, ‘real’)
• “x”란 이름을 가진 정수형의 symbolic variable을 정의 A=
• “>> syms x real” 과 동일
• real 특성 없애려면 “>> x = sym(‘x’, ‘unreal’)”
[ A1_1, A1_2, A1_3]
[ A2_1, A2_2, A2_3]
k = sym(‘k’, ‘positive’)
• 양의 실수 값을 가지는 symbolic variable k를 정의
>> A = sym('A', [1 3])
x = sym(‘x’, ‘clear’) A=
• symbolic variable x에 real, positive 등의 속성들을 모두 제거
[ A1, A2, A3]
A = sym(‘A’, [M N])
• 이름이 A인 M x N 행렬의 symbolic variable 정의
• 각 원소의 이름은 Ai_j 가 됨. 벡터의 경우에는 Ak가 됨 >> A = sym('A', 2)
A = sym(‘A’, N) A=
• 이름이 A인 N x N 정사각형 행렬의 symbolic variable 정의
• 각 원소의 이름은 Ai_j 가 됨. 벡터의 경우에는 Ak가 됨 [ A1_1, A1_2]
[ A2_1, A2_2]
7
sym 함수
A = sym(‘A_%d_%d’, [M N])
• 각 원소의 이름이 A_i_j 가 되며, 행렬의 이름이 A인 >> A = sym('A_%d_%d', [3 2])
M x N 행렬의 symbolic variable 정의
• 벡터의 경우 각 원소의 이름이 A_k 가 됨 A=
• 행렬의 원소 접근은 A(i, j) 로 할 수 있음
[ A_1_1, A_1_2]
[ A_2_1, A_2_2]
S = sym(A, flag) [ A_3_1, A_3_2]
• A 가 스칼라 또는 행렬인 경우, flag는 ‘r’, ‘f’, ‘e’, ‘d’ 가능
‘r’ : rational (default) >> B = sym(‘B_%d_%d', [3 1])
• ‘f’ : floating point
• ‘e’ : estimated error B=
• ‘d’ : decimal
>> r = sym(1/3)
B_1_1
r = 1/3 B_2_1
B_3_1
>> f = sym(1/3, 'f')
f = 6004799503160661/18014398509481984 >> A(2,2)
>> d = sym(1/3, 'd')
d = 0.33333333333333331482961625624739
ans =
예제
• 2 x 3 행렬 A, B, 스칼라 값 c, d가 symbolic variable로 정의되어 있다고 했을 때,
>> A = sym('A_%d_%d', [2, 3]);
>> B = sym('B_%d_%d', [2, 3]);
>> syms c d % 스칼라 값
>> A = sym(A, ‘real’);
>> B = sym(B, ‘real’); 행렬 A, B의 각 원소가 복소수가 아니게 설정
• 두 행렬의 합
>> A+B
ans =
• 두 행렬의 차
>> A-B
ans =
9
행렬 연산
• 행렬과 스칼라 연산 (곱과 합/차)
>> c*A+d
ans =
[ d + A_1_1*c, d + A_1_2*c, d + A_1_3*c]
[ d + A_2_1*c, d + A_2_2*c, d + A_2_3*c]
• 스칼라에 행렬 나눗셈
>> c./A
ans =
[ c/A_1_1, c/A_1_2, c/A_1_3]
[ c/A_2_1, c/A_2_2, c/A_2_3]
• 행렬 원소간 곱
>> A .* B
ans =
[ A_1_1*B_1_1, A_1_2*B_1_2, A_1_3*B_1_3]
[ A_2_1*B_2_1, A_2_2*B_2_2, A_2_3*B_2_3]
• 행렬 곱
>> A * B'
ans =
[ A_1_1*B_1_1 + A_1_2*B_1_2 + A_1_3*B_1_3, A_1_1*B_2_1 + A_1_2*B_2_2 + A_1_3*B_2_3]
[ A_2_1*B_1_1 + A_2_2*B_1_2 + A_2_3*B_1_3, A_2_1*B_2_1 + A_2_2*B_2_2 + A_2_3*B_2_3] 10
행렬 연산
• 역행렬
>> A = sym('A_%d_%d', [2 2]);
>> inv(A)
ans =
>> pretty(ans)
• Determinant
>> det(A)
ans =
A_1_1*A_2_2 - A_1_2*A_2_1
11
Complex Value
심볼릭 변수의 속성을 real로 설정한 다음, 아래와 같이 허수 i와 조합하여 복소수
표현 >> x = sym('x', 'real'); >> class(z)
>> y = sym('y', 'real'); ans =
>> z = x + i * y sym
z= >> conj(z)
ans =
x + y*i x - y*i
>> x = sym('x');
>> y = sym('y');
>> z = x+y*i
z=
x + y*i
>> conj(z)
ans =
conj(x) - conj(y)*i
12
함수 형태로 정의하기
정의 >> syms f(t)
>> syms g(x,y)
>> f(t) = 1/2*9.8*t^2
f(t) =
(49*t^2)/10
g(x, y) =
cos(x)*cos(y) + sin(x)*sin(y)
값 대입 >> f(5)
ans =
245/2
>> g(3,4)
ans =
cos(3)*cos(4) + sin(3)*sin(4) 13
함수 형태로 정의한 수식 그래프 그리기
g(x, y) =
cos(x)*cos(y) + sin(x)*sin(y)
>> ezsurf(g)
또는
>> t = linspace(-2*pi,2*pi,50)
>> [X,Y] = meshgrid( t );
>> Z = double( g(X,Y) );
>> surf(X,Y,Z)
14
sym 함수로 Expression 정의하기
y = sym(‘5*x^2 – 3’)
>> y = sym('5*x^2+3')
y=
5*x^2 + 3
>> ezplot(y)
15
sym 함수로 Expression 정의하기
등호를 포함한 expression도 정의 가능
예) y = sym(‘5*x^2 – 3 = 2’)
>> y = sym('5*x^2+3=2')
y=
5*x^2 + 3 == 2
>> solve(y)
ans =
(5^(1/2)*i)/5
-(5^(1/2)*i)/5
16
정의한 expression들의 합, 차, 곱
>> z1 = sym('3*(1-x)^2+5*x-(y+1)^2');
>> z2 = sym('y^2-5*x*y+2*(x+y)-5');
>> z1
z1 =
5*x + 3*(x - 1)^2 - (y + 1)^2
>> z2
z2 =
2*x + 2*y - 5*x*y + y^2 - 5
>> z1+z2
ans =
7*x + 2*y + 3*(x - 1)^2 - (y + 1)^2 - 5*x*y + y^2 - 5
>> z1-z2
ans =
3*x - 2*y + 3*(x - 1)^2 - (y + 1)^2 + 5*x*y - y^2 + 5
>> z1*z2
ans =
(5*x + 3*(x - 1)^2 - (y + 1)^2)*(2*x + 2*y - 5*x*y + y^2 - 5)
17
Symbolic Math 함수들에 대한 정보 얻기
예를 들어, diff 라는 symbolic math 함수에 대한 정보를 얻고 싶을 때
• >> help diff 로 나오는 결과는 symbolic math 함수 diff에 대한 정보가 아님
– help 페이지에서는 여러 다른 toolbox에서 정의된 동일한 이름의 함수들을
친절하게 알려줌
– 예) Overloaded methods: sym/diff
18
Symbolic Math로 미분 계산하기
함수 f(x)를 미분하려면
df = 또는 df =
n*x^(n - 1) n*x^(n - 1)
19
Symbolic Math로 미분 계산하기
함수 f(x)를 미분하려면
df = 또는 df =
n*x^(n - 1) n*x^(n - 1)
20
미분 계산하기
n차 도함수 계산하기
• diff( 함수, 변수, n)
>> syms a b t
>> syms x n >> g = cos(a*t+b);
>> f = x^n; >> dg1 = diff(g, t)
>> df = diff(f, x, 2)
dg1 =
함수 g의
df = 1차 도함수
함수 f의 -a*sin(b + a*t)
2차 도함수
n*x^(n - 2)*(n - 1) >> dg2 = diff(gd1, t) 함수 g의
1차 도함수의
>> df = diff(f, x, 3) dg2 = 1차 도함수
df = 함수 f의 -a^2*cos(b + a*t)
≡
3차 도함수
>> gd = diff(g, 2)
n*x^(n - 3)*(n - 1)*(n - 2)
함수 g의
gd =
2차 도함수
-a^2*cos(b + a*t)
21
여러 수식을 동시에 미분하기
A = diff( 수식 행렬 )
• m x n 크기의 행렬에 수식이 있으면, 각각의 수식에 대해 미분을 수행한
다음, 입력 수식 행렬과 동일한 크기의 행렬 A에 미분 결과를 반환
>> syms a b x
>> M = [a*x^2+b x*exp(-a*x); cos(a*x) -sin(a*x+b)]
M=
[ a*x^2 + b, x*exp(-a*x)]
[ cos(a*x), -sin(b + a*x)]
>> gM = diff(M, x, 1)
gM =
22
편미분
n개의 독립 변수들로 구성된 함수의 경우, 변수를 명시적으로 지정하면
해당 변수로 편미분 수행
fx = 1/x^2 - 4*x*y*exp(-y^2)
fy = 1/x^2 - 4*x*y*exp(-y^2)
- 1/x - 2*x^2*y*exp(-y^2)
23
접선 벡터
어떤 곡선 P(t) = (x(t), y(t), z(t))의 접선 벡터는 v(t) = [x’(t0), y’(t0), z’(t0)]
P(t) = (cos(t), sin(t), t/2pi) 일 때 접선 벡터를 그려봅시다.
syms t
m = 0:0.1:4*pi;
ar = [p' p'+nv'];
plot3(ar(1,:), ar(2,:), ar(3,:), 'color', 'r');
end
grid on;
axis on;
24
>> syms x a t h;
>> limit(1/x,x,0,'left')
수식 MATLAB 수식 ans =
-Inf
limit( f ) 또는
limit( f, x, 0 ) >> limit((sin(x+h)-sin(x))/h,h,0)
ans =
limit( f, x, a ) 또는 cos(x)
limit( f, a)
>> v = [(1 + a/x)^x, exp(-x)];
limit( f, x, a, ‘left’ ) >> limit(v,x,inf,'left')
ans =
limit( f, x, a, ‘right’ ) [ exp(a), 0]
25
함수의 극한
Symbolic Math Toolbox와 MATLAB 수치 계산을 통한 극한 값 비교
26
Quiz
27
Quiz Sol.
>> syms n x
>> limit( (1+x/n)^n, n, inf )
ans =
exp(x)
>> syms x
>> limit( 1/x, x, 0, 'left' )
ans =
-Inf
>> syms x
>> f = (4*x^2 - 3*x + 1) / (3*x^2 + 2*x - 5);
>> limit( f, x, inf )
ans =
4/3
>> syms x
>> limit( (exp(x)-1) / sin(x), x, 0 )
ans =
1
28
Quiz
29
Quiz Sol.
ans = ≡ ans =
-sin(x) -sin(x)
30
적분 >> syms x x1 alpha u t;
>> int(1/(1+x^2))
ans =
int( F) atan(x)
• 함수 F를 부정적분
int( F, v ) >> int(x1*log(1+x1),0,1)
• 함수 F를 변수 v에 대해 부정적분
ans =
int( S, a, b ) 1/4
• 함수 F를 [a, b] 구간에서 부정적분
int( S, v, a, b ) >> int(4*x*t,x,2,sin(t))
• 함수 F를 변수 v에 대해 [a, b] 구간에서 부정적분
ans =
-2*t*(cos(t)^2 + 3)
ans =
int( f, x, a, b ) [ exp(t), exp(alpha*t)/alpha]
적분 상수 C는 출력하지 않음!!
31
Quiz
32
Quiz Sol.
>> syms x
>> int( exp(-x^2), x, -inf, inf )
ans =
pi^(1/2)
>> syms x
>> int( x*sin(x), x)
ans =
sin(x) - x*cos(x)
>> syms x
>> int( x^3-2*x^2+x-1, x, 0, 2 )
ans =
-4/3
>> syms x
>> int(atan(x)/x^(3/2), x, 0, 1)
ans =
- pi/2 + 2^(1/2)*atan(2^(1/2)*(1/2 - i/2))*(1 + i)
+ 2^(1/2)*atan(2^(1/2)*(1/2 + i/2))*(1 - i)
>> syms x
>> int(x^3-exp(x)*sin(x), 0, pi)
ans =
pi^4/4 - exp(pi)/2 - 1/2
33
적분의 응용
34
수치 적분
35
>> syms x real
>> int( x*log(x), x, 2, 4 )
수치 적분 ans =
14*log(2) – 3
ans =
6.7041
ans =
int(exp(-x^2)*log(x^2 + 1), x == 0..1)
ans =
0.1539
ans =
int(sin(x)^2/(cos(x)^2 + 1)^(1/2), x == 0..2*pi)
ans =
2.8478
36
수치 적분의 응용
프레넬 적분
• 두 함수 x(t), y(t)가 변수 t에 종속적
clear all;
n = 1000;
x = zeros(1, n);
y = zeros(1, n);
t = linspace(0, 4*pi, n+1);
for i = 1:n
x(i) = quadl(@(x) cos(x.^2), t(i), t(i+1), 1e-3);
y(i) = quadl(@(x) sin(x.^2), t(i), t(i+1), 1e-3);
end
x = cumsum(x);
y = cumsum(y);
plot([-x(end:-1:1) 0 x], [-y(end:-1:1) 0 y])
axis equal;
37
다중 적분
ans =
81/4
ans =
(152*exp(1))/3 - sin(4)/2 + sin(6)/2 - 152/3
>> double(ans)
ans =
87.2983
38
다중 적분의 수치 적분
ans =
87.2983
ans =
0.3078 39
Symbolic 다중 적분
ans =
((a - b)*(c - d)*(a^3 + a^2*b + a*b^2 + 2*a + b^3 + 2*b + 2*c + 2*d))/4
V=
pi*a^2*h
40
다항식 표현 바꾸기
다항식 인수 분해 (factor 함수)
>> syms x y
>> f = x^3 - 6*x^2 + 11*x - 6;
>> factor(f)
ans =
(x - 3)*(x - 1)*(x - 2)
ans =
x^3 - 6*x^2 + 11*x – 6
>> expand(cos(x+y))
ans =
cos(x)*cos(y) - sin(x)*sin(y)
41
다항식 표현 바꾸기
다항식 수식 단순화 (simplify 함수)
ans =
1
>> simplify(exp(c*log(sqrt(alpha+beta))))
ans =
(alpha + beta)^(c/2)
42
다항식 표현 바꾸기
다항식 수식에서 공통 항 모으기 (collect 함수)
>> syms x y
>> collect(x^2*y + y*x - x^2 - 2*x)
ans =
(y - 1)*x^2 + (y - 2)*x
>> syms x y
>> f = 1/(x-1)*sin(x)
f=
sin(x)/(x - 1)
>> pretty(f)
sin(x)
------
x-1
>> syms x
>> int(sqrt(tan(x)))
ans =
>> pretty(ans)
1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2
2 (log(2 tan(x) - tan(x) - 1) - log(tan(x) + 2 tan(x) + 1)) 2 (atan(2 tan(x) - 1) + atan(2 tan(x) + 1))
-------------------------------------------------------------------------- + ----------------------------------------------------------
4 2
44
심볼에 값 대입하기
subs 함수
• symbolic substitution을 수행
subs(S)
• 심볼릭 표현 S의 모든 변수들을 MATLAB workspace 상에 정의 된 변수들의 값으로 대체
subs(S, NEW)
• 심볼릭 표현 S의 자유변수(free variable)이 NEW로 대체
45
심볼에 값 대입하기
subs( S )
• 아래와 같이 심볼릭 표현이 정의되었다고 할 때,
>> syms a t y C1
>> y = exp(-a*t)*C1
y=
C1*exp(-a*t)
• a, C1에 값을 대입
>> a = 980; C1= 3;
>> y
y=
C1*exp(-a*t)
y=
3*exp(-980*t)
46
심볼에 값 대입하기
subs( S, NEW )
>> syms a b c x t
>> f = a*sin(b*x)*exp(-a*x^c+t)
f=
a*exp(t - a*x^c)*sin(b*x)
>> syms h
>> subs(f, h)
ans =
a*exp(t - a*h^c)*sin(b*h)
f=
sin(t)
f=
sin(omega*t)
47
심볼에 값 여러 개 동시에 대입하기
배열 substitution >> syms a b alpha
>> subs(cos(a)+sin(b),{a,b},[alpha,2])
ans =
sin(2) + cos(alpha)
ans =
[ exp(-t), exp(-3*t)]
[ exp(-4*t), exp(-2*t)]
ans =
[ 0, -1]
[ 2, 0]
48
Symbolic Summation
급수의 합을 계산
• symsum( f )
– 기본 변수(default variable)에 대해 f(0) + f(1) + … + f(n-1) 를 계산
• symsum( f, x )
– 심볼릭 변수 x에 대해 f(0) + f(1) + … + f(n-1) 를 계산
• symsum( f, a, b )
– 기본 변수(default variable)에 대해 f(a) + f(a+1) + … + f(b) 를 계산
• symsum( f, x, a, b )
– 심볼릭 변수 x에 대해 f(a) + f(a+1) + … + f(b) 를 계산
49
Symbolic Summation
급수의 합 계산 예제
>> syms k n
>> symsum(k) >> symsum(k^2,0,10)
ans = ans =
k^2/2 - k/2 385
ans = ans =
(n*(n - 1))/2 0
ans = ans =
(n*(n + 1))/2 -psi(1, k)
ans = ans =
(n*(2*n + 1)*(n + 1))/6 pi^2/6
50
Symbolic Production
급수의 곱을 계산
ans =
51
Quiz
52
Quiz Sol.
f=
발산 수렴
53
Quiz
54
Quiz Sol.
f(x, n) =