Tuve que probar mi herramienta LIMEST. Al igual que con cualquier herramienta de adaptación, se puede engañar, pero por lo general es bastante bueno.
fun = @(x) (exp(x) - 1)./x;
Como puede ver, la diversión tiene problemas en cero.
fun(0)
ans =
NaN
aunque si se valora la diversión cerca de cero, vemos que está cerca de 1.
format long g
fun(1e-5)
ans =
1.00000500000696
LIMEST tiene éxito, e incluso es capaz de proporcionar una estimación de error del límite.
[lim,err] = limest(fun,0,'methodorder',3)
lim =
1
err =
2.50668568491927e-15
LIMEST utiliza una secuencia de aproximaciones polinómicas, junto con una extrapolación Richardson adaptativo para generar tanto una estimación límite y una medida de la incertidumbre en ese límite.
¿Qué problema estás viendo? El error que ha visto es un simple error de cancelación sustractivo. Por lo tanto, mira el valor de
Incluso con formato largo g, el valor de doble precisión de exp (1e-20) es simplemente demasiado cerca de 1 que cuando restamos de 1, el resultado es un cero exacta . Divida eso por cualquier valor distinto de cero, y obtenemos cero. Por supuesto, cuando x es realmente cero, entonces tenemos una condición 0/0, por lo que resultó NaN cuando lo intenté.
Veamos qué ocurre con alta precisión. Usaré mi herramienta HPF para ese cálculo y trabajaré en 64 dígitos decimales.
DefaultNumberOfDigits 64
exp(hpf('1e-20'))
ans =
1.000000000000000000010000000000000000000050000000000000000000166
ver que cuando nos sutract fuera 1, la diferencia entre el 1 y el valor exponencial es menos de EPS (1), por lo que MATLAB debe producir un valor de cero.
exp(hpf('1e-20')) - 1
ans =
1.000000000000000000005000000000000000000016666666666670000000000e-20
La pregunta no formulada es cómo elegiría generar esa función con precisión en MATLAB. Claramente, no quieres usar la fuerza bruta y definir la diversión como yo lo hice, ya que pierdes una gran precisión.Probablemente expandiría la serie de Taylor en una región limitada alrededor de cero, y usaría la diversión como arriba para x significativamente diferente de cero.
Buen punto - una función que siempre olvido está incluso allí. –
También hay 'log1p (x)' dando 'log (1 + x)' bien implementado para '' x pequeño. – Ramashalanka