jueves, 26 de abril de 2018

VBA: Método de Newton-Raphson en Excel

Un usuario planteaba dudas por cómo emplear en Excel el método de Newton-Raphson (ver Wikipedia) para resolver ecuaciones y encontrar su raíz.

Si trasladamos esos algoritmos de cálculo a nuestras macros, en modo de función, tendríamos las UDF que veremos a continuación...
El algoritmo se basa, de acuerdo a lo que se indica en Wikipedia, a un método recurrente geométrico... desarrollado a partir de otro método de cálculo (método de la secante).
Seguro que algún experto matemático podrá aportar mucho más al respecto.


En mi ejemplo, operaremos para obtener la raíz de la siguiente ecuación:
f(x)=LOG(x-1)+COS(x-1)

Nota: la función de VBA LOG equivale al logaritmo neperiano (o natural) en base e (2,718281828459)

y sabiendo que su función derivada es:
f'(x)=1/(x-1)-SIN(x-1)




En un módulo estándar del libro incluimos las siguientes UDF:

Function func(x) As Double
'Nuestra función a analizar
func = Math.Log(x - 1) + Math.Cos(x - 1)

End Function
Function func_derivada(x) As Double
'la derivada de nuestra función
func_derivada = 1 / (x - 1) - Math.Sin(x - 1)

End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function NewtonRaphson(x_0 As Double, tolerancia As Double, iteracionMax As Long)
'1er argumeto x_0: el valor inicial desde donde parte el recorrido buscando la raíz/solución.
'2do argumento tolerancia: el margen de error buscado.
'3er argumento iteraciónMax: el límite de iteraciones máximo permitido buscando la raíz/solución
Dim x_n1 As Double, x_n As Double
Dim error_dif As Double

Dim contador As Integer
x_n = x_0
contador = 0
'iniciamos el bucle...
Do
    'método Newton-Raphson
    x_n1 = x_n - func(x_n) / func_derivada(x_n)
    'paremetrizamos el error
    error_dif = x_n1 - x_n
    'y asignamos nuevo valor para el siguiente paso iterativo
    x_n = x_n1
    'incrementamos el contador para controlar una salida del bucle
    contador = contador + 1
Loop Until Math.Abs(error_dif) <= tolerancia Or contador = iteracionMax
'hemos salido del bucle si la diferencia entre los elementos es menor de la tolerancia determinada
' o la iteración llega al máximo indicado(iteracionMax).

'finalmente damos valor a nuestra función
NewtonRaphson = x_n1
End Function

Podemos verificar nuestra solución si insertamos en la celda C22 la fórmula: =NewtonRaphson(C3;0,000001;100)

VBA: Método de Newton-Raphson en Excel

Una alternativa, mediante funciones sin programación, es hacerlo directamente sobre la hoja de cálculo, como se ve en la imagen anterior.

En la celda C3 disponemos el primer valor a tomar 1,01 para nuestro ejemplo, y en la celdas sucesivas C4:C18 añadimos:

=C3-D3/E3

que respondería al algoritmo del método de Newton...

En las columnas C y D añadiríamos la formulación de la función principal y la función derivada, respectivamente para los valores obtenidos en la columna B.

En otro post, describiré el proceso manual.

Por otra parte, si hacemos la comprobación gráfica de la raíz, vemos que efectivamente, cuando x=1,397748475 la función f(x)=LOG(x-1)+COS(x-1) se hace cero.

VBA: Método de Newton-Raphson en Excel

2 comentarios:

  1. Ismael buenos días
    Muchas gracias por todos sus aportes. Los sigo y aplico. Una observación, la gráfica y tabla corresponden a la función
    f(x)=LOG(x-1)+ COS(x-1)
    En la macro está bien escrita, es cambiar en la página el menos. No soy experto en macros y no he logrado hacer que funcione (sólo manejo copiar y pegar). Algo estaré haciendo mal.
    Saludos cordiales

    ResponderEliminar