MÉTODO DE LA SECANTE

 En análisis numérico el método de la secante es un método para encontrar los ceros de una función de forma iterativa.



Es una variación del método de Newton-Raphson donde en vez de calcular la derivada de la función en el punto de estudio, teniendo en mente la definición de derivada, se aproxima la pendiente a la recta que une la función evaluada en el punto de estudio y en el punto de la iteración anterior. Este método es de especial interés cuando el coste computacional de derivar la función de estudio y evaluarla es demasiado elevado, por lo que el método de Newton no resulta atractivo.




En otras palabras, el método de la secante es un algoritmo de la raíz de investigación que utiliza una serie de raíces de las líneas secantes para aproximar mejor la raíz de una función f. El método de la secante se puede considerar como una aproximación en diferencias finitas del método de Newton-Raphson. Sin embargo, este método fue desarrollado independientemente de este último.





Experiencia :

Mi experiencia el la utilización es que de forma grafica y en forma de calculo de tabla es bastante conveniente para saber cuantas interacciones puede tenes el calculo de dos números según la función establecida, y el gusto por este método es su fácil utilización 



Porque se incluyo en la presentación:

Por el manejo básico de datos de forma técnica al encontrar los términos de una función y el desglosamiento de resultados dependiendo de los intervalos ingresados y se aplica la función  que se converge entre los dos puntos .



 Algoritmo del método y código  en C++ y en MatLab.

Código c++ 

#include <iostream>

#include <math.h>

using namespace std;

int main()

{

    cout << " f(x) = e-x - ln(x) " << "\n" << "p0= ?   p1=?    tol=10^-10    i=100" << "\n";

    double p0 = 0, p1 = 0, q0 = 0, q1 = 0, p = 0, fp = 0, e = 0;

    int y = 2;

    cout << "Ingrese p0" <<endl;

    cin >> p0 ;

    cout << "Ingrese p1" <<endl;

    cin >> p1 ;

    

    q0 = pow(2.718281828,-p0)-log(p0);

    q1 = pow(2.718281828,-p1)-log(p1);

    cout << "| i |      p0       |      p1       |      q0       |      q1      |       p       |     f(p)     |     Error    |  Error < tol  |" << "\n";

    for (size_t i = 0; i < 100; i++)

    {

        p = p1 - q1 * (p1 - p0) / (q1 - q0);

        fp= pow(2.718281828,-p)-log(p);

        e = abs((p - p1) / p);

        if (e<0.000000001)

        {

            if (y<10)

            {

                cout << "| " << y << " ";

                printf("|%.12lf", p0);

                printf("|%.12lf", p1);

                printf("|%.12lf", q0);

                printf("|%.12lf", q1);

                printf("|%.12lf", p);

                printf("|%.12lf", fp);

                printf("|%.12lf", e);

                cout << "|   Verdadero   |" << "\n";

                break;

            }

            if (y>9 && y<100)

            {

                cout << "|" << y << " ";

                printf("|%.12lf", p0);

                printf("|%.12lf", p1);

                printf("|%.12lf", q0);

                printf("|%.12lf", q1);

                printf("|%.12lf", p);

                printf("|%.12lf", fp);

                printf("|%.12lf", e);

                cout << "|   Verdadero   |" << "\n";

                break;

            }

            if (y>99 && y<1000)

            {

                cout << "|" << y;

                printf("|%.12lf", p0);

                printf("|%.12lf", p1);

                printf("|%.12lf", q0);

                printf("|%.12lf", q1);

                printf("|%.12lf", p);

                printf("|%.12lf", fp);

                printf("|%.12lf", e);

                cout << "|   Verdadero   |" << "\n";

                break;

            }

        }

        if(e > 0.000000001)

        {

            if (y<10)

            {

                cout << "| " << y << " "; 

                printf("|%.12lf", p0);

                printf("|%.12lf", p1);

                printf("|%.12lf", q0);

                printf("|%.12lf", q1);

                printf("|%.12lf", p);

                printf("|%.12lf", fp);

                printf("|%.12lf", e);

                cout << "|     Falso     |" << "\n";


            }

            if (y>9 && y<100)

            {

                cout << "|" << y << " ";

                printf("|%.12lf", p0);

                printf("|%.12lf", p1);

                printf("|%.12lf", q0);

                printf("|%.12lf", q1);

                printf("|%.12lf", p);

                printf("|%.12lf", fp);

                printf("|%.12lf", e);

                cout << "|     Falso     |" << "\n";

            }

            if (y>99 && y<1000)

            {

                cout << "|" << y;

                printf("|%.12lf", p0);

                printf("|%.12lf", p1);

                printf("|%.12lf", q0);

                printf("|%.12lf", q1);

                printf("|%.12lf", p);

                printf("|%.12lf", fp);

                printf("|%.12lf", e);

                cout << "|     Falso     |" << "\n";

            }

        }

        p0 = p1;

        q0 = q1;

        p1 = p;

        q1 = fp;

        y = y + 1;

    }

}

Matlab

clear;

clc;

v = 1;

p0 = -0.1;

p1 = -1;

it = 100;

tol = 10^-10;

disp('ln(x^2+1) - e^(0.4x) * cos(pi*x)');

disp('p0= -0.1 p1= -1 tol= 10^-10 it= 100');

disp(' | i | P0 | P1 | P | f(p) | E |'); q0

= log((p0.^2)+1)-2.718281828.^(0.4*(p0))*cos(3.141592654*p0);

q1 =log((p1.^2)+1)-2.718281828.^(0.4*(p1))*cos(3.141592654*p1);

for i=0:it

p = p1 - q1 .* (p1-p0) / (q1-q0);

fp = log(p.^2+1)-2.718281828.^(0.4.*(p)).*cos(3.141592654.*p);

e = abs((p - p1)/p); if

(e<tol)

t=[v,p0,p1,p,fp,e]; disp(t);

break;

end

if (e>tol)

t=[v,p0,p1,p,fp,e]; disp(t);

end

end p0=p1;

q0=q1;

p1=p;

q1=fp;

v=v+1;

v = 1;

p0 = 0.1;

p1 = 1;

it = 100;

tol = 10^-10;

disp('ln(x^2+1) - e^(0.4x) * cos(pi*x)'); disp('p0= 0.1 p1= 1 tol=

10^-10 it= 100');

disp(' | i | P0 | P1 | P | f(p) | E |'); q0

= log((p0.^2)+1)-2.718281828.^(0.4*(p0))*cos(3.141592654*p0);

q1 =log((p1.^2)+1)-2.718281828.^(0.4*(p1))*cos(3.141592654*p1);

for i=0:it

p = p1 - q1 .* (p1-p0) / (q1-q0);

fp = log(p.^2+1)-2.718281828.^(0.4.*(p)).*cos(3.141592654.*p);

e = abs((p - p1)/p); if

(e<tol)

t=[v,p0,p1,p,fp,e]; disp(t);

break;

end

if (e>tol)

end

t=[v,p0,p1,p,fp,e]; disp(t);

end

p0=p1;

q0=q1;

p1=p;

q1=fp;

v=v+1;

v = 1;

p0 = 0.6;

p1 = 1.5;

it = 100;

tol = 10^-10;

disp('ln(x^2+1) - e^(0.4x) * cos(pi*x)'); disp('p0= 0.1 p1= 1 tol=

10^-10 it= 100');

disp(' | i | P0 | P1 | P | f(p) | E |'); q0

= log((p0.^2)+1)-2.718281828.^(0.4*(p0))*cos(3.141592654*p0);

q1 =log((p1.^2)+1)-2.718281828.^(0.4*(p1))*cos(3.141592654*p1);

for i=0:it

p = p1 - q1 .* (p1-p0) / (q1-q0);

fp = log(p.^2+1)-2.718281828.^(0.4.*(p)).*cos(3.141592654.*p);

e = abs((p - p1)/p); if

(e<tol)

t=[v,p0,p1,p,fp,e]; disp(t);

break;

end

if (e>tol)

t=[v,p0,p1,p,fp,e]; disp(t);

end

end p0=p1;

q0=q1;

p1=p;

q1=fp;

v=v+1;


Ejemplos:

1 C++ y Mathlab


2


3






Ventajas sobre otros métodos:

1.Al implementar este método, no es necesario conocer la derivada de la función y es de rápida convergencia.

2.A pesar de necesitar de dos puntos de partida, pueden ser aleatorios y no necesariamente tiene que haber cambio de signo entre ellos.

3.Converge más rápido que los métodos lineales.

Desventajas sobre otros métodos:  

1.No siempre converge ya que puede ocurrir que la secante produzca divergencia.

2.No converge más rápido que los métodos cuadráticos.

Origen del Método:

La historia del descubrimiento de la solución algebraica de la cubica enfrento a dos grandes rivales italianos: Cardano y Tartaglia hacia 1540, y Ferrari, alumno y secretario de Cardano resolvió en 1545 la ecuación de cuarto grado


Enlaces con mas información respecto al tema  

https://reynacampos.wordpress.com/2014/03/19/metodo-de-la-secante/#:~:text=Antecedentes%20del%20M%C3%A9todo%20de%20la,la%20ecuaci%C3%B3n%20de%20cuarto%20grado.


No hay comentarios.:

Publicar un comentario