matlab for c/c++ programmers - kaist it academy web … · 2014-01-14 · matlab programming...
TRANSCRIPT
MATLAB Programming
오늘 강의 내용 (2014/01/14)
Symbolic Math Toolbox• 숫자로 주어진 변수”값”이 아니라 변수 심볼에 대한 수식 연산• (즉, symbolic expression 계산)
• 미분, 극한, 적분, 변환의 symbolic expression 계산
1
MATLAB Programming
Symbolic Math Toolbox
지금까지 우리가 해온 계산 방법
• 변수에 숫자가 대입되어 있을 때, 변수들을 사칙 연산을 통해 계산하여 수치 값을 얻음
y = x + x의 결과로 y = 2*x 라는 결과를 얻을 순 없을까?
Symbolic Math Toolbox를 이용하면 가능하다!• Symbolic Expression을 계산하기 위한 툴박스
>> x = 1;>> y = x + x
y =
2
3
MATLAB Programming
간단한 Symbolic Expression 연산
Symbolic Expression 연산에 사용할 심볼을 정의해야 함
• syms 키워드를 사용하여 x, y, z을 symbolic 형의 데이터 타입으로 선언
• Symbolic Expression을 적으면, 해당 연산이 수행되어 계산 결과가symbol들의 표현으로 나타남
>> syms x y z
>> y = x + x + 2*z
y =
2*x + 2*z
4
MATLAB Programming
간단한 Symbolic Expression 연산
Symbolic 형의 데이터 타입으로 선언되지 않았을 때 Symbolic Expression을계산하려고 하면 다음과 같은 에러 발생
사전에 정의한 Symbol 형 변수에 수치값을 대입하면, 해당 변수는 수치값의데이터 타입으로 변경됨
>> syms x>> y = x + kUndefined function or variable 'k'.
>> syms x>> class(x)ans =
sym
>> x = single(10.3125);>> class(x)ans =
single
5
MATLAB Programming
Symbolic Toolbox의 기능
기능 분야
Calculus 미분, 적분, 극한, 급수, …
Linear Algebra 역행렬, 고유치, determinant, canonical forms, …
Simplification 인수분해, 전개, 분수표현, …
Equation Solving 미분방정식, 다항식해계산, …
Variable-Precision Arithmetics 주어진정밀도에근거하여수식계산
Transformation Fourier Transform, Laplace Transform, Z-transform, …
Special Functions 응용수학에필요한각종특수함수계산
6
MATLAB Programming
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
7
MATLAB Programming
sym 함수
x = sym(‘x’)• “x”라고 이름을 가진 symbolic variable을 정의
x = sym(‘x’, ‘real’)• “x”란 이름을 가진 정수형의 symbolic variable을 정의• “>> syms x real” 과 동일• real 특성 없애려면 “>> x = sym(‘x’, ‘unreal’)”
k = sym(‘k’, ‘positive’)• 양의 실수 값을 가지는 symbolic variable k를 정의
x = sym(‘x’, ‘clear’)• symbolic variable x에 real, positive 등의 속성들을 모두 제거
A = sym(‘A’, [M N])• 이름이 A인 M x N 행렬의 symbolic variable 정의• 각 원소의 이름은 Ai_j 가 됨. 벡터의 경우에는 Ak가 됨
A = sym(‘A’, N)• 이름이 A인 N x N 정사각형 행렬의 symbolic variable 정의• 각 원소의 이름은 Ai_j 가 됨. 벡터의 경우에는 Ak가 됨
>> A = sym('A', [2 3])
A =
[ A1_1, A1_2, A1_3][ A2_1, A2_2, A2_3]
>> A = sym('A', [1 3])
A =
[ A1, A2, A3]
>> A = sym('A', 2)
A =
[ A1_1, A1_2][ A2_1, A2_2]
8
MATLAB Programming
sym 함수
A = sym(‘A_%d_%d’, [M N])• 각 원소의 이름이 A_i_j 가 되며, 행렬의 이름이 A인
M x N 행렬의 symbolic variable 정의• 벡터의 경우 각 원소의 이름이 A_k 가 됨• 행렬의 원소 접근은 A(i, j) 로 할 수 있음
S = sym(A, flag)• A 가 스칼라 또는 행렬인 경우, flag는 ‘r’, ‘f’, ‘e’, ‘d’ 가능
‘r’ : rational (default)• ‘f’ : floating point• ‘e’ : estimated error• ‘d’ : decimal
>> A = sym('A_%d_%d', [3 2])
A =
[ A_1_1, A_1_2][ A_2_1, A_2_2][ A_3_1, A_3_2]
>> B = sym(‘B_%d_%d', [3 1])
B =
B_1_1B_2_1B_3_1
>> A(2,2)
ans =
A_2_2
>> r = sym(1/3)r = 1/3
>> f = sym(1/3, 'f')f = 6004799503160661/18014398509481984
>> d = sym(1/3, 'd')d = 0.33333333333333331482961625624739
>> e = sym(1/3, 'e')e = 1/3 - eps/12 9
MATLAB Programming
행렬 연산
두 행렬의 사칙연산의 결과로, 각 행렬 원소 명들간의 연산 결과가 결과로 나옴
예제• 2 x 3 행렬 A, B, 스칼라 값 c, d가 symbolic variable로 정의되어 있다고 했을 때,
• 두 행렬의 합
• 두 행렬의 차
>> A+Bans =
[ 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 = 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-Bans =
[ 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의각원소가복소수가아니게설정
10
MATLAB Programming
행렬 연산
• 행렬과 스칼라 연산 (곱과 합/차)
• 스칼라에 행렬 나눗셈
• 행렬 원소간 곱
• 행렬 곱
>> 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] 11
MATLAB Programming
행렬 연산
• 역행렬
• Determinant
>> A = sym('A_%d_%d', [2 2]);>> inv(A)
ans =
[ A_2_2/(A_1_1*A_2_2 - A_1_2*A_2_1), -A_1_2/(A_1_1*A_2_2 - A_1_2*A_2_1)][ -A_2_1/(A_1_1*A_2_2 - A_1_2*A_2_1), A_1_1/(A_1_1*A_2_2 - A_1_2*A_2_1)]
>> pretty(ans)
>> det(A)
ans =
A_1_1*A_2_2 - A_1_2*A_2_1
𝑎𝑎 𝑏𝑏𝑐𝑐 𝑑𝑑
−1=
1𝑎𝑎𝑑𝑑 − 𝑏𝑏𝑐𝑐
𝑑𝑑 −𝑏𝑏−𝑐𝑐 𝑎𝑎
12
MATLAB Programming
Complex Value
심볼릭 변수의 속성을 real로 설정한 다음, 아래와 같이 허수 i와 조합하여 복소수표현
심볼릭 변수의 속성을 real로 설정하지 않으면, 의도한 복소수를 얻을 수 없음
>> x = sym('x', 'real');>> y = sym('y', 'real');>> z = x + i * y
z =
x + y*i
>> class(z)ans =sym
>> conj(z)ans =x - y*i
>> x = sym('x');>> y = sym('y');>> z = x+y*iz =x + y*i
>> conj(z)ans =conj(x) - conj(y)*i
13
MATLAB Programming
sym 함수로 Expression 정의하기
y = sym(‘5*x^2 – 3’)
>> y = sym('5*x^2+3')
y =
5*x^2 + 3
>> ezplot(y)
14
MATLAB Programming
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
15
MATLAB Programming
정의한 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)
16
MATLAB Programming
Symbolic Math 함수들에 대한 정보 얻기
예를 들어, diff 라는 symbolic math 함수에 대한 정보를 얻고 싶을 때• >> help diff 로 나오는 결과는 symbolic math 함수 diff에 대한 정보가 아님
– help 페이지에서는 여러 다른 toolbox에서 정의된 동일한 이름의 함수들을친절하게 알려줌
– 예) Overloaded methods: sym/diff
• >> help sym/diff 수행시 나오는 결과가 찾고자 하는 정보
17
MATLAB Programming
Symbolic Math로 미분 계산하기
함수 f(x)를 미분하려면
• 1. 함수에 쓰인 변수들을 symbolic 데이터 타입으로 변경
• 2. 앞서 정의한 심볼 변수로 함수를 정의
• 3. sym/diff 함수를 이용해 함수 f(x)를 미분
>> syms x n
>> f = x^n
>> df = diff( f )
df =
n*x^(n - 1)
>> df = diff( f, x )
df =
n*x^(n - 1)
또는
18
MATLAB Programming
Symbolic Math로 미분 계산하기
함수 f(x)를 미분하려면
• 1. 함수에 쓰인 변수들을 symbolic 데이터 타입으로 변경
• 2. 앞서 정의한 심볼 변수로 함수를 정의
• 3. sym/diff 함수를 이용해 함수 f(x)를 미분
>> syms x n
>> f = x^n
>> df = diff( f )
df =
n*x^(n - 1)
>> df = diff( f, x )
df =
n*x^(n - 1)
또는
x로미분해야한다는것을어떻게알았을까?
• symbolic toolbox는변수명이문자 ‘x’에알파벳순으로가장변수로미분수행
• 따라서, ‘x’와가장가까운변수 ‘x’로미분계산
19
MATLAB Programming
미분 계산하기
n차 도함수 계산하기• diff( 함수, 변수, n)
>> syms x n>> f = x^n;>> df = diff(f, x, 2)
df =
n*x^(n - 2)*(n - 1)
>> df = diff(f, x, 3)
df =
n*x^(n - 3)*(n - 1)*(n - 2)
함수 f의2차도함수
함수 f의3차도함수
>> syms a b t>> g = cos(a*t+b);>> dg1 = diff(g, t)
dg1 =
-a*sin(b + a*t)
>> dg2 = diff(gd1, t)
dg2 =
-a^2*cos(b + a*t)
>> gd = diff(g, 2)
gd =
-a^2*cos(b + a*t)
함수 g의1차도함수
함수 g의2차도함수
함수 g의1차도함수의1차도함수
≡
20
MATLAB Programming
여러 수식을 동시에 미분하기
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 =
[ 2*a*x, exp(-a*x) - a*x*exp(-a*x)][ -a*sin(a*x), -a*cos(b + a*x)]
21
MATLAB Programming
편미분
n개의 독립 변수들로 구성된 함수의 경우, 변수를 명시적으로 지정하면해당 변수로 편미분 수행
>> syms x y>> f = x^2*exp(-y^2)-y/x;>> fx = diff(f, x)
fx =
2*x*exp(-y^2) + y/x^2
>> fy = diff(f, y)
fy =
- 1/x - 2*x^2*y*exp(-y^2)
>> fxy1 = diff(fx, y)
fxy1 =
1/x^2 - 4*x*y*exp(-y^2)
>> fxy2 = diff(fy, x)
fxy2 =
1/x^2 - 4*x*y*exp(-y^2)
𝝏𝝏𝝏𝝏𝝏𝝏𝝏𝝏
22
MATLAB Programming
접선 벡터
어떤 곡선 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
x = cos(t); y = sin(t); z = t/(2*pi);
m = 0:0.1:4*pi;
plot3( subs(x,m), subs(y,m), subs(z,m) );hold on;
dx = diff(x); dy = diff(y); dz = diff(z);
for s = linspace(0, 4*pi, 20)p = [subs(x,s), subs(y,s), subs(z,s)];v = [subs(dx,s), subs(dy,s), subs(dz,s)];nv = v / norm(v);
ar = [p' p'+nv'];plot3(ar(1,:), ar(2,:), ar(3,:), 'color', 'r');
end
grid on;axis on;
23
MATLAB Programming
함수의 극한
limit( F, x, a )• 함수 F에서 x a 일 때 극한값
limit( F )• 함수 F가 a 0 일 때 극한값
limit( F, x, a, ‘right’ )• 함수 F가 x a 일 때의 우극한값
limit( F, x, a, ‘left’ )• 함수 F가 x a 일 때의 좌극한값
>> syms x a t h;
>> limit(sin(x)/x)ans =1
>> limit((x-2)/(x^2-4),2)ans =1/4
>> limit((1+2*t/x)^(3*x),x,inf)ans =exp(6*t)
>> limit(1/x,x,0,'right')ans =Inf
>> limit(1/x,x,0,'left')ans =-Inf
>> limit((sin(x+h)-sin(x))/h,h,0)ans =cos(x)
>> v = [(1 + a/x)^x, exp(-x)];>> limit(v,x,inf,'left')ans =[ exp(a), 0]
수식 MATLAB 수식
lim𝑥𝑥→0
𝑓𝑓(𝑥𝑥) limit( f ) 또는limit( f, x, 0 )
lim𝑥𝑥→𝑎𝑎
𝑓𝑓(𝑥𝑥) limit( f, x, a ) 또는limit( f, a)
lim𝑥𝑥→𝑎𝑎−
𝑓𝑓(𝑥𝑥) limit( f, x, a, ‘left’ )
lim𝑥𝑥→𝑎𝑎+
𝑓𝑓(𝑥𝑥) limit( f, x, a, ‘right’ )
lim𝑥𝑥→0
sin 𝑥𝑥𝑥𝑥
lim𝑥𝑥→2
𝑥𝑥 − 2𝑥𝑥2 − 4
lim𝑥𝑥→∞
1 +2𝑡𝑡𝑥𝑥
3𝑥𝑥
lim𝑥𝑥→0+
1𝑥𝑥
lim𝑥𝑥→0−
1𝑥𝑥
lim𝑥𝑥→0
sin 𝑥𝑥 + ℎ − sin 𝑥𝑥ℎ
lim𝑥𝑥→∞
1 +𝑎𝑎𝑥𝑥
𝑥𝑥
lim𝑥𝑥→∞
𝑒𝑒−𝑥𝑥
24
MATLAB Programming
함수의 극한
Symbolic Math Toolbox와 MATLAB 수치 계산을 통한 극한 값 비교
𝑓𝑓 𝑥𝑥 = lim𝑛𝑛→∞
𝑛𝑛 21𝑛𝑛 − 1
% MATLAB 수치계산
>> n = realmax
n =1.7977e+308
>> x = n*(2^(1/n)-1)
x =
0
% Symbolic Math Toolbox
>> syms n>> f = n*(2^(1/n)-1);>> limit(f, inf)
ans =
log(2)
25
MATLAB Programming
Quiz
다음 수식들의 극한값을 limit 함수를 이용하여 계산해봅시다.
• 𝑓𝑓 𝑥𝑥 = lim𝑛𝑛→∞
1 + 𝑥𝑥𝑛𝑛
𝑛𝑛
• 𝑓𝑓 𝑥𝑥 = lim𝑥𝑥→0−
1𝑥𝑥
• 𝑓𝑓 𝑥𝑥 = lim𝑥𝑥→∞
4𝑥𝑥2−3𝑥𝑥+13𝑥𝑥2+2𝑥𝑥−5
• 𝑓𝑓 𝑥𝑥 = lim𝑥𝑥→0
𝑒𝑒𝑥𝑥−1sin 𝑥𝑥
26
MATLAB Programming
Quiz
미분은 다음과 같이 극한으로 정의됩니다.
• 𝑓𝑓 𝑥𝑥 = limℎ→0
𝑓𝑓 𝑥𝑥+ℎ −𝑓𝑓(𝑥𝑥)ℎ
𝝏𝝏 𝝏𝝏 = 𝒄𝒄𝒄𝒄𝒄𝒄 𝝏𝝏 함수의 미분값이 diff 함수를 써서 얻었을 때와, 위의 극한값을 계산해서 얻어낸 결과가 동일한지 비교해봅시다.
27
MATLAB Programming
적분
int( F )• 함수 F를 부정적분
int( F, v )• 함수 F를 변수 v에 대해 부정적분
int( S, a, b )• 함수 F를 [a, b] 구간에서 부정적분
int( S, v, a, b )• 함수 F를 변수 v에 대해 [a, b] 구간에서 부정적분
>> syms x x1 alpha u t;
>> int(1/(1+x^2))
ans =atan(x)
>> int(x1*log(1+x1),0,1)
ans =1/4
>> int(4*x*t,x,2,sin(t))
ans =-2*t*(cos(t)^2 + 3)
>> A = [cos(x*t),sin(x*t);-sin(x*t),cos(x*t)];>> int(A,t)
ans =[ sin(t*x)/x, -cos(t*x)/x][ cos(t*x)/x, sin(t*x)/x]
>> int([exp(t),exp(alpha*t)])
ans =[ exp(t), exp(alpha*t)/alpha]
�1
1 + 𝑥𝑥2 𝑑𝑑𝑥𝑥
�0
1𝑥𝑥1 log 1 + 𝑥𝑥1 𝑑𝑑𝑥𝑥1
�2
sin 𝑡𝑡4𝑥𝑥𝑡𝑡 𝑑𝑑𝑥𝑥
� cos 𝑥𝑥𝑡𝑡 𝑑𝑑𝑡𝑡 � sin𝑥𝑥𝑡𝑡 𝑑𝑑𝑡𝑡
� cos 𝑥𝑥𝑡𝑡 𝑑𝑑𝑡𝑡�−sin𝑥𝑥𝑡𝑡 𝑑𝑑𝑡𝑡
�𝑒𝑒𝑡𝑡 𝑑𝑑𝑡𝑡 �𝑒𝑒𝛼𝛼𝑡𝑡 𝑑𝑑𝑡𝑡
수식 MATLAB 수식
�𝑓𝑓(𝑥𝑥)𝑑𝑑𝑥𝑥 int( f )int( f, x )
�𝑓𝑓(𝑡𝑡)𝑑𝑑𝑡𝑡 int( f, t )
�𝑎𝑎
𝑏𝑏𝑓𝑓(𝑥𝑥)𝑑𝑑𝑥𝑥 int( f, x, a, b )
적분상수 C는출력하지않음!!28
MATLAB Programming
Quiz
다음 수식들의 적분값을 int 함수를 이용하여 계산해봅시다.
• 𝑓𝑓 𝑥𝑥 = 𝑒𝑒−(𝑘𝑘𝑥𝑥)2, −∞ ≤ 𝑥𝑥 ≤ ∞
• 𝑓𝑓 𝑥𝑥 = 𝑥𝑥 sin 𝑥𝑥
• 𝑓𝑓 𝑥𝑥 = 𝑥𝑥3 − 2𝑥𝑥2 + 𝑥𝑥 − 1, 0 ≤ 𝑥𝑥 ≤ 2
• 𝑓𝑓 𝑥𝑥 = tan−1 𝑥𝑥𝑥𝑥 ⁄3 2 , 0 ≤ 𝑥𝑥 ≤ 1
• 𝑓𝑓 𝑥𝑥 = 𝑥𝑥3 − 𝑒𝑒𝑥𝑥 sin 𝑥𝑥, 0 ≤ 𝑥𝑥 ≤ 𝜋𝜋
29
MATLAB Programming
수치 적분
정적분 ∫𝒂𝒂𝒃𝒃 𝝏𝝏 𝝏𝝏 𝒅𝒅𝝏𝝏의 근사를 계산하는 적분 방법
• trapz 함수– trapezoidal method 사용
• quad 함수– Simpson quadrature rule 사용
• quadl 함수– Lobatto quadrature rule 사용
30
MATLAB Programming
수치 적분
• ∫24 𝑥𝑥 log 𝑥𝑥 𝑑𝑑𝑥𝑥
• ∫01 𝑒𝑒−𝑥𝑥2 log 1 + 𝑥𝑥2 𝑑𝑑𝑥𝑥
• ∫02𝜋𝜋 𝑠𝑠𝑠𝑠𝑛𝑛2 𝑥𝑥
1+𝑐𝑐𝑐𝑐𝑠𝑠2(𝑥𝑥)𝑑𝑑𝑥𝑥
>> syms x real>> int( sin(x)^2/sqrt(1+cos(x)^2), x, 0, 2*pi )Warning: Explicit integral could not be found.
ans =int(sin(x)^2/(cos(x)^2 + 1)^(1/2), x == 0..2*pi)
>> quadl( @(x) sin(x).^2./sqrt(1+cos(x).^2), 0, 2*pi )
ans =2.8478
>> syms x real>> int( exp(-x^2)*log(1+x^2), x, 0, 1 )Warning: Explicit integral could not be found.
ans =int(exp(-x^2)*log(x^2 + 1), x == 0..1)
>> quadl( @(x) exp(-x.^2).*log(1+x.^2), 0, 1 )
ans =0.1539
>> syms x real>> int( x*log(x), x, 2, 4 )
ans =14*log(2) – 3
>> quad( @(x) x.*log(x), 2, 4 )
ans =6.7041
31
MATLAB Programming
수치 적분의 응용
프레넬 적분• 두 함수 x(t), y(t)가 변수 t에 종속적
𝑥𝑥 𝑡𝑡 = �0
𝑡𝑡cos 𝑢𝑢2 𝑑𝑑𝑢𝑢 𝑦𝑦 𝑡𝑡 = �
0
𝑡𝑡sin 𝑢𝑢2 𝑑𝑑𝑢𝑢
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);
endx = cumsum(x);y = cumsum(y);plot([-x(end:-1:1) 0 x], [-y(end:-1:1) 0 y])axis equal;
32
MATLAB Programming
다중 적분
다중 적분은 아래와 같이 반복 적분으로 계산 할 수 있음
• ∬𝑓𝑓 𝑥𝑥,𝑦𝑦 𝑑𝑑𝑑𝑑 = ∫𝑐𝑐𝑑𝑑 ∫𝑎𝑎
𝑏𝑏 𝑓𝑓 𝑥𝑥,𝑦𝑦 𝑑𝑑𝑥𝑥𝑑𝑑𝑦𝑦 = ∫𝑎𝑎𝑏𝑏 ∫𝑐𝑐
𝑑𝑑 𝑓𝑓 𝑥𝑥,𝑦𝑦 𝑑𝑑𝑦𝑦𝑑𝑑𝑥𝑥
• ∫12 ∫0
3(𝑥𝑥2 + 𝑥𝑥 + 𝑦𝑦)𝑑𝑑𝑦𝑦𝑑𝑑𝑥𝑥
• ∫46 ∫0
1(𝑦𝑦2𝑒𝑒𝑥𝑥 + 𝑥𝑥 cos𝑦𝑦)𝑑𝑑𝑥𝑥𝑑𝑑𝑦𝑦
>> syms x y real>> f = x^3 + x + y;>> int(int(f,y,0,3),x,1,2)
ans =
81/4
>> syms x y real>> f = y^2*exp(x)+x*cos(y);>> int(int(f,x,0,1), y,4,6)
ans =(152*exp(1))/3 - sin(4)/2 + sin(6)/2 - 152/3
>> double(ans)
ans =87.2983
33
MATLAB Programming
다중 적분의 수치 적분
numerical method로 다중 적분의 근사치를 계산
• dblquad, triplequad– 이중 적분, 삼중 적분의 수치 적분을 위한 함수
• ∫46 ∫0
1(𝑦𝑦2𝑒𝑒𝑥𝑥 + 𝑥𝑥 cos𝑦𝑦)𝑑𝑑𝑥𝑥𝑑𝑑𝑦𝑦
• ∫01 ∫0
1 ∫01(𝑦𝑦 + 𝑧𝑧) sin 𝜋𝜋 𝑥𝑥2 + 𝑦𝑦2 𝑑𝑑𝑥𝑥𝑑𝑑𝑦𝑦𝑑𝑑𝑧𝑧
>> fxy = @(x, y) (y^2*exp(x) + x*cos(y));>> dblquad(fxy, 0, 1, 4, 6)
ans =
87.2983
>> syms x y z real>> f = (y+z)*sin(pi*(x^2+y^2));>> int(int(int(f,x,0,1),y,0,1),z,0,1)
ans =
(fresnelC(2^(1/2))*(2^(1/2) + pi*fresnelS(2^(1/2))))/(2*pi)
>> double(ans)
ans =0.3078
>> f = @(x,y,z) (y+z).*sin(pi*(x.^2+y.^2));>> triplequad(f,0,1,0,1,0,1)
ans =
0.3078
34
MATLAB Programming
Symbolic 다중 적분
정적분 시 매개변수를 변수로 주는 경우• 예: ∫𝑎𝑎
𝑏𝑏 ∫𝑐𝑐𝑑𝑑(𝑥𝑥2 + 𝑥𝑥 + 𝑦𝑦)𝑑𝑑𝑦𝑦𝑑𝑑𝑥𝑥
• 다른 좌표계에 대한 적분– eg) 실린더의 부피 계산 ∫0
ℎ ∫02𝜋𝜋 ∫0
𝑎𝑎 𝑟𝑟𝑑𝑑𝑟𝑟𝑑𝑑𝜃𝜃𝑑𝑑𝑧𝑧
>> syms x y a b c d real>> f = x^3 + x + y;>> int(int(f,y,c,d),x,a,b)
ans =
((a - b)*(c - d)*(a^3 + a^2*b + a*b^2 + 2*a + b^3 + 2*b + 2*c + 2*d))/4
>> syms r theta z h a real>> V = int(int(int(r,r,0,a),theta,0,2*pi),z,0,h)
V =pi*a^2*h
35
MATLAB Programming
다항식 표현 바꾸기
다항식 인수 분해 (factor 함수)
다항식 전개 (expand 함수)
>> syms x y>> f = x^3 - 6*x^2 + 11*x - 6;>> factor(f)
ans =
(x - 3)*(x - 1)*(x - 2)
>> expand(ans)
ans =x^3 - 6*x^2 + 11*x – 6
>> expand(cos(x+y))
ans = cos(x)*cos(y) - sin(x)*sin(y)
36
MATLAB Programming
다항식 표현 바꾸기
다항식 수식 단순화 (simplify 함수)
>> syms x c alpha beta>> simplify(sin(x)^2 + cos(x)^2)
ans =1
>> simplify(exp(c*log(sqrt(alpha+beta))))
ans =(alpha + beta)^(c/2)
37
MATLAB Programming
다항식 표현 바꾸기
다항식 수식에서 공통 항 모으기 (collect 함수)
collect(S, v) : 함수 S를 v의 polynomial로 해서 공통 항 모으기
>> syms x y>> collect(x^2*y + y*x - x^2 - 2*x)
ans =
(y - 1)*x^2 + (y - 2)*x
>> syms x>> f = -1/4*x*exp(-2*x)+3/16*exp(-2*x)f =(3*exp(-2*x))/16 - (x*exp(-2*x))/4
>> collect(f, exp(-2*x))ans =(3/16 - x/4)*exp(-2*x)
38
MATLAB Programming
다항식 표현 바꾸기
함수를 분수식으로 표현 (pretty 함수)
>> 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 =
(2^(1/2)*(log(2^(1/2)*tan(x)^(1/2) - tan(x) - 1) - log(tan(x) + 2^(1/2)*tan(x)^(1/2) + 1)))/4 + (2^(1/2)*(atan(2^(1/2)*tan(x)^(1/2) - 1) + atan(2^(1/2)*tan(x)^(1/2) + 1)))/2
>> 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
39
MATLAB Programming
심볼에 값 대입하기
subs 함수• symbolic substitution을 수행
subs(S)• 심볼릭 표현 S의 모든 변수들을 MATLAB workspace 상에 정의 된 변수들의 값으로 대체
subs(S, NEW)• 심볼릭 표현 S의 자유변수(free variable)이 NEW로 대체
subs(S, OLD, NEW)• 심볼릭 표현 S에서 심볼 OLD를 심볼 NEW로 대체• OLD와 NEW는 동일한 사이즈의 벡터 또는 셀 배열로, OLD의 각 원소가 NEW의 각
원소로 1:1로 대체됨
40
MATLAB Programming
심볼에 값 대입하기
subs( S )• 아래와 같이 심볼릭 표현이 정의되었다고 할 때,
• a, C1에 값을 대입
• workspace 상에 저장된 값 a, C1을 심볼릭 표현에 반영
>> syms a t y C1>> y = exp(-a*t)*C1
y =C1*exp(-a*t)
>> a = 980; C1= 3;>> y
y =C1*exp(-a*t)
>> y = subs(y)
y =3*exp(-980*t)
41
MATLAB Programming
심볼에 값 대입하기
subs( S, NEW )
subs( S, OLD, NEW )>> syms a b omega>> f = sin(t)
f =sin(t)
>> f = subs(f, t, omega*t)
f = sin(omega*t)
>> 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)
42
MATLAB Programming
심볼에 값 여러 개 동시에 대입하기
배열 substitution
행렬 값을 substitution
스칼라 substitution
>> syms a b alpha>> subs(cos(a)+sin(b),{a,b},[alpha,2])
ans =
sin(2) + cos(alpha)
>> syms a t>> subs(exp(a*t), a,-magic(2))
ans =
[ exp(-t), exp(-3*t)][ exp(-4*t), exp(-2*t)]
>> syms x y>> subs(x*y,{x,y},{[0 1;-1 0],[1 -1;-2 1]})
ans =
[ 0, -1][ 2, 0]
43
MATLAB Programming
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) 를 계산
44
MATLAB Programming
Symbolic Summation
급수의 합 계산 예제
>> syms k n>> symsum(k)
ans =k^2/2 - k/2
>> symsum(k,0,n-1)
ans =(n*(n - 1))/2
>> symsum(k,0,n)
ans =(n*(n + 1))/2
>> simplify(symsum(k^2,0,n))
ans =(n*(2*n + 1)*(n + 1))/6
>> symsum(k^2,0,10)
ans =385
>> symsum(k^2,11,10)
ans =0
>> symsum(1/k^2)
ans =-psi(1, k)
>> symsum(1/k^2,1,Inf)
ans =pi^2/6
45
MATLAB Programming
Symbolic Production
급수의 곱을 계산
>> syms i k n>> symprod(k)
ans =
factorial(k)
>> symprod(k,1,n)
ans =
factorial(n)
>> symprod('1/k*i',i,1,n)
ans =
(k*factorial(n))/k^(n + 1)
>> symprod(1/k*i,i,1,n)
ans =
(k*factorial(n))/k^(n + 1)
>> symprod(i^2/(i^2 - 1), i, 2, Inf)
ans =
2
46
MATLAB Programming
Quiz
𝟏𝟏 + 𝝏𝝏 + 𝝏𝝏𝟐𝟐 + ⋯ 의 합을 계산해 봅시다.
47