miércoles, 13 de junio de 2012

METODO DE NEWTON-RAPHSON

 METODO DE NEWTON-RAPHSON

El método de Newton-Raphson es un método iterativo que nos permite aproximar la solución de una ecuación del tipo f(x) = 0.
Partimos de una estimación inicial de la solución x0 y construimos unas ucesión de aproximaciones de forma recurrente mediante la fórmula
Por ejemplo, consideremos la ecuación

.
En este caso es imposible despejar la incógnita, no obstante, si representamos las curvas ,
en el intervalo x ∈ [0, 4], es evidente que la
ecuación tiene una solución en este intervalo.



Para aplicar el método de Newton-Raphson, seguimos los siguientes pasos:

1. Expresamos la ecuación en la forma f(x) = 0, e identificamos la función f. En el ejemplo es
 2. Calculamos la derivada
3. Construimos la fórmula de recurrencia
 
4. Tomamos una estimación inicial de la solución. En este caso podemos tomar por ejemplo x0 = 1.0, y calculamos las siguientes aproximaciones.Desde el punto de vista práctico, si deseamos aproximar la
solución con 6 decimales, podemos detener los cálculos cuando dos aproximaciones consecutivas coincidan hasta el decimal 8. En nuestro caso, obtendríamos
 
5. Podemos, entonces, tomar como solución



 EJEMPLO DEL PROGRAMA EN DEV C++

 #include <iostream>
    #include <cstdlib>
    #include <cmath>
    #include <iomanip>
  
    using namespace std;

    float funcion(float x);
    float funcion1(float x1);
    float calculos(float xi, float val, float xa, int iter);

    int main()
{

    float xi, val, xa=100, raiz;
    int iter;
    cout<<"\t\t\tMETODO DE NEWTON-RAPHSON\n"<<endl;
    cout<<"PARA LA FUNCION: (e^-x)-x\n\n"<<endl;
    cout<<"Introduce xi: ";
    cin>>xi;
    cout<<"Introduce x verdadero: ";
    cin>>val;
    cout<<"Introduce numero de iteraciones: ";
    cin>>iter;
    cout<<endl;
    cout<<"\tXi+1"<<"\t\t\tEv"<<"\t\t\tEa"<<endl;
    raiz=calculos(xi,val,xa,iter);
    cout<<endl;
    cout<<"\nLa raiz es: "<<raiz<<"\n"<<endl;
    system("pause");

    return 0;
}

    float funcion(float x)
{
    return (exp(-x)-x);
}
    float funcion1(float x1)
{
    return (-exp(-x1)-1);
}

    float calculos(float xi, float val, float xa, int iter)
{
    float xr=xi, ev, ea;
    int num=0;
    do
    {
      cout<<endl;
      if(num!=0)
      {
      xr=xr-(funcion(xr))/(funcion1(xr));
      ea=fabs((xr-xa)/xr)*100;
      }
      ev=(fabs((val-xr)/val)*100);
      cout<<num<<"\t"<<fixed<<setprecision(8)<<xr<<"\t\t"<<ev<<"%"<<"\t\t"<<ea<<"%"<<endl;
      num++;
      xa=xr;
    }
    while((fabs(xr)!=val)&&(num<=iter));
    return xr;
}













miércoles, 2 de mayo de 2012

METODO PUNTO FIJO


                                                PUNTO FIJO

Un punto fijo de una función G, es un número P tal que G(P)=P. El problema de encontrar las soluciones de una ecuación  f(x)=0 y el de encontrar los puntos fijos de una función h(z) son equivalentes en el siguiente sentido: dado el problema de encontar las soluciones de una ecuación f(x)=0 , podemos definir una función G con un punto fijo P de muchas formas; por ejemplo, f(x)= x - G(x). En forma inversa, si la función G tiene un punto fijo en P , entonces la función definida por  f(x)= x - G(x) posee un cero en P. 


 
En conclusión el método de punto fijo requiere:
  1. un punto inicial.
  2. de la ecuación, se pone en función de si misma, y el valor obtenido se vuelve a sustituir hasta que cumpla la condición. 
 ejemplo del metodo por medio de programa en dev c++


 #include <iostream>
    #include <cstdlib>
    #include <cmath>
    #include <iomanip>
  
    using namespace std;

    float calculos(float xi, float val, float xa, float iter);

    int main()
{
  
    float xi, val, xa=100, raiz;
    int iter;
    cout<<"\t\t\tMETODO DE ITERACION DE PUNTO FIJO\n"<<endl;
    cout<<"PARA LA FUNCION: (e^-x)-x\n\n"<<endl;
    cout<<"Introduce xi: ";
    cin>>xi;
    cout<<"Introduce x verdadero: ";
    cin>>val;
    cout<<"Introduce numero de iteraciones: ";
    cin>>iter;
    cout<<endl;
    cout<<"\tXi+1"<<"\t\t\tEv"<<"\t\t\tEa"<<endl;
    raiz=calculos(xi,val,xa,iter);
    cout<<endl;
    cout<<"\nLa raiz es: "<<raiz<<"\n"<<endl;
    system("pause");

    return 0;
}

    float calculos(float xi, float val, float xa, float iter)
{
    float xr=xi, ev, ea;
    int num=0;
    do
    {
      cout<<endl;
      if(num!=0)
      {
      xr=exp(-xr);
      ea=fabs((xr-xa)/xr)*100;
      }
      ev=fabs((val-xr)/val)*100;
      cout<<num<<"\t"<<fixed<<setprecision(8)<<xr<<"\t\t"<<ev<<"%"<<"\t\t"<<ea<<"%"<<endl;
      num++;
      xa=xr;
    }
    while((fabs(xr)!=val)&&(num<=iter));
    return xr;
}