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 автоматически преобразует входы в double®.

Изменение точности, используемой 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 может признать и восстановить точность выражений формы <reservedrangesplaceholder5> / <reservedrangesplaceholder4>, <reservedrangesplaceholder3> π / 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

Как ожидалось, результат двойной точности отличается от точного результата на 16th десятичное число.

Продемонстрировать, что 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 восстанавливает точность для числовых входов, которые соответствуют формам <reservedrangesplaceholder5> / <reservedrangesplaceholder4>, <reservedrangesplaceholder3> π / q, (p / q)1/2, 2q, и 10q, где p и q являются скромными целыми числами.

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

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

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

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

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

    • Нули не подписаны.

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

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

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

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