Измените переменную используемую точность
По умолчанию, 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
функция является гарантируемым количеством цифр. Внутренне, тулбокс может использовать еще несколько цифр, чем вы задаете. Эти дополнительные цифры называются guard 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