Método de Newton Raphson (Newton-Fourier) en Matlab

[Recuerda que en este Blog los enlaces para la descarga del código se encuentran al final del artículo.]

Cuando hablamos de métodos numéricos o análisis numérico es imposible no nombrar el método de Newton-Raphson también conocido como método de Newton-Fourier, este método es del tiempo ”abierto” ya que su convergencia no está garantizada y depende de una buena estimación inicial de la raíz y de la naturaleza propia de la función f(x) sabiendo entonces que si la función presenta varios punto de inflexión o pendientes muy grandes cerca de la raíz a encontrar entonces la probabilidades de que el método finalmente diverja comienzan a aumentar.

(de una sola variable, aunque en estradas siguientes veremos generalizaciones para varias variables)

El funcionamiento del método es relativamente sencillo, obviamente el primer paso es definir la función F(x) que se quiere analizar y luego una estimación Xn de la raíz que esperamos encontrar, con lo anterior se define entonces la coordenada del punto [Xn,F(Xn)] como se puede ver en la fingura 1, donde la pendiente (m) de la recta en cuestión viene dada por la derivada de la función evaluada en dicho punto es decir F'(Xn) entonces en este caso el método se basa en que el corte entre la recta tangente y el eje X ofrece una nueva y mejor aproximación a la raíz que se desea encontrar, es decir que el corté con el eje X será X(n+1) y el procedimiento descrito se repetirá en varias ocasiones hasta encontrar un buen aproximado de la raíz.

Imagen

Fig 1. Se traza una linea tangente a la curva en el punto [Xn,F(Xn)] con pendiente m=F'(Xn) y el corte con el eje X será la nueva aproximación a la raíz.

Entonces sea f una función derivable que se encuentra definida en el intervalo real [a , b] y el conjunto de números naturales (1,2,3,4,5,6…) entonces partimos con un estimado inicial Xo entonces, la ecuación propuesta en el método para las aproximaciones sucesivas son:

newton2

Donde f’ representa la derivada de la función f , y, Xn+1 la aproximación más reciente a la raíz buscada.

ALGORITMO EN MATLAB.

Teniendo en cuenta todo lo anterior, y tomando como base la ultima ecuación vamos a implementar el código en Matlab® que finalmente nos permitirá hallar las raíces que queremos encontrar.

(Recuerden, como es usual el código estará descargable al final del articulo).

Inicialmente lo primero que se debe hacer (cómo siempre) es  solicitar al usuario la entrada de la función a la cual se le quiere calcular la raíz, recordando definir la variable X como simbólica:

Sin título

A continuación, aunque no es un paso necesario, siempre es bueno presentar una visualización del comportamiento de la función, porque (cómo sabemos) la convergencia de este método de otros por el estilo se mejora cuando la estimación es más aproximada a la raíz real, en este caso hago un “break” en cuanto al método y le solicito al usuario un par de limites es los que desee ver el comportamiento:

Sin título

Continuando con la implementación del método y después de mostrar el comportamiento de la curva, podemos solicitarle al usuario del programa que ingrese su estimación, a la que llamaremos Xn y enseguida obtendremos la derivada de la función obviamente con respecto a ‘x’ cómo lo vemos en el siguiente código:

Sin título

Recordemos que, cómo la mayoría de métodos que hemos visto hasta ahora se basan en la iteración y la estimación del error, pues Newton-Raphson no es la excepción y lo que haremos a continuación será crear el ‘bucle’ en el que se llevará a cabo todo el proceso, incluyendo obviamente la estimación del error ya que a su vez será nuestra condición de parada del siclo. (entrada sobre calculo del error en métodos numéricos en matlab).

Sin título

y este es el final del método numérico Newton-Raphson cómo podemos observar es muy sencillo de implementar y bastante potente, siempre hay que tener en cuenta la gran importancia de una buena estimación inicial ya que de ella depende que el método presente una mayo convergencia.

cómo se puede observar antes de comenzar las iteraciones en el bucle ‘while’ hay que inicializarlas para evitar que Matlab nos presente errores de compilación, en nuestro caso el error lo inicié en 1, aunque esto no tiene mucha importancia ya que solo necesitamos que se cumpla la condición de iteración para que posteriormente se calcule el verdadero error…Otro factor importante es la tolerancia que quiere decir que tanto permitimos el error en este caso quiero que el error sea 0.0001 ó menor, en realidad a la hora de visualizarlo en la command window no se notará mucho la precisión en los decimales ya que por defecto muestra solo 4 decimales, pero a nivel de las variables si se toman todos, así que siempre es bueno tomar una buena tolerancia para una mayor precisión en los cálculos.

Finalmente te mostraré el funcionamiento de todo lo que dijimos antes, para este caso queremos encontrar la raíz aproximada de la función f(x) = exp(x)-(1/x).

Sin título

Entones después de tener el código y haberlo guardado  con el mismo nombre de la función (en este caso Newton_Raphson) procedemos a llamarla desde la command window, al hacerlo ella nos indicará que ingresemos la función.

Sin título

Al hacer esto, el programa (opcionalmente) nos pedirá un par de limites para ver el comportamiento de la función y tomar una buena decisión, en este caso tomaremos como limite superior 2 y como inferior 0.5 y observaremos como se comporta en ese sector:

Sin título

Sin título

Cómo podemos ver una de las diferentes raíces que presenta esta función está cerca a 0.5, a modo de experimento tomaremos la estimación que nos pide el programa como 1 y esperamos el resultado con una tolerancia de 0.00001:

Sin título

en mi caso tengo Matlab configurado en este momento para que me muestre esta cantidad de decimales por precisión, finalmente como podemos ver el resultado que nos arroja el método con la precisión establecida es el número que aparece arriba y si evaluamos este valor en la función obtendremos -2.45×10^(-12) lo que quiere decir que es una gran aproximación a 0 (cero). Recuerden que la tolerancia influye en el tiempo de ejecución del programa, entre menor sea la tolerancia al error mas procesos se llevarán a cabo para logar una buena aproximación a la raíz esperada.

Finalmente quiero recordar la importancia de una buena estimación Xn para no tener inconvenientes con la convergencia del método.

Cómo tal vez hayan visto de artículos anteriores el archivo (.m) de este método se encuentra disponible aquí para su descarga cómo pueden ver el código es funcional y así es como lo subí, sin embargo, si notan algún problema pueden comentar.

Tomarse el tiempo para comentar, es una forma de agradecer el tiempo del autor para realizar este documento. Saludos

17 comentarios en “Método de Newton Raphson (Newton-Fourier) en Matlab

  1. Pingback: Método de la Secante en Matlab (código). | El Blog de Programación para Ingenierías

  2. Muy buen metodo y excelente explicacion!tengo la version portable en este momento pero en cuanto pueda lo pruebo en una version instalada. Estoy teniendo problemas con la variable simbolica (syms) y supongo que debe ser por eso que no me funciona.
    gracias de todos modos!
    saludos

    Me gusta

    • Hola @Sandra, gracias por comentar, si estás teniendo problemas con la declaración de variables simbólicas Syms seguro debe ser porque es versión portable, hace tiempo me sucedió lo mismo.

      Saludos y gracias por tu comentario Sandra

      Me gusta

  3. buen programa disculpa una pregunta me sale la raiz encontrada como fraccion como hago para q me salga no en fracciones sino en una cifra … xq en esa fraccion debo convertirla a enteros
    4870847/2178309…. me sale asi
    y deseo que me salga el resultado de esa fraccion

    Me gusta

    • Hola @liga002, el que aparezca en forma de fracción es por la versión que usas de Matlab que seguramente es de la más recientes, y tiende a entregar los resultados de forma ‘simbólica’ para que veas el número decimal hay varias formas, una es modificar el archivo poniendo la función double(Xn) al final del script y de está forma se obliga a Matlab a volver la fracción en decimal.

      Espero que esto te sirva, saludos y gracias por comentar.

      Le gusta a 1 persona

  4. Hola, ¿qué tal?. Tengo un problema y es que el resultado me lo da en función de sen y cos. No me queda el resultado decimal o en fracción. ¿A qué se puede deber?

    Me gusta

    • Hola @Fernand, gracias por comentar, lo que nos comentas tiene que ver con las versiones más recientes de Matlab, en este caso dado que el sofware retorna un resultado simbólico debes hacer uso de la función double() y entre paréntesis pones el resultado o la variable que contiene el resultado, si aparece algún error no dudes en comentar de nuevo.
      Saludos.
      Julio.

      Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s