Арифметика с переменной точностью (арифметика с произвольной точностью)
Поддержка векторов символов, не определяющих число, удалена. Вместо этого сначала создайте символьные числа и переменные с помощью sym и syms, а затем использовать операции над ними. Например, использовать vpa((1 + sqrt(sym(5)))/2) вместо vpa('(1 + sqrt(5))/2').
vpa( использует арифметику с переменной точностью и плавающей запятой (VPA) для вычисления каждого элемента символьного ввода x)x по крайней мере d значащие цифры, где d - значение digits функция. Значение по умолчанию digits составляет 32.
Вычислите символьные входные данные с помощью арифметики с плавающей запятой переменной точности. По умолчанию 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
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.
Исключения чисел с плавающей запятой отсутствуют.
digits | double | root | vpaintegral