vpa

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

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

Синтаксис

vpa(x)
vpa(x,d)

Описание

пример

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