matlab for c/c++ programmers - kaist it academy web … · 2014-01-14 · matlab programming...

47
MATLAB Programming 오늘 강의 내용 (2014/01/14) Symbolic Math Toolbox 숫자로 주어진 변수이 아니라 변수 심볼에 대한 수식 연산 (, symbolic expression 계산) 미분, 극한, 적분, 변환의 symbolic expression 계산 1

Upload: duongdiep

Post on 01-Apr-2019

253 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

MATLAB Programming

오늘 강의 내용 (2014/01/14)

Symbolic Math Toolbox• 숫자로 주어진 변수”값”이 아니라 변수 심볼에 대한 수식 연산• (즉, symbolic expression 계산)

• 미분, 극한, 적분, 변환의 symbolic expression 계산

1

Page 2: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

MATLAB Programming

Symbolic Expression

김 탁 은[email protected]

2

Page 3: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

MATLAB Programming

Symbolic Math Toolbox

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

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

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

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

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

y =

2

3

Page 4: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 5: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 6: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 7: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 8: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 9: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 10: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 11: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 12: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 13: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 14: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

MATLAB Programming

sym 함수로 Expression 정의하기

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

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

y =

5*x^2 + 3

>> ezplot(y)

14

Page 15: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 16: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 17: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

MATLAB Programming

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

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

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

– 예) Overloaded methods: sym/diff

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

17

Page 18: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 19: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 20: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 21: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 22: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 23: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 24: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 25: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 26: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

MATLAB Programming

Quiz

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

• 𝑓𝑓 𝑥𝑥 = lim𝑛𝑛→∞

1 + 𝑥𝑥𝑛𝑛

𝑛𝑛

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

1𝑥𝑥

• 𝑓𝑓 𝑥𝑥 = lim𝑥𝑥→∞

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

• 𝑓𝑓 𝑥𝑥 = lim𝑥𝑥→0

𝑒𝑒𝑥𝑥−1sin 𝑥𝑥

26

Page 27: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

MATLAB Programming

Quiz

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

• 𝑓𝑓 𝑥𝑥 = limℎ→0

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

𝝏𝝏 𝝏𝝏 = 𝒄𝒄𝒄𝒄𝒄𝒄 𝝏𝝏 함수의 미분값이 diff 함수를 써서 얻었을 때와, 위의 극한값을 계산해서 얻어낸 결과가 동일한지 비교해봅시다.

27

Page 28: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 29: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

MATLAB Programming

Quiz

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

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

• 𝑓𝑓 𝑥𝑥 = 𝑥𝑥 sin 𝑥𝑥

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

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

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

29

Page 30: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

MATLAB Programming

수치 적분

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

• trapz 함수– trapezoidal method 사용

• quad 함수– Simpson quadrature rule 사용

• quadl 함수– Lobatto quadrature rule 사용

30

Page 31: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 32: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 33: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 34: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 35: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 36: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 37: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 38: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 39: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 40: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 41: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 42: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 43: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 44: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 45: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 46: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

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

Page 47: MATLAB for C/C++ Programmers - KAIST IT Academy Web … · 2014-01-14 · MATLAB Programming 간단한. Symbolic Expression 연산 Symbolic Expression 연산에사용할심볼을정의해야함

MATLAB Programming

Quiz

𝟏𝟏 + 𝝏𝝏 + 𝝏𝝏𝟐𝟐 + ⋯ 의 합을 계산해 봅시다.

47