martes, 9 de mayo de 2017

Método de la Secante

El método de secante es un algoritmo que busca la raíz de una función. Podría considerarse como una variante del método Newton-Raphson por todas las similitudes que tienen, ambas son métodos abiertos, funcionan a partir de una fórmula que proviene de la pendiente de una gráfica, y tienen las mismas ventajas y desventajas. A diferencia de Newton-Raphson, el método secante necesita dos valores de entrada para funcionar y no se necesita evaluar la derivada de la función en la cual se quiere encontrar la raíz.
Al igual que el método Newton-Raphson, el método secante funciona entorno a una formula, en este caso, la fórmula de la secante; la cual, dado dos puntos como valores de entrada, el método calcula una secante para acercarse a la raíz. Gráficamente, funciona igual que Newton-Raphson, por excepción de que, en vez de calcular una tangente dado un punto, este calcula una secante dado dos puntos: xy x1. El punto en la gráfica, donde la secante de la iteración anterior cruza eje x, se convierte en x(o nuevo x0), y se calculara una nueva secante con xy x2; este proceso se repetirá hasta que uno de los puntos evaluado en la función sea cero.
Por ser método abierto, no tiene requisitos estrictos para que funcione, como es el caso del método bisección; sin embargo, dada una función donde su raíz sea un punto de inflexión, el método tendrá que hacer muchas más iteraciones, o incluso a nunca terminar, a comparación con los métodos bisección y Newton-Raphson. Además, los dos puntos dados no deben formar una línea paralela al eje x al calcular la secante, ya que esto provocaría que el método se itere indefinidamente.
secant

El método se detiene se detiene si y solamente si la función evaluada en uno de los puntos donde la secante cruza el eje x, es cercana a cero; o puede que nunca termine si la secante es paralela al eje x.

Codigo Fuente en C++


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <cmath>

using namespace std;
double EPSILON = 0.0000000000001;

double f (double x) {
    //return exp (-x) - x;
    //return log (x);
    //return pow(x,2);
    //return (sin(x) + 2 * x - 1);
    return pow(x-1, 3) + 0.512;
    //return sin(x);
}

void finish( double x, int count ){
    cout << "One root is: " << x << endl; 
    cout << "Iterations: " << count; 
    return;
}

int main() {
    double x0, x1, xn, rb;  //rb -> first root evaluated
    int count = 1;          //counter
    x0 = 4;               // -> Entry points 
    x1 = 1;                 // -> Entry points
    
    //Check entry points
    if ( f(x0) == 0 ) {
        finish( x0, 0 );
    }
    if ( f(x1) == 0 ) {
        finish( x1, 0 );
    }
    //end check entry points
    
    //Start loop
    do {
        //Evaluate entry points
        double fX0 = f( x0 );
        double fX1 = f( x1 );
        
        //Evaluate new x
        xn = x1 - ( fX1 ) * ( x0 - x1) / ( fX0 - fX1 );
        
        //Get Eaprox% and Print
        double Eap = abs( (xn - x1)  / xn ) * 100;
        cout << "Current iteration: " << count << "\t";
        cout << "X new Value: " << xn << "\t";
        cout << "Error Iterativo Porcentual: " << Eap << endl;
        //End Get Eaprox% and print
        
        //Check new X
        if ( abs( f(xn) ) <= EPSILON ) {
            break;
        }
        
        //Changing points
        x0 = x1;
        x1 = xn;
        
        count++;
    } while (true);
    
    finish( x1, count );
    
    return 0;
}

Pruebas y Resultados

PruebaFunciónInputOutputIteraciones
1X2[-2, -1]-3.507X10-732
2X2[-2, 2]INF
3sin(x) + 2x – 1[-2, 5]0.3354187
4sin(x) + 2x – 1[-5, 5]0.3354186
5e-x – x[5, 6]0.5671437
6Sin (x)[4, -1]3.141594
7Sin (x)[4, -0.2]-3.81498x10-75
8Sin (x)[4, -2] INF
9(x – 1)+ 0.512[4, 1]0.2183
10(x – 1)+ 0.512[10, 3]0.215
En la prueba 2, el método falla porque la secante evaluada es paralela al eje x, y por lo tanto, nunca cambia en las posiciones de x en cada iteración. Lo mismo sucede en la prueba 8, en la gráfica de seno, los puntos forman una línea casi horizontal.
La gran cantidad de iteraciones en la prueba 9, es debido a que en la gráfica, en el rango de aproximadamente de -1 a 2, la pendiente es casi 0, por lo que la secante evaluada es casi horizontal pero lo suficientemente inclinada para encontrar un valor de x en la segunda iteración, el cual era de -153, después vuelve a 0.9 y se aleja de nuevo de la raíz.

Conclusiones

El método de la secante, es una variación del método de Newton-Raphson; obtiene algunas desventajas a cambio de hacer la formula principal en algo más sencillo. Esto es debido a que no necesita evaluar la derivada de la función. Sin embargo, los resultados no solamente dependen de qué punto de la función empieza el algoritmo (como en el caso de Newton-Raphson), sino que ahora depende de dos puntos; los cuales, si están muy separados o la línea generada entre los dos puntos es muy cercana a una línea horizontal, provocaría que el algoritmo haga más iteraciones o tenga mayor error en comparación con Newton-Raphson.
A pesar de lo dicho anteriormente, no es posible concluir cuál de los dos métodos es mejor, el error y las iteraciones de cada uno varia con respecto a la función la cual se quiera encontrar su raíz. Desde mi punto de vista, Newton-Raphson es más fácil de usar, dado que solo ocupa un dato de entrada y si utilizas la formula siguiente para sacar la derivada.
f( x + ALMOST_CERO ) – f ( x ) ) / ( ALMOST_CERO ). Para entender mejor su uso, vea el codigo del blog de Newton-Raphson.

No hay comentarios:

Publicar un comentario