Изменение используемой точности переменной
По умолчанию MATLAB ® использует 16 цифр точности. Для более высокой точности используйтеvpa. Точность по умолчанию для vpa 32 цифры. Увеличьте точность до 32 цифр с помощью digits.
Найти pi использование vpa, которая использует 32 цифры точности по умолчанию. Подтвердите, что текущая точность равна 32 с помощью digits.
pi32 = vpa(pi)
pi32 = 3.1415926535897932384626433832795
currentPrecision = digits
currentPrecision =
32Сохранить текущее значение digits в digitsOld и задайте для новой точности значение 100 цифры. Найти pi использование vpa. Результат содержит 100 цифр.
digitsOld = digits(100); pi100 = vpa(pi)
pi100 = 3.1415926535897932384626433832795028841971693993751058209... 74944592307816406286208998628034825342117068
Примечание
vpa вывод символичен. Чтобы использовать символьный вывод с функцией MATLAB, которая не принимает символьные значения, преобразуйте символьные значения в двойную точность с помощью double.
Наконец, восстановить старое значение digits для дальнейших расчетов.
digits(digitsOld)
Дополнительные сведения см. в разделе Повышение точности числовых вычислений.
Увеличение скорости вычислений MATLAB с помощью vpa с меньшей точностью. Установка более низкой точности с помощью digits.
Сначала найдите время, необходимое для выполнения операции на большом входе.
input = 1:0.01:500; tic zeta(input); toc
Elapsed time is 48.968983 seconds.
Теперь повторите операцию с меньшей точностью, используя vpa. Понизить точность до 10 цифры с помощью digits. Затем используйте vpa для снижения точности input и выполните ту же операцию. Затраченное время значительно уменьшается.
digitsOld = digits(10); vpaInput = vpa(input); tic zeta(vpaInput); toc
Elapsed time is 31.450342 seconds.
Примечание
vpa вывод символичен. Чтобы использовать символьный вывод с функцией MATLAB, которая не принимает символьные значения, преобразуйте символьные значения в двойную точность с помощью double.
Наконец, восстановить старое значение digits для дальнейших расчетов.
digits(digitsOld)
Дополнительные сведения см. в разделе Увеличение скорости путем уменьшения точности.
Количество цифр, указанное с помощью vpa функции или digits функция - гарантированное количество цифр. Внутри панели инструментов может использоваться несколько больше цифр, чем указано. Эти дополнительные цифры называются защитными. Например, установите число цифр равным 4, а затем отобразите аппроксимацию с плавающей запятой 1/3, используя четыре цифры:
old = digits(4); a = vpa(1/3)
a = 0.3333
Теперь отображение a используя 20 цифр. Результат показывает, что панель инструментов использовала более четырех цифр при вычислении a. Последние цифры в следующем результате неверны из-за ошибки округления:
digits(20) vpa(a) digits(old)
ans = 0.33333333333303016843
Скрытые ошибки округления могут привести к неожиданным результатам. Например, вычислите число 1/10 с 32-значной точностью по умолчанию и с 10-значной точностью:
a = vpa(1/10) old = digits(10); b = vpa(1/10) digits(old)
a = 0.1 b = 0.1
Теперь вычислите разницу a - b. Результат не равен 0:
a - b
ans = 0.000000000000000000086736173798840354720600815844403
Различие a - b не равно нулю, поскольку панель инструментов внутренне увеличивает 10-значное число b = 0.1 до 32-значной точности. Этот процесс подразумевает ошибки округления. Панель инструментов фактически вычисляет разницу a - b следующим образом:
b = vpa(b) a - b
b = 0.09999999999999999991326382620116 ans = 0.000000000000000000086736173798840354720600815844403
Предположим, что вы преобразуете двойное число в символический объект, а затем выполняете операции VPA над этим объектом. Результаты могут зависеть от метода преобразования, который использовался для преобразования числа с плавающей запятой в символический объект. sym функция позволяет выбрать метод преобразования путем указания дополнительного второго аргумента, который может быть 'r', 'f', 'd', или 'e'. Значение по умолчанию: 'r'. Например, преобразуйте константу δ = 3.141592653589793... к символическому объекту:
r = sym(pi) f = sym(pi,'f') d = sym(pi,'d') e = sym(pi,'e')
r = pi f = 884279719003555/281474976710656 d = 3.1415926535897931159979634685442 e = pi - (198*eps)/359
Хотя панель инструментов отображает эти числа по-разному на экране, они являются рациональными приближениями pi. Использовать vpa для преобразования этих рациональных аппроксимаций pi вернитесь к значениям с плавающей запятой.
Установите число цифр равным 4. Три из четырёх приближений дают одинаковый результат.
digits(4) vpa(r) vpa(f) vpa(d) vpa(e)
ans = 3.142 ans = 3.142 ans = 3.142 ans = 3.142 - 0.5515*eps
Теперь установите число цифр равным 40. Различия между символическими приближениями pi становятся более заметными.
digits(40) vpa(r) vpa(f) vpa(d) vpa(e)
ans = 3.141592653589793238462643383279502884197 ans = 3.141592653589793115997963468544185161591 ans = 3.1415926535897931159979634685442 ans = 3.141592653589793238462643383279502884197 -... 0.5515320334261838440111420612813370473538*eps