Вычисление функции в 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