exponenta event banner

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