2012-04-04 19 views
10

estoy haciendo una función en MATLAB para calcular la siguiente función:calcular una función en Matlab con valores muy pequeños

enter image description here

para esta función que tenemos:

enter image description here

Este es mi implementación en Matlab de la función:

function [b]= exponential(e) 
%b = ? 
b= (exp (e) -1)/e; 

Cuando pruebo la función con valores muy pequeños, de hecho el límite de la función es 1, pero cuando el número es muy pequeño (por ej. 1 * e-20) el límite se pone a cero. ¿Cuál es la explicación de este fenómeno? ¿Estoy haciendo algo mal?.

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 

Respuesta

11

El problema es que exp(x) es de aprox 1+x, pero está siendo evaluado como 1 debido a la 1 ser indistinguible de 1+x en la representación de coma flotante. Hay una función MATLAB expm1(x) (que se implementa para exp(x)-1 pequeña x) que evita el problema y funciona bien para pequeños argumentos:

>> x=1e-100;expm1(x)/x 
ans = 
    1 
+0

Buen punto - una función que siempre olvido está incluso allí. –

+2

También hay 'log1p (x)' dando 'log (1 + x)' bien implementado para '' x pequeño. – Ramashalanka

-1

Creo que tiene que ver con la precisión de sus números. En resumen, la precisión predeterminada para MATLAB es de 5 dígitos. Puede ampliarlo a 15 con format long. Consulte this article para obtener más información acerca de la precisión de MATLAB

+0

No creo que tiene que ver con la precisión de la representación aritmética de punto flotante del número, creo que tiene que ver con la máquina épsilon, y posiblemente 1e-020 es menos que el épsilon de la máquina, por lo tanto no puede ser operado en MATLAB, pero no estoy seguro si la suposición es verdadera – franvergara66

+4

'format 'solo se trata de cuántos dígitos se muestran como salida a la consola. No cambia el número subyacente. – tmpearce

5

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.

+0

¿Qué es la herramienta HPF? está incluido en MatLab? – franvergara66

+0

@ Melkhiah66 - no. Es la caja de herramientas de alta precisión que escribí en MATLAB. Todavía estoy refinándolo. Pero también puede usar la caja de herramientas simbólica para cálculos similares. –

+0

@ Melkhiah66 HPF está ahora en el intercambio de archivos –

Cuestiones relacionadas