이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

vpa

가변 정밀도 연산방식(임의 정밀도 연산방식)

숫자를 정의하지 않은 문자형 벡터에 대한 지원이 제거되었습니다. 대신, symsyms를 사용하여 기호 숫자 및 기호 변수를 만든 다음 연산을 수행하십시오. 예를 들어, vpa('(1 + sqrt(5))/2') 대신 vpa((1 + sqrt(sym(5)))/2)를 사용하십시오.

설명

예제

vpa(x)는 VPA(가변 정밀도 부동소수점 연산방식)를 사용하여 기호 입력값 x의 각 요소를 최소 d자리의 유효 자릿수로 계산합니다. 여기서 ddigits 함수의 값입니다. digits의 디폴트 값은 32입니다.

예제

vpa(x,d)digits 값 대신 최소 d자리의 유효 자릿수를 사용합니다.

예제

가변 정밀도 연산방식을 사용하여 기호 입력값 계산하기

가변 정밀도 부동소수점 연산방식을 사용하여 기호 입력값을 계산합니다. 기본적으로 vpa는 32자리의 유효 자릿수로 값을 계산합니다.

syms x
p = sym(pi);
piVpa = vpa(p)
piVpa =
3.1415926535897932384626433832795
a = sym(1/3);
f = a*sin(2*p*x);
fVpa = vpa(f)
fVpa =
0.33333333333333333333333333333333*sin(6.283185307179586476925286766559*x)

가변 정밀도 연산방식으로 벡터 또는 행렬의 요소를 계산합니다.

V = [x/p a^3];
M = [sin(p) cos(p/5); exp(p*x) x/log(p)];
vpa(V)
vpa(M)
ans =
[ 0.31830988618379067153776752674503*x, 0.037037037037037037037037037037037]
ans =
[                                        0,   0.80901699437494742410229341718282]
[ exp(3.1415926535897932384626433832795*x), 0.87356852683023186835397746476334*x]

참고

exp(vpa(200))과 같이 모든 내부 입력값은 vpa로 감싸야 합니다. 그러지 않으면 입력값이 MATLAB®에 의해 자동으로 배정밀도로 변환됩니다.

vpa에서 사용하는 정밀도 변경하기

기본적으로 vpa는 32자리의 유효 자릿수로 입력값을 계산합니다. digits 함수를 사용하여 유효 자릿수를 변경할 수 있습니다.

digits를 사용하여 표현식 100001/10001을 7자리의 유효 자릿수로 근사합니다. digits(7)에서 반환된 digits의 이전 값을 저장합니다. vpa 함수는 5자리의 유효 자릿수만 반환합니다. 이는 나머지 숫자가 0이라는 것을 의미할 수 있습니다.

digitsOld = digits(7);
y = sym(100001)/10001;
vpa(y)
ans =
9.9991

더 높은 정밀도 값인 25를 사용하여 나머지 숫자가 0인지 확인합니다. 결과를 보면 나머지 숫자가 실제로 반복되는 숫자임을 알 수 있습니다.

digits(25)
vpa(y)
ans =
9.999100089991000899910009

또는 단일 vpa 호출에 대해 digits를 재정의하려면 두 번째 인수를 지정하여 정밀도를 변경하십시오.

두 번째 인수를 지정하여 π를 100자리의 유효 자릿수로 구합니다.

vpa(pi,100)
ans =
3.141592653589793238462643383279502884197169...
39937510582097494459230781640628620899862803...
4825342117068

추후 계산을 위해 digitsOld에서 원래 정밀도 값을 복원합니다.

digits(digitsOld)

기호 결과를 수치적으로 근사하기

기호 결과는 정확하지만 사용하기에 편리한 형식이 아닐 수 있습니다. vpa를 사용하여 정확한 기호 결과를 수치적으로 근사할 수 있습니다.

solve를 사용하여 높은 차수 다항식의 근을 구합니다. solve 함수는 높은 차수 다항식을 기호적으로 풀 수 없으며 root를 사용하여 근을 나타냅니다.

syms x
y = solve(x^4 - x + 1, x)
y =
 root(z^4 - z + 1, z, 1)
 root(z^4 - z + 1, z, 2)
 root(z^4 - z + 1, z, 3)
 root(z^4 - z + 1, z, 4)

vpa를 사용하여 근에 대한 수치적 근삿값을 구합니다.

yVpa = vpa(y)
yVpa =
   0.72713608449119683997667565867496 - 0.43001428832971577641651985839602i
   0.72713608449119683997667565867496 + 0.43001428832971577641651985839602i
 - 0.72713608449119683997667565867496 - 0.93409928946052943963903028710582i
 - 0.72713608449119683997667565867496 + 0.93409928946052943963903028710582i

vpa에서 보호 자릿수를 사용하여 정밀도 유지하기

digits 함수의 값은 사용되는 최소 유효 자릿수를 지정합니다. 내부적으로 vpadigits에 지정한 것보다 더 많은 자릿수를 사용할 수 있습니다. 이러한 추가 자릿수는 이후 계산의 반올림 오차를 방지하므로 이러한 자릿수를 보호 자릿수라고 합니다.

4개의 유효 자릿수를 사용하여 1/3을 수치적으로 근사합니다.

a = vpa(1/3, 4)
a =
0.3333

20자리를 사용하여 결과 a를 근사합니다. 결과를 보면 이 툴박스에서 a를 계산할 때 내부적으로 4자리 이상을 사용했다는 것을 알 수 있습니다. 반올림 오차로 다음 결과의 마지막 자릿수가 잘못 표시됩니다.

vpa(a, 20)
ans =
0.33333333333303016843

숨겨진 반올림 오차 방지하기

숨겨진 반올림 오차는 예상치 못한 결과를 초래할 수 있습니다.

1/10을 디폴트 32자리의 정밀도로 계산한 다음 10자리 정밀도로 계산합니다.

a = vpa(1/10, 32)
b = vpa(1/10, 10)
a =
0.1
 
b =
0.1

얼핏 보면 ab가 동일하게 보입니다. a - b를 구하여 두 값이 동일한지 확인합니다.

a - b
ans =
0.000000000000000000086736173798840354720600815844403

차분은 0이 아닙니다. b10자리의 정밀도로 계산되었기 때문에 a보다 반올림 오차가 큽니다. a - b를 구하면 vpab를 32자리로 근사합니다. 다음 결과를 참조하십시오.

a - vpa(b, 32)
ans =
0.000000000000000000086736173798840354720600815844403

vpa를 사용하여 일반 배정밀도 입력값의 정밀도 복원하기

정확한 기호 값과 달리 배정밀도 값은 본질적으로 반올림 오차를 포함합니다. 배정밀도 입력값에 대해 vpa를 호출하면 배정밀도 값보다 많은 자릿수가 반환되지만 손실된 정밀도를 vpa가 복원할 수는 없습니다. 그러나 vpap/q, pπ/q, (p/q)1/2, 2q10q 형식으로 된 표현식의 정밀도를 인식 및 복원할 수 있습니다. 여기서 p와 q는 적당한 크기의 정수입니다.

먼저, vpa가 배정밀도 입력값의 정밀도를 복원할 수 없음을 보여줍니다. 배정밀도 결과에 대해 그리고 동일한 기호 결과에 대해 vpa를 호출합니다.

dp = log(3);
s = log(sym(3));
dpVpa = vpa(dp)
sVpa = vpa(s)
d = sVpa - dpVpa
dpVpa =
1.0986122886681095600636126619065

sVpa =
1.0986122886681096913952452369225

d =
0.00000000000000013133163257501600766255995767652

예상대로 배정밀도 결과는 소수점 이하 16자리에서 정확한 결과와 다릅니다.

vpap/q, pπ/q, (p/q)1/2, 2q10q 형식의 표현식에 대한 정밀도를 복원합니다. 여기서 p와 q는 적당한 크기의 정수입니다. 배정밀도 결과와 정확한 기호 결과에 대해 vpa를 호출하여 차분을 구합니다. 차분은 0.0이며 이는 vpa가 배정밀도 입력값에서 손실된 정밀도를 복원한다는 것을 보여줍니다.

vpa(1/3) - vpa(1/sym(3))
vpa(pi) - vpa(sym(pi))
vpa(1/sqrt(2)) - vpa(1/sqrt(sym(2)))
vpa(2^66) - vpa(2^sym(66))
vpa(10^25) - vpa(10^sym(25))
ans =
0.0

ans =
0.0

ans =
0.0

ans =
0.0

ans =
0.0

입력 인수

모두 축소

계산할 입력값으로, 숫자, 벡터, 행렬, 다차원 배열 또는 기호 숫자, 기호 벡터, 기호 행렬, 기호 다차원 배열, 기호 표현식, 기호 함수 또는 기호 문자형 벡터로 지정됩니다.

유효 자릿수로, 정수로 지정됩니다. d는 1보다 크고 229+1보다 작아야 합니다.

  • vpa는 지수에 있는 분수를 부동소수점으로 변환하지 않습니다. 예를 들어, vpa(a^sym(2/5))a^(2/5)을 반환합니다.

  • vpadigits에 지정한 자릿수보다 많은 자릿수를 사용합니다. 이러한 추가 자릿수는 이후 계산에서 반올림 오차를 방지하므로 보호 자릿수라고 합니다.

  • 1/3, 2^(-5) 또는 sin(pi/4)와 같은 숫자형 입력값에 대해 vpa를 호출하면 숫자 표현식이 반올림 오차를 포함하는 배정밀도 숫자로 계산됩니다. 그리고, vpa는 그 배정밀도 숫자에 대해 호출됩니다. 정확한 결과를 얻으려면 sym을 사용하여 숫자 표현식을 기호 표현식으로 변환하십시오. 예를 들어, exp(1)을 근사하려면 vpa(exp(sym(1)))을 사용하십시오.

  • 두 번째 인수 d가 정수가 아닌 경우 vparound를 사용하여 이 값을 가장 가까운 정수로 반올림합니다.

  • vpap/q, pπ/q, (p/q)1/2, 2q10q 형식과 일치하는 숫자형 입력값에 대해서는 정밀도를 복원합니다. 여기서 p와 q는 적당한 크기의 정수입니다.

  • 가변 정밀도 연산방식을 사용하는 원자형 연산은 가장 가까운 값으로 반올림합니다.

  • 가변 정밀도 연산방식과 IEEE Floating-Point Standard 754의 차이점은 다음과 같습니다.

    • 계산 내에서 0으로 나누면 오류가 발생합니다.

    • 지수 범위는 미리 정의된 IEEE 모드보다 큽니다. vpa는 대략적으로 10^(-323228496) 아래로 언더플로합니다.

    • 비정규화된 숫자는 구현되지 않습니다.

    • 0은 부호가 지정되지 않습니다.

    • 결과의 가수에 있는 이진 숫자의 수는 가변 정밀도 연산방식과 IEEE 사전 정의 유형 간에 다를 수 있습니다.

    • NaN 표현은 하나뿐입니다. quiet NaN과 signaling NaN을 구별하지 않습니다.

    • 부동소수점 숫자 예외는 사용할 수 없습니다.

R2006a 이전에 개발됨