vpa

Арифметика переменной точности (арифметика произвольной точности)

Поддержка векторов символов, которые не задают номер, была удалена. Вместо этого сначала создайте символьные числа и переменные с помощью sym и syms, и затем используйте операции на них. Например, используйте vpa((1 + sqrt(sym(5)))/2) вместо vpa('(1 + sqrt(5))/2').

Синтаксис

Описание

пример

vpa(x) переменная точность использования арифметика с плавающей точкой (VPA), чтобы оценить каждый элемент символьного входа x по крайней мере, к d значительные цифры, где d значение digits функция. Значение по умолчанию digits 32.

пример

vpa(x,d) использование, по крайней мере, d значительные цифры, вместо значения digits.

Примеры

Оцените символьные входные параметры с арифметикой Переменной Точности

Оцените символьные входные параметры с переменной точностью арифметика с плавающей точкой. По умолчанию, 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]

Примечание

Необходимо перенести все внутренние входные параметры с vpa, такой как exp(vpa(200)). В противном случае входные параметры автоматически преобразованы, чтобы удвоиться MATLAB®.

Измените точность, используемую vpa

По умолчанию, vpa оценивает входные параметры к 32 значительным цифрам. Можно изменить количество значительных цифр при помощи digits функция.

Аппроксимируйте выражение 100001/10001 с семью значительными цифрами с помощью digits. Сохраните старое значение digits возвращенный digits(7). vpa функция возвращает только пять значительных цифр, которые могут означать, что остающиеся цифры являются нулями.

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

Проверяйте, являются ли остающиеся цифры нулями при помощи более высокого значения точности 25. Результат показывает, что остающиеся цифры являются на самом деле периодической десятичной дробью.

digits(25)
vpa(y)
ans =
9.999100089991000899910009

В качестве альтернативы заменять digits для одного vpa вызовите, измените точность путем определения второго аргумента.

Найдите π к 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 функция задает минимальное количество значительных используемых цифр. Внутренне, vpa может использовать больше цифр, чем digits задает. Эти дополнительные цифры называются защитными цифрами, потому что они принимают меры против ошибок округления в последующих вычислениях.

Численно аппроксимированный 1/3 использование четырех значительных цифр.

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

Аппроксимируйте результат a использование 20 цифр. Результат показывает, что тулбокс внутренне использовал больше чем четыре цифры при вычислении a. Последние цифры в результате являются неправильными из-за ошибки округления.

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

Поверхностно, a и b выглядите равными. Проверяйте их равенство путем нахождения a - b.

a - b
ans =
0.000000000000000000086736173798840354720600815844403

Различие не равно нулю потому что b был вычислен только с 10 цифры точности и содержат большую ошибку округления, чем a. Когда вы находите a - b, vpa аппроксимирует b с 32 цифрами. Продемонстрируйте это поведение.

a - vpa(b, 32)
ans =
0.000000000000000000086736173798840354720600815844403

vpa Точность восстановлений общих входных параметров с двойной точностью

В отличие от точных символьных значений, значения с двойной точностью по сути содержат ошибки округления. Когда вы вызываете vpa на входе с двойной точностью, vpa не может восстановить потерянную точность, даже при том, что она возвращает больше цифр, чем значение с двойной точностью. Однако vpa может распознать и восстановить точность выражений формы p/q, p π/q, (p/q) 1/2, 2q, и 10q, где 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-м десятичном разряде.

Продемонстрируйте тот vpa точность восстановлений для выражений формы p/q, p π/q, (p/q) 1/2, 2q, и 10q, где 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).

  • vpa использование больше цифр, чем количество цифр задано digits. Эти дополнительные цифры принимают меры против ошибок округления в последующих вычислениях и называются защитными цифрами.

  • Когда вы вызываете vpa на числовом входе, таком как 1/3, 2^(-5), или sin(pi/4), числовое выражение выполнено к номеру с двойной точностью, который содержит ошибки округления. Затем vpa обращен тот номер с двойной точностью. Для точных результатов преобразуйте числовые выражения в символьные выражения с sym. Например, чтобы аппроксимировать exp(1), используйте vpa(exp(sym(1))).

  • Если второй аргумент d не целое число, vpa раунды это к самому близкому целому числу с round.

  • vpa точность восстановлений для числовых входных параметров, которые совпадают с формами p/q, p π/q, (p/q) 1/2, 2q, и 10q, где p и q являются целыми числами скромного размера.

  • Атомарные операции с помощью арифметики переменной точности вокруг для самого близкого.

  • Различия между арифметикой переменной точности и IEEE Стандартные 754 С плавающей точкой

    • В расчетах деление на нуль выдает ошибку.

    • Область значений экспоненты больше, чем в любом предопределенном режиме IEEE. vpa потери значимости приблизительно ниже 10^(-323228496).

    • Денормализованные числа не реализованы.

    • Обнуляет не подписываются.

    • Количество двоичных цифр в мантиссе результата может отличаться между арифметикой переменной точности и предварительно определенными типами IEEE.

    • Существует только один NaN представление. Никакое различие не сделано между тихим и сигнальным NaN.

    • Никакие исключения числа с плавающей запятой не доступны.

Представлено до R2006a