Вычисление функции в matlab с очень малыми значениями
Я делаю функцию в matlab для вычисления следующей функции:
![enter image description here]()
для этой функции имеем:
![enter image description here]()
Это моя реализация в matlab функции:
function [b]= exponential(e)
%b = ?
b= (exp (e) -1)/e;
Когда я проверяю функцию с очень малыми значениями, действительно ли предел функции равен 1, но когда число очень мало (например, 1 * e-20), предел равен нулю? каково объяснение этому феномену?. Я делаю что-то неправильно?.
x= 10e-1 , f (x)= 1.0517
x= 10e-5 , f (x)= 1.0000
x= 10e-10 , f (x)= 1.0000
x= 10e-20 , f (x)= 0
Ответы
Ответ 1
Проблема заключается в том, что exp(x)
составляет приблизительно 1+x
, но оценивается как 1
из-за того, что 1
неотличим от 1+x
в представлении с плавающей запятой. Существует функция MATLAB expm1(x)
(которая exp(x)-1
реализована для малого x
), что позволяет избежать проблемы и хорошо работает для небольших аргументов:
>> x=1e-100;expm1(x)/x
ans =
1
Ответ 2
Мне пришлось попробовать использовать LIMEST. Как и в любом адаптивном инструменте, его можно обмануть, но обычно это довольно хорошо.
fun = @(x) (exp(x) - 1)./x;
Как вы можете видеть, у забавы есть проблемы с нулем.
fun(0)
ans =
NaN
хотя, если мы оцениваем оценку вблизи нуля, мы видим, что она близка к 1.
format long g
fun(1e-5)
ans =
1.00000500000696
LIMEST преуспевает и даже может обеспечить оценку ошибки предела.
[lim,err] = limest(fun,0,'methodorder',3)
lim =
1
err =
2.50668568491927e-15
LIMEST использует последовательность полиномиальных аппроксимаций в сочетании с адаптивной экстраполяцией Ричардсона для генерации как предельной оценки, так и меры неопределенности на этом пределе.
Какая проблема вы видите? Неисправность, которую вы видели, является простой ошибкой вычитания. Таким образом, посмотрите на значение
exp(1e-20)
ans =
1
Даже в формате long g значение двойной точности exp (1e-20) просто слишком близко к 1, что при вычитании 1 результат является точным нолем. Разделите это на любое ненулевое значение, и мы получим нуль. Конечно, когда x фактически равно нулю, мы имеем условие 0/0, поэтому NaN получилось, когда я это пробовал.
Позволяет увидеть, что происходит с высокой точностью. Я буду использовать свой инструмент HPF для этого вычисления и работать с 64 десятичными цифрами.
DefaultNumberOfDigits 64
exp(hpf('1e-20'))
ans =
1.000000000000000000010000000000000000000050000000000000000000166
Посмотрите, что когда мы отключим 1, разница между 1 и экспоненциальным значением меньше, чем eps (1), поэтому MATLAB должен произвести нулевое значение.
exp(hpf('1e-20')) - 1
ans =
1.000000000000000000005000000000000000000016666666666670000000000e-20
Непонятный вопрос заключается в том, как я хотел бы точно сгенерировать эту функцию в MATLAB. Ясно, что вы не хотите использовать грубую силу и определять веселье, как я, поскольку вы теряете большую точность. Я бы, вероятно, просто расширил серию Тейлора в ограниченной области вокруг нуля и использовал бы удовольствие, как указано выше, для x, значительно отличающегося от нуля.
Ответ 3
Я думаю, что это связано с точностью ваших чисел. Короче говоря, стандартная точность для MATLAB составляет 5 цифр. Вы можете увеличить его до 15 с помощью format long
. Ознакомьтесь с этой статьей для получения дополнительной информации о точности MATLAB