MÉTODO DE LA FALSA POSICIÓN

 El método de la falsa posición pretende conjugar la seguridad del método de la bisección con la rapidez del método de la secante. Este método, como en el método de la bisección, parte de dos puntos que rodean a la raíz f(x) = 0, es decir, dos puntos x0 y x1tales que f(x0)f(x1) < 0. La siguiente aproximación, x2, se calcula como la intersección con el eje X de la recta que une ambos puntos.



 La asignación del nuevo intervalo de búsqueda se realiza como en el método de la bisección: entre ambos intervalos, [x0,x2] y [x2,x1], se toma aquel que cumpla f(x)f(x2) < 0






Experiencia :

La experiencia actual con el método de falsa posición es el cual el uso de las graficas  y tablas, Se maneja de mejor manera que la de bisección y considerable mente es un tanto mas segura por la formulación que se utiliza en los campos de la función establecida para establecer un numero de tolerancia y interacciones adecuadas al calculo y el manejo de datos.

Porque se incluyo en la presentación:

Se incluyo en la presentación porque es uno de mis métodos favoritos me gusta mucho como muestra los resultados de manera mas especifica segunda la función establecida dependiendo del os intervalos seleccionados se encuentra el calculo adecuado para una traficación.  


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

Código C++ 

#include <iostream>

#include <iomanip> // setprecision

#include <cmath> // fabs

#define PRECISION 10

#define INTERVALOS 10

using namespace std;

void tabula(double a, double b);

double f(double x);

int main()

{

    cout << setprecision(PRECISION);

    cout << "\nCalculo de las raices de una funcion aplicando el metodo de la falsa posicion\n";

    cout << "\nIngrese el intervalo inicial [a,b]:" << endl;

    double a, b, tolerancia;

    cout << "\na = ";

    cin >> a;

    cout << "b = ";

    cin >> b;

    tabula(a, b);

    cout << "\nEscoja el intervalo adecuado" << endl;

    cout << "\na = ";

    cin >> a;

    cout << "b = ";

    cin >> b;

    double xr; // La solución aproximada

    double xa = 0; // Solución anterior

        cout << "Tolerancia = ";

        cin >> tolerancia;

        cout << "\na\tb\tx\tf(a)\t\tf(b)\t\tf(x)\n" << endl;

        do {

            xr = b - f(b) * ((b - a) / (f(b) - f(a))); 

            cout << a << "\t" << b << "\t" << xr << "\t" << f(a) << "\t" << f(b) << "\t" << f(xr) << endl;

            // if (fabs(f(xr)) <= tolerancia) {

            if (fabs(xr - xa) / fabs(xr) <= tolerancia) {

                cout << "\n\nPara una tolerancia de " << tolerancia << " la raiz de f es: " << xr << endl;

                break;

            } else {

                xa = xr; // Se guarda el valor de la aproximación anterior

                if (f(xr) * f(a) > 0) {

                    a = xr;

                } else if (f(xr) * f(b) > 0) {

                    b = xr;

                }

            }

        } while (1);

    cin.get();

    cin.get();

    return 0;

}

void tabula(double a, double b)

{

    int puntos = INTERVALOS + 1;

    double ancho = (b - a) / INTERVALOS;

    cout << "\n\tx\tf(x) " << endl;

    for (int i = 0; i < puntos; i++) {

        cout << "\t" << a << "\t" << f(a) << endl;

        a = a + ancho;

    }

}

double f(double x)

{ 

    return exp(x*4)+5*exp(x*3)-8*exp(x*2)-19*exp(x*1)+16;

}


Código en Matlab

clear;

clc;

disp('f(x)=x^3 - 2x^2 - 5 = 0');

disp('p0= 2 p1= 3 tol= 10^-15 it= 100');

disp(' | i | p0 | p1 | q0 | q1 | p | f(p) |

|(p-p1)/p| | e<tol |');

v = 2;

p0 = 2;

p1 = 3;

tol = 10^-15;

v1="v";

f1="f";

q0=p0^3-2*p0^2-5;

q1=p1^3-2*p1^2-5;

for i=2:100

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

fp=p.^3-2.*p.^2-5;

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

if (e<tol)

tab=[v p0 p1 q0 q1 p fp e v1];

disp(tab);

break;

end

tab=[v p0 p1 q0 q1 p fp e f1];

disp(tab);

x=fp.*q1;

if x<0

p0=p1;

q0=q1;

end

p1=p;

q1=fp;

v=v+1;

end

disp('f(x)=x - cos(x) = 0');

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

disp(' | i | p0 | p1 | q0 | q1 | p | f(p) |

|(p-p1)/p| | e<tol |');

v = 2;

p0 = 0;

p1 = 1;

tol = 10^-15;

v1="v";

f1="f";

q0=p0-cos(p0);

q1=p1-cos(p1);

for i=2:100

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

fp=p-cos(p);

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

if (e<tol)

tab=[v p0 p1 q0 q1 p fp e v1];

disp(tab);

break;

end

tab=[v p0 p1 q0 q1 p fp e f1];

disp(tab);

x=fp.*q1;

if x<0

p0=p1;

q0=q1;

end

p1=p;

q1=fp;

v=v+1;

end

disp('f(x)=x^3 + 3x^2 - 1 = 0');

disp('p0= -3 p1= -2.5 tol= 10^-15 it= 100');

disp(' | i | p0 | p1 | q0 | q1 | p | f(p) |

|(p-p1)/p| | e<tol |');

v = 2;

p0 = -3;

p1 = -2.5;

tol = 10^-15;

v1="v";

f1="f";

q0=p0^3+3*p0^2-1;

q1=p1^3+3*p1^2-1;

for i=2:100

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

fp=p.^3+3.*p.^2-1;

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

if (e<tol)

tab=[v p0 p1 q0 q1 p fp e v1];

disp(tab);

break;

end

tab=[v p0 p1 q0 q1 p fp e f1];

disp(tab);

x=fp.*q1;

if x<0

p0=p1;

q0=q1;

end

p1=p;

q1=fp;

v=v+1;

end

disp('f(x)=x^3 + 3x^2 - 1 = 0');

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

disp(' | i | p0 | p1 | q0 | q1 | p | f(p) |

|(p-p1)/p| | e<tol |');

v = 2;

p0 = -1;

p1 = -0.5;

tol = 10^-15;

v1="v";

f1="f";

q0=p0^3+3*p0^2-1;

q1=p1^3+3*p1^2-1;

for i=2:100

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

fp=p.^3-2.*p.^2-5;

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

if (e<tol)

tab=[v p0 p1 q0 q1 p fp e v1];

disp(tab);

break;

end

tab=[v p0 p1 q0 q1 p fp e f1];

disp(tab);

x=fp.*q1;

if x<0

p0=p1;

q0=q1;

end

p1=p;

q1=fp;

v=v+1;

end

disp('f(x)=x^3 + 3x^2 - 1 = 0');

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

disp(' | i | p0 | p1 | q0 | q1 | p | f(p) |

|(p-p1)/p| | e<tol |');

v = 2;

p0 = 0.5;

p1 = 1;

tol = 10^-15;

v1="v";

f1="f";

q0=p0^3+3*p0^2-1;

q1=p1^3+3*p1^2-1;

for i=2:100

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

fp=p.^3+3.*p.^2-1;

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

if (e<tol)

tab=[v p0 p1 q0 q1 p fp e v1];

disp(tab);

break;

end

tab=[v p0 p1 q0 q1 p fp e f1];

disp(tab);

x=fp.*q1;

if x<0

p0=p1;

q0=q1;

end

p1=p;

q1=fp;

v=v+1;

end

disp('f(x)=x - 0.8 - 0.2 * sen(x) = 0');

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

disp(' | i | p0 | p1 | q0 | q1 | p | f(p) |

|(p-p1)/p| | e<tol |');

v = 2;

p0 = 0.5;

p1 = 1;

tol = 10^-15;

v1="v";

f1="f";

q0=p0-0.8-0.2*sin(p0);

q1=p1-0.8-0.2*sin(p1);

for i=2:100

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

fp=p-0.8-0.2.*sin(p);

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

if (e<tol)

tab=[v p0 p1 q0 q1 p fp e v1];

disp(tab);

break;

end

tab=[v p0 p1 q0 q1 p fp e f1];

disp(tab);

x=fp.*q1;

if x<0

p0=p1;

q0=q1;

end

p1=p;

q1=fp;

v=v+1;

end

Ejemplos:

C++

1.


2.


3.

ejemplo matlab
1.


2.


3.




Ventajas sobre otros métodos:

1.Es un método que combina el   método de Bisección y el método de La Secante.

2.El método de Bisección tiene el inconveniente de que al dividir el intervalo de a a b en

mitades iguales, no se toman en consideración las magnitudes de f(a) y f(b) en cambio el método de falsa posición se asegura de calcular bien esas areas .

Desventajas sobre otros métodos:  

1.Aunque es más rápido que el método de bisección, sigue siendo un método de lenta convergencia.

2.A pesar de que generalmente regla falsa funciona mejor que el método de bisección, hay casos en los que regla falsa arroja más errores que bisección y es mejor no utilizarla.


Origen del Método: 

El método de falsa posición utilizado para resolver ecuaciones lineales se remonta a los primeros documentos matemáticos que se conocen. Así, en el papiro de Rhind (1650 a. C.),donde la regla citada era el método utilizado para resolver problemas, hasta textos del siglo XIX (Tratado Elemental de Matemáticas de J. M.Vallejo) en el cual ya es considerado como un método eficaz  de aproximación numérica de ecuaciones (no necesariamente lineales)


Enlaces con mas información respecto al tema  

1: https://redined.mecd.gob.es/xmlui/bitstream/handle/11162/14229/055-061.pdf?sequence=1&isAllowed=y#:~:text=El%20m%C3%A9todo%20de%20falsa%20posici%C3%B3n,recurriendo%20a%20este%20procedi%2D%20mientoii.

2.http://illuminatus.bizhat.com/metodos/falsaposicion.htm



No hay comentarios.:

Publicar un comentario