El método de la secante es un método para encontrar los ceros de una función de forma iterativa.
Este método encuentra los ceros de la función de una forma similar al método de Newton-Raphson, pero no calcula la derivada, sino que calcula una aproximación, esto es para que se pueda hacer de manera programable, así los usuarios no necesitan introducir la derivada de la función.
El aproximado de una derivada lo consigue de forma iterativa con la siguiente formula:
Para que el método funcione se necesita conocer la función, y dos puntos (xi, xi-1) que son las aproximaciones iniciales. El método funciona dibujando una linea secante entre las aproximaciones iniciales, consigue la raíz de esa linea y lo utiliza para hacer una nueva aproximación, y vuelve a iterar utilizando esta aproximación nueva.
Diagrama de flujo:
La condición de parada del método es cuando la raíz calculada es menor al error definidos, este error tiene que ser un número muy cercano a 0 (que es lo que se está buscando en este método), en el caso de mi código se utiliza un error de 0.000000001
Código fuente:
Pruebas:
Con la función Log(x):
En este caso no se puede calcular Log(0), por lo tanto el código no funciona.
En este caso mi código no funciona porque no está preparado para recibir la raíz como valor semilla, además de que para logaritmo natural no se pueden utilizar valores negativos.
Con la función x^2:
La raíz exacta es 0, pero este valor se aproxima lo suficiente y concuerda con mi error.
Aunque mi programa no está preparado para recibir la raíz como valor semilla, como son valores relativamente cercanos uno del otro, no hizo falta dibujar muchas lineas secantes, y en una de ellas se cruzó con el valor de la raíz exacta que es 0.
Con la función x^3 + 1:
Este es un caso frontera, con estos valores mi código no puede encontrar la matriz. Esto puede ser debido a la manera en que se manejan los números decimales en C++, ya que matemáticamente todos las operaciones necesarias deberían de ser posibles. Al hacer un debug de este caso pude observar que una de las aproximaciones de mi código tiende a infinito.
En conclusión:
Este método es una manera rápida para conseguir las raíces de una función, ademas de que tiene la ventaja de que no es necesario conocer la derivada de la función, y ni siquiera se tiene que calcular (lo cual sería muy costoso para la computadora).