Download as pdf or txt
Download as pdf or txt
You are on page 1of 55

Symbolic Expression

김탁은
kmste2@kaist.ac.kr

1
Symbolic Math Toolbox
 지금까지 우리가 해온 계산 방법

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

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

y=

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

 Symbolic Math Toolbox를 이용하면 가능하다!


• Symbolic Expression을 계산하기 위한 툴박스

2
간단한 Symbolic Expression 연산
 Symbolic Expression 연산에 사용할 심볼을 정의해야 함

• syms 키워드를 사용하여 x, y, z을 symbolic 형의 데이터 타입으로 선언


>> syms x y z

• Symbolic Expression을 적으면, 해당 연산이 수행되어 계산 결과가


symbol들의 표현으로 나타남

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

 사전에 정의한 Symbol 형 변수에 수치값을 대입하면, 해당 변수는 수치값의


데이터 타입으로 변경됨

>> syms x
>> class(x)
ans =
sym

>> x = single(10.3125);
>> class(x)
ans =
single

4
Symbolic Toolbox의 기능

기능 분야

Calculus 미분, 적분, 극한, 급수, …

Linear Algebra 역행렬, 고유치, determinant, canonical forms, …

Simplification 인수분해, 전개, 분수 표현, …

Equation Solving 미분방정식, 다항식 해 계산, …

Variable-Precision Arithmetics 주어진 정밀도에 근거하여 수식 계산

Transformation Fourier Transform, Laplace Transform, Z-transform, …

Special Functions 응용 수학에 필요한 각종 특수 함수 계산

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 =

>> e = sym(1/3, 'e') A_2_2


e = 1/3 - eps/12 8
행렬 연산
 두 행렬의 사칙연산의 결과로, 각 행렬 원소 명들간의 연산 결과가 결과로 나옴

 예제
• 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_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_2_1 - B_2_1, A_2_2 - B_2_2, A_2_3 - B_2_3]

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 =

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

• 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

 심볼릭 변수의 속성을 real로 설정하지 않으면, 의도한 복소수를 얻을 수 없음

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

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
함수 형태로 정의한 수식 그래프 그리기

>> syms f(t)


>> syms g(x,y)
>> f(t) = 1/2*9.8*t^2 >> ezplot( f )
또는
>> t = linspace(-2*pi, 2*pi, 50);
f(t) =
>> plot( t, 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)

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

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

18
Symbolic Math로 미분 계산하기
 함수 f(x)를 미분하려면

• 1. 함수에 쓰인 변수들을 symbolic 데이터 타입으로 변경


>> syms x n

• 2. 앞서 정의한 심볼 변수로 함수를 정의


>> f = x^n

• 3. sym/diff 함수를 이용해 함수 f(x)를 미분


>> df = diff( f ) >> df = diff( f, x )

df = 또는 df =

n*x^(n - 1) n*x^(n - 1)

19
Symbolic Math로 미분 계산하기
 함수 f(x)를 미분하려면

• 1. 함수에 쓰인 변수들을 symbolic 데이터 타입으로 변경


>> syms x n
x로 미분해야 한다는 것을 어떻게 알았을까?

• symbolic toolbox는 변수명이 문자 ‘x’에 알파벳


• 2. 앞서 정의한 심볼 변수로 함수를 정의 순으로 가장 변수로 미분 수행
• 따라서, ‘x’와 가장 가까운 변수 ‘x’로 미분 계산
>> f = x^n

• 3. sym/diff 함수를 이용해 함수 f(x)를 미분


>> df = diff( f ) >> df = diff( 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 =

[ 2*a*x, exp(-a*x) - a*x*exp(-a*x)]


[ -a*sin(a*x), -a*cos(b + a*x)]

22
편미분
 n개의 독립 변수들로 구성된 함수의 경우, 변수를 명시적으로 지정하면
해당 변수로 편미분 수행

>> syms x y >> fxy1 = diff(fx, y)


>> f = x^2*exp(-y^2)-y/x;
>> fx = diff(f, x) fxy1 =

fx = 1/x^2 - 4*x*y*exp(-y^2)

2*x*exp(-y^2) + y/x^2 >> fxy2 = diff(fy, x)

>> fy = diff(f, y) fxy2 =

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

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
>> syms x a t h;

함수의 극한 >> limit(sin(x)/x)


ans =
1

 limit( F, x, a ) >> limit((x-2)/(x^2-4),2)


ans =
• 함수 F에서 x  a 일 때 극한값 1/4
 limit( F )
• 함수 F가 a  0 일 때 극한값 >> limit((1+2*t/x)^(3*x),x,inf)
ans =
 limit( F, x, a, ‘right’ ) exp(6*t)
• 함수 F가 x  a 일 때의 우극한값
>> limit(1/x,x,0,'right')
 limit( F, x, a, ‘left’ ) ans =
• 함수 F가 x  a 일 때의 좌극한값 Inf

>> 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 수치 계산을 통한 극한 값 비교

% MATLAB 수치 계산 % Symbolic Math Toolbox

>> n = realmax >> syms n


>> f = n*(2^(1/n)-1);
n= >> limit(f, inf)
1.7977e+308
ans =
>> x = n*(2^(1/n)-1)
log(2)
x=

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.

>> syms x >> syms x h


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

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)

수식 MATLAB 수식 >> A = [cos(x*t),sin(x*t);-sin(x*t),cos(x*t)];


>> int(A,t)
int( f )
int( f, x ) ans =
[ sin(t*x)/x, -cos(t*x)/x]
[ cos(t*x)/x, sin(t*x)/x]
int( f, t )
>> int([exp(t),exp(alpha*t)])

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

>> quad( @(x) x.*log(x), 2, 4 )

 ans =
6.7041

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

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
다중 적분

>> 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
다중 적분의 수치 적분

>> 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)
>> f = @(x,y,z) (y+z).*sin(pi*(x.^2+y.^2));
ans = >> triplequad(f,0,1,0,1,0,1)

(fresnelC(2^(1/2))*(2^(1/2) + pi*fresnelS(2^(1/2))))/(2*pi) ans =

>> double(ans) 0.3078

ans =
0.3078 39
Symbolic 다중 적분

>> 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
다항식 표현 바꾸기
 다항식 인수 분해 (factor 함수)
>> syms x y
>> f = x^3 - 6*x^2 + 11*x - 6;
>> factor(f)

ans =

(x - 3)*(x - 1)*(x - 2)

 다항식 전개 (expand 함수)


>> 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
다항식 표현 바꾸기
 다항식 수식 단순화 (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
다항식 표현 바꾸기
 다항식 수식에서 공통 항 모으기 (collect 함수)
>> syms x y
>> collect(x^2*y + y*x - x^2 - 2*x)

ans =

(y - 1)*x^2 + (y - 2)*x

 collect(S, v) : 함수 S를 v의 polynomial로 해서 공통 항 모으기


>> 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
다항식 표현 바꾸기
 함수를 분수식으로 표현 (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
심볼에 값 대입하기
 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
심볼에 값 대입하기
 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)

• workspace 상에 저장된 값 a, C1을 심볼릭 표현에 반영


>> y = subs(y)

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)

 subs( S, OLD, NEW )


>> syms a b omega
>> f = sin(t)

f=
sin(t)

>> f = subs(f, t, omega*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)

 행렬 값을 substitution >> syms a t


>> subs(exp(a*t), a,-magic(2))

ans =

[ exp(-t), exp(-3*t)]
[ exp(-4*t), exp(-2*t)]

 스칼라 substitution >> syms x y


>> subs(x*y,{x,y},{[0 1;-1 0],[1 -1;-2 1]})

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

>> symsum(k,0,n-1) >> symsum(k^2,11,10)

ans = ans =
(n*(n - 1))/2 0

>> symsum(k,0,n) >> symsum(1/k^2)

ans = ans =
(n*(n + 1))/2 -psi(1, k)

>> simplify(symsum(k^2,0,n)) >> symsum(1/k^2,1,Inf)

ans = ans =
(n*(2*n + 1)*(n + 1))/6 pi^2/6

50
Symbolic Production
 급수의 곱을 계산

>> syms i k n >> symprod('1/k*i',i,1,n)


>> symprod(k)
ans =
ans =
(k*factorial(n))/k^(n + 1)
factorial(k)
>> symprod(1/k*i,i,1,n)
>> symprod(k,1,n)
ans =
ans =
(k*factorial(n))/k^(n + 1)
factorial(n)
>> symprod(i^2/(i^2 - 1), i, 2, Inf)

ans =

51
Quiz

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

54
Quiz Sol.

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

You might also like