수치 연산방식 또는 기호 연산방식 선택하기
Symbolic Math Toolbox™는 수치 연산방식 또는 기호 연산방식을 사용하여 숫자에 대해 연산을 수행합니다. 수치 연산방식에서는 배정밀도 또는 가변 정밀도를 사용하여 부동소수점 형식으로 숫자를 표현합니다. 기호 연산방식에서는 숫자를 각각에 맞게 정확한 형식으로 표현합니다. 이 항목에서는 배정밀도 연산방식, 가변 정밀도 연산방식 및 기호 연산방식을 비교합니다.
배정밀도 연산방식
MATLAB®에서 수치 계산은 기본적으로 배정밀도 연산방식을 사용합니다. 예를 들어, 표현식 10001/1001, π 및 를 계산해 보겠습니다. 결과는 배정밀도 값으로 변환됩니다.
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
을 사용하여 기호 숫자를 만듭니다. 무리수 π와 를 기호 형식으로 표현합니다.
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 |
사용 함수 | double | vpa digits | sym |
데이터형 | double | sym | sym |
반올림 오차 | 있음, 답이 16자리의 정밀도를 갖습니다. | 있음, 자릿수가 사용된 정밀도에 따라 달라집니다. | 없음, 결과가 정확합니다. |
속도 | 빠름 | 빠름(사용된 정밀도에 따라 달라짐) | 가장 느림 |
메모리 사용 | 가장 적음 | 가변적(사용된 정밀도에 따라 달라짐) | 가장 많음 |