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 FunctionPodemos verificar nuestra solución si insertamos en la celda C22 la fórmula: =NewtonRaphson(C3;0,000001;100)
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/E3que 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.
Ismael buenos días
ResponderEliminarMuchas 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
:O
Eliminargracias!
Corrijo
hola como estan
Eliminar