Main Content

수치 연산방식 또는 기호 연산방식 선택하기

Symbolic Math Toolbox™는 수치 연산방식 또는 기호 연산방식을 사용하여 숫자에 대해 연산을 수행합니다. 수치 연산방식에서는 배정밀도 또는 가변 정밀도를 사용하여 부동소수점 형식으로 숫자를 표현합니다. 기호 연산방식에서는 숫자를 각각에 맞게 정확한 형식으로 표현합니다. 이 항목에서는 배정밀도 연산방식, 가변 정밀도 연산방식 및 기호 연산방식을 비교합니다.

배정밀도 연산방식

MATLAB®에서 수치 계산은 기본적으로 배정밀도 연산방식을 사용합니다. 예를 들어, 표현식 10001/1001, π2를 계산해 보겠습니다. 결과는 배정밀도 값으로 변환됩니다.

x = 10001/1001
y = pi
z = sqrt(2)
x =
    9.9910

y =
    3.1416

z =
    1.4142

배정밀도 연산방식에 대한 자세한 내용은 부동소수점 숫자(Floating-Point Number) 항목을 참조하십시오. 이 연산방식은 Symbolic Math Toolbox가 없거나 기호 입력값을 허용하지 않는 함수를 사용하는 경우 권장됩니다. 그렇지 않은 경우 정확한 기호 연산방식 및 가변 정밀도 연산방식이 권장됩니다. 기호 값을 배정밀도 값으로 변환하려면 double 함수를 사용하십시오.

가변 정밀도 연산방식

vpa를 사용한 가변 정밀도 연산방식은 Symbolic Math Toolbox의 수치 계산에 대해 권장되는 방식입니다. 가변 정밀도 연산방식으로 계산을 수행하는 경우 유효 자릿수를 지정할 수 있습니다.

예를 들어, vpa를 사용하여 분수 10001/1001을 계산해 보겠습니다. 기본적으로 vpa는 32자리의 유효 자릿수로 입력값을 계산합니다. 최소 32자리의 유효 자릿수로 분수 10001/1001의 근삿값을 계산합니다.

vpa(10001/1001)
ans =
9.991008991008991008991008991009

최소 8자리의 유효 자릿수로 분수의 근삿값을 계산해 보겠습니다. digits 함수를 사용하여 유효 자릿수를 변경합니다.

digits(8);
vpa(10001/1001)
ans =
9.991009

가변 정밀도 연산방식에서 정밀도를 높이기 위해 유효 자릿수를 늘릴 수 있습니다. 또는 계산 속도를 높이고 메모리 사용을 줄이기 위해 유효 자릿수를 줄일 수 있습니다.

기호 연산방식

Symbolic Math Toolbox는 정확한 기호 계산을 수행하기 위한 sym 함수와 syms 함수를 제공합니다. 기호 연산방식에서는 x/2, 2^(1/2) 또는 pi와 같은 정확한 형식의 숫자와 변수를 포함하는 계산을 수행할 수 있습니다. 다음 세 가지 예제는 기호 연산방식으로 수행되는 여러 계산을 보여줍니다.

무리수 표현하기

sym을 사용하여 기호 숫자를 만듭니다. 무리수 π2를 기호 형식으로 표현합니다.

x = sym(pi)
y = sqrt(sym(2))
x =
pi
 
y =
2^(1/2)

큰 정수가 있는 계산 수행하기

숫자를 선언할 때 MATLAB은 자동으로 숫자를 배정밀도로 변환합니다. 예를 들어, sym의 입력 인수로 정수 80435758145817515를 선언해 보겠습니다. 이 숫자는 배정밀도에서 정밀도가 보장되는 최대 정수 flintmax(2^53)보다 크기 때문에 정확도를 잃게 됩니다.

Z = 80435758145817515
Zinaccurate = sym(80435758145817515)
Z =
   8.0436e+16

Zinaccurate =
80435758145817520
큰 정수를 기호 숫자로 정확하게 선언하려면 작은 따옴표로 묶인 문자형 벡터를 sym의 입력 인수로 사용합니다.

Zaccurate = sym('80435758145817515')
Zaccurate =
80435758145817515

그러면 기호 연산방식을 사용하여 큰 정수가 있는 계산을 정확하게 수행할 수 있습니다. 예를 들어, 큰 정수 3개의 세제곱의 합을 계산해 보겠습니다.

Z1 = sym('80435758145817515')
Z2 = sym('12602123297335631')
Z3 = sym('-80538738812075974')
Zsum = Z1^3 + Z2^3 + Z3^3
Z1 =
80435758145817515
 
Z2 =
12602123297335631
 
Z3 =
-80538738812075974
 
Zsum =
42

수학 방정식 풀기

기호 연산방식을 사용하여 수학 방정식을 풀 수 있습니다. 예를 들어, 2차 방정식 ax2 + bx + c = 0을 풀어 보겠습니다. syms를 사용하여 2차 방정식의 변수 x와 계수 a, b 및 c를 선언합니다.

syms a b c x
eqn = a*x^2 + b*x + c == 0;

solve를 사용하여 해를 구하고 기호 표현식으로 반환합니다.

sols = solve(eqn,x)
sols =
 -(b + (b^2 - 4*a*c)^(1/2))/(2*a)
 -(b - (b^2 - 4*a*c)^(1/2))/(2*a)

subs를 사용하여 계수에 기호 값을 대입합니다. a = 1, b = 2, c = 3을 설정합니다. 2차 방정식의 해를 기호 숫자로 반환합니다.

solsSym = subs(sols,[a b c],[1 2 3])
solsSym = 
 - (8^(1/2)*1i)/2 - 1
   (8^(1/2)*1i)/2 - 1

이제 기호 해를 배정밀도 또는 가변 정밀도의 부동소수점 형식으로 변환할 수 있습니다.

digits(32);
solsDouble = double(solsSym)
solsVpa = vpa(solsSym)
solsDouble =
  -1.0000 - 1.4142i
  -1.0000 + 1.4142i

solsVpa = 
 - 1.0 - 1.4142135623730950488016887242097i
 - 1.0 + 1.4142135623730950488016887242097i

수치 연산방식과 기호 연산방식의 비교

아래 표에서는 배정밀도 연산방식, 가변 정밀도 연산방식 및 기호 연산방식을 비교합니다.

 배정밀도가변 정밀도기호
예제 1: sin(π) 계산하기
a = pi
sin(pi)
a =
    3.1416
ans =
   1.2246e-16
b = vpa(pi)
sin(b)
b =
3.1415926535897932384626433832795
ans =
-3.2101083013100396069547145883568e-40
c = sym(pi)
sin(c)
c =
pi
ans =
0
예제 2: 1 - 3*(4/3 - 1) 계산하기
a = 4/3
1 - 3*(a - 1)
a =
    1.3333
ans =
   2.2204e-16
digits(16);
b = vpa(4/3)
1 - 3*(b - 1)
b =
1.333333333333333
ans =
3.308722450212111e-24
c = sym(4)/3
1 - 3*(c - 1)
c =
4/3
ans =
0
사용 함수doublevpa
digits
sym
데이터형doublesymsym
반올림 오차있음, 답이 16자리의 정밀도를 갖습니다.있음, 자릿수가 사용된 정밀도에 따라 달라집니다.없음, 결과가 정확합니다.
속도빠름빠름(사용된 정밀도에 따라 달라짐)가장 느림
메모리 사용가장 적음가변적(사용된 정밀도에 따라 달라짐)가장 많음

관련 항목