lec 08. symbolic math toolbox i

55
MATLAB Programming Symbolic Math Toolbox I 김탁은 [email protected] 1

Upload: tak-eun-kim

Post on 15-Jun-2015

872 views

Category:

Education


29 download

TRANSCRIPT

MATLAB Programming

Symbolic Math Toolbox I

김 탁 은[email protected]

1

MATLAB Programming

Symbolic Math Toolbox

지금까지 우리가 해온 계산 방법

• 변수에 숫자가 대입되어 있을 때, 변수들을 사칙 연산을 통해 계산하여 수치 값을 얻음

y = x + x의 결과로 y = 2*x 라는 결과를 얻을 순 없을까?

Symbolic Math Toolbox를 이용하면 가능하다!• Symbolic Expression을 계산하기 위한 툴박스

>> x = 1;>> y = x + x

y =

2

2

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

3

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

4

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 응용수학에필요한각종특수함수계산

5

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

6

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]

7

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 8

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의각원소가복소수가아니게설정

9

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] 10

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𝑎𝑎𝑑𝑑 − 𝑏𝑏𝑐𝑐

𝑑𝑑 −𝑏𝑏−𝑐𝑐 𝑎𝑎

11

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

12

MATLAB Programming

함수 형태로 정의하기

정의

값 대입

>> 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)

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

MATLAB Programming

함수 형태로 정의한 수식 그래프 그리기

>> 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)

g(x, y) =

cos(x)*cos(y) + sin(x)*sin(y)

>> ezplot( f )또는>> t = linspace(-2*pi, 2*pi, 50);>> plot( t, f(t) )

>> ezsurf(g)또는>> t = linspace(-2*pi,2*pi,50)>> [X,Y] = meshgrid( t );>> Z = double( g(X,Y) );>> surf(X,Y,Z)

14

MATLAB Programming

sym 함수로 Expression 정의하기

y = sym(‘5*x^2 – 3’)

>> y = sym('5*x^2+3')

y =

5*x^2 + 3

>> ezplot(y)

15

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

16

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)

17

MATLAB Programming

Symbolic Math 함수들에 대한 정보 얻기

예를 들어, diff 라는 symbolic math 함수에 대한 정보를 얻고 싶을 때• >> help diff 로 나오는 결과는 symbolic math 함수 diff에 대한 정보가 아님

– help 페이지에서는 여러 다른 toolbox에서 정의된 동일한 이름의 함수들을친절하게 알려줌

– 예) Overloaded methods: sym/diff

• >> help sym/diff 수행시 나오는 결과가 찾고자 하는 정보

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)

또는

19

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’로미분계산

20

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차도함수

21

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)]

22

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)

𝝏𝝏𝝏𝝏𝝏𝝏𝝏𝝏

23

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;

24

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𝑥𝑥→∞

𝑒𝑒−𝑥𝑥

25

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)

26

MATLAB Programming

Quiz

다음 수식들의 극한값을 limit 함수를 이용하여 계산해보자.

• 𝑓𝑓 𝑥𝑥 = lim𝑛𝑛→∞

1 + 𝑥𝑥𝑛𝑛

𝑛𝑛

• 𝑓𝑓 𝑥𝑥 = lim𝑥𝑥→0−

1𝑥𝑥

• 𝑓𝑓 𝑥𝑥 = lim𝑥𝑥→∞

4𝑥𝑥2−3𝑥𝑥+13𝑥𝑥2+2𝑥𝑥−5

• 𝑓𝑓 𝑥𝑥 = lim𝑥𝑥→0

𝑒𝑒𝑥𝑥−1sin 𝑥𝑥

27

MATLAB Programming

Quiz Sol.

다음 수식들의 극한값을 limit 함수를 이용하여 계산해보자.

• 𝑓𝑓 𝑥𝑥 = lim𝑛𝑛→∞

1 + 𝑥𝑥𝑛𝑛

𝑛𝑛

• 𝑓𝑓 𝑥𝑥 = lim𝑥𝑥→0−

1𝑥𝑥

• 𝑓𝑓 𝑥𝑥 = lim𝑥𝑥→∞

4𝑥𝑥2−3𝑥𝑥+13𝑥𝑥2+2𝑥𝑥−5

• 𝑓𝑓 𝑥𝑥 = lim𝑥𝑥→0

𝑒𝑒𝑥𝑥−1sin 𝑥𝑥

>> 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

MATLAB Programming

Quiz

미분은 다음과 같이 극한으로 정의된다.

• 𝑓𝑓 𝑥𝑥 = limℎ→0

𝑓𝑓 𝑥𝑥+ℎ −𝑓𝑓(𝑥𝑥)ℎ

𝝏𝝏 𝝏𝝏 = 𝒄𝒄𝒄𝒄𝒄𝒄 𝝏𝝏 함수의 미분값이 diff 함수를 써서 얻었을 때와, 위의 극한

값을 계산해서 얻어낸 결과가 동일한지 비교해보자.

29

MATLAB Programming

Quiz Sol.

미분은 다음과 같이 극한으로 정의된다.

• 𝑓𝑓 𝑥𝑥 = limℎ→0

𝑓𝑓 𝑥𝑥+ℎ −𝑓𝑓(𝑥𝑥)ℎ

𝝏𝝏 𝝏𝝏 = 𝒄𝒄𝒄𝒄𝒄𝒄 𝝏𝝏 함수의 미분값이 diff 함수를 써서 얻었을 때와, 위의 극한

값을 계산해서 얻어낸 결과가 동일한지 비교해보자.

>> syms x>> diff(cos(x))

ans =

-sin(x)

>> syms x h>> limit( (cos(x+h) - cos(x))/h, h, 0 )

ans =

-sin(x)

30

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는출력하지않음!!31

MATLAB Programming

Quiz

다음 수식들의 적분값을 int 함수를 이용하여 계산해보자.

• 𝑓𝑓 𝑥𝑥 = 𝑒𝑒−(𝑘𝑘𝑥𝑥)2 , −∞ ≤ 𝑥𝑥 ≤ ∞

• 𝑓𝑓 𝑥𝑥 = 𝑥𝑥 sin 𝑥𝑥

• 𝑓𝑓 𝑥𝑥 = 𝑥𝑥3 − 2𝑥𝑥2 + 𝑥𝑥 − 1, 0 ≤ 𝑥𝑥 ≤ 2

• 𝑓𝑓 𝑥𝑥 = tan−1 𝑥𝑥𝑥𝑥 ⁄3 2 , 0 ≤ 𝑥𝑥 ≤ 1

• 𝑓𝑓 𝑥𝑥 = 𝑥𝑥3 − 𝑒𝑒𝑥𝑥 sin 𝑥𝑥, 0 ≤ 𝑥𝑥 ≤ 𝜋𝜋

32

MATLAB Programming

Quiz Sol.

다음 수식들의 적분값을 int 함수를 이용하여 계산해보자.

• 𝑓𝑓 𝑥𝑥 = 𝑒𝑒−𝑥𝑥2 , −∞ ≤ 𝑥𝑥 ≤ ∞

• 𝑓𝑓 𝑥𝑥 = 𝑥𝑥 sin 𝑥𝑥

• 𝑓𝑓 𝑥𝑥 = 𝑥𝑥3 − 2𝑥𝑥2 + 𝑥𝑥 − 1, 0 ≤ 𝑥𝑥 ≤2

• 𝑓𝑓 𝑥𝑥 = tan−1 𝑥𝑥𝑥𝑥 ⁄3 2 , 0 ≤ 𝑥𝑥 ≤ 1

• 𝑓𝑓 𝑥𝑥 = 𝑥𝑥3 − 𝑒𝑒𝑥𝑥 sin 𝑥𝑥, 0 ≤ 𝑥𝑥 ≤ 𝜋𝜋

>> 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

MATLAB Programming

적분의 응용

34

MATLAB Programming

수치 적분

정적분의 결과가 해석적 (analytic) 하지 않는 경우 사용

정적분 ∫𝒂𝒂𝒃𝒃 𝝏𝝏 𝝏𝝏 𝒅𝒅𝝏𝝏의 근사를 계산하는 적분 방법

• trapz 함수

– trapezoidal method 사용

• quad 함수

– Simpson quadrature rule 사용

• quadl 함수

– Lobatto quadrature rule 사용

35

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

36

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;

37

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

38

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

39

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

40

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)

41

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)

42

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)

43

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

44

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로 대체됨

45

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)

46

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)

47

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]

48

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) 를 계산

49

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

50

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

51

MATLAB Programming

Quiz

𝟏𝟏 + 𝝏𝝏 + 𝝏𝝏𝟐𝟐 + ⋯ 의 합을 계산해 보자.

52

MATLAB Programming

Quiz Sol.

𝟏𝟏 + 𝝏𝝏 + 𝝏𝝏𝟐𝟐 + ⋯ 의 합을 계산해 보자.

>> syms x k real>> f = symsum(x^k, k, 0, inf)

f =

piecewise([1 <= x, Inf], [x in Dom::Interval(-1, 1), -1/(x - 1)])

발산 수렴

53

MATLAB Programming

Quiz

𝑓𝑓 𝑥𝑥 = (−1)𝑛𝑛의 fourier series는 아래와 같이 구할 수 있다.

• 𝑓𝑓 𝑥𝑥 = 4𝜋𝜋

(sin𝜋𝜋𝑥𝑥 + 13

sin 3𝜋𝜋𝑥𝑥 + 15

sin 5𝜋𝜋𝑥𝑥 + ⋯ )

symsum 함수를 이용하여 위의 fourier series를 표현하고, Fourier

Series에서 10개, 20개, 30개에 대한 sine term까지의 합에 대한

그래프를 그려보자.

힌트

• >> syms f(x, n)

54

MATLAB Programming

Quiz Sol.

𝑓𝑓 𝑥𝑥 = (−1)𝑛𝑛의 fourier series는 아래와 같이 구할 수 있다.

• 𝑓𝑓 𝑥𝑥 = 4𝜋𝜋

(sin𝜋𝜋𝑥𝑥 + 13

sin 3𝜋𝜋𝑥𝑥 + 15

sin 5𝜋𝜋𝑥𝑥 + ⋯ )

symsum 함수를 이용하여 위의 fourier series를 표현하고, Fourier Series에서

10개, 20개, 30개에 대한 sine term까지의 합에 대한 그래프를 그려보자.

>> syms f(x, n)>> syms k>> f(x,n) = 4/pi * symsum(sin(pi*(2*k+1)*x)/(2*k+1), k, 0, n)

f(x, n) =

(5734161139222659*sum(sin(pi*x*(2*k + 1))/(2*k + 1), k == 0..n))/4503599627370496

>> ezplot(f(x,10), [0 pi])>> ezplot(f(x,20), [0 pi])>> ezplot(f(x,30), [0 pi])

55