вычисление функции в Matlab с очень маленькими значениями

Я делаю функцию в Matlab для вычисления следующей функции:

введите здесь описание изображения

для этой функции имеем:

введите здесь описание изображения

Это моя реализация в 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

person franvergara66    schedule 04.04.2012    source источник


Ответы (3)


Проблема в том, что exp(x) примерно равно 1+x, но оценивается как 1 из-за того, что 1 неотличимо от 1+x в представлении с плавающей запятой. Существует функция MATLAB expm1(x) (которая exp(x)-1 реализована для малых x), которая позволяет избежать этой проблемы и хорошо работает для малых аргументов:

>> x=1e-100;expm1(x)/x
ans =
     1
person Ramashalanka    schedule 04.04.2012
comment
Существует также log1p(x), дающий log(1+x), хорошо реализованный для небольших x. - person Ramashalanka; 04.04.2012

Мне пришлось попробовать мой инструмент 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. Ясно, что вы не хотите использовать грубую силу и определять удовольствие, как я, поскольку вы теряете большую часть точности. Я бы, вероятно, просто расширил ряд Тейлора в ограниченной области вокруг нуля и использовал fun, как указано выше, для x, значительно отличающегося от нуля.

person Community    schedule 04.04.2012
comment
Что такое инструмент HPF? входит в состав MatLab? - person franvergara66; 04.04.2012
comment
@ Melkhiah66 - нет. Это высокоточный набор инструментов, который я написал в MATLAB. Я все еще дорабатываю его. Но вы также можете использовать символьный набор инструментов для подобных вычислений. - person ; 04.04.2012
comment
@Melkhiah66 HPF теперь на файловом обмене - person ; 19.05.2012

Я думаю, это связано с точностью ваших чисел. Короче говоря, точность по умолчанию для MATLAB составляет 5 цифр. Вы можете расширить его до 15 с помощью format long. Прочтите эту статью для получения дополнительной информации о точности MATLAB.

person Squazic    schedule 04.04.2012
comment
Я не думаю, что это связано с точностью арифметического представления числа с плавающей запятой, я думаю, что это связано с эпсилон машины, и, возможно, 1e-020 меньше, чем эпсилон машины, поэтому не может быть работает в MATLAB, но я не уверен, что предположение верно - person franvergara66; 04.04.2012
comment
format имеет дело только с тем, сколько цифр отображается в качестве вывода на консоль. Это не меняет основной номер. - person tmpearce; 04.04.2012