Titulo.jpg (10742 bytes)
FlechaDer.jpg (2886 bytes) casa.jpg (31539 bytes) FlechaDA.jpg (3959 bytes)

Cáculo de las raices de una función


Existen diversos métodos para realizar el cálculo numérico de las raices de una ecuación.  Veremos el método mitad para ejemplificar el uso de la computación en la busqueda de las raices de una ecuación.  Este método es sencillo de comprender y de mediana rapidez y precisión.  Si queremos aumentar esta última entonces se hace lento.

se basa en el teorema de Bolzano que establece que si una función y=f(x), siendo x una variable real y continua en el intervalo (a, b), y el signo de la función en el extremo a es distinto al signo de la función en el extremo b, existe al menos un valor c dentro de dicho intervalo (a, b) tal que f(c)=0, c siendo por tanto c la raíz que buscamos.

El algoritmo es simple, dividimos el intervalo (a, b), donde queremos encontrar la raíz, a la mitad, entonces se podrán poducir tres alternativas:

f(m)=0 entonces m es la raíz buscada.

Si f(a) y f(m) tienen signos contrarios, la raíz buscada está en (a, m).

Si no se cumple la condición anterior, entonces f(b) y f(m) tendrían signos contrarios y la raíz estaría en el intervalo (m, b).

Nos situamos en el intervalo donde hemos determinado que está la raíz y volvemos a dividirlo a la mitad y hacer las pruebas ya descritas.

De está manera una vez realizada suficientes iteraciones tendremos dos posibilidades:

Encontramos exactamente la solución o nos aproximaos lo suficiente como para que la diferencia de la función en el intervalo sea igual o menor que un Delta prefijado.

Para poder codificar este procedimiento hemos de seguir los pasos siguientes

1.Partimos de un intervalo (a, b) en el que la función f(x) cambia de signo

2.Se calcula m como m=(a+b)/2

3. Se verifica si m es la raíz buscada.

4 Si f(a) y f(m) tienen signos contrarios b toma el valor de m y se reinicia el proceso.

5.Si no se alcanza la condición anterior entonces la raíz se encuentra en el intervalo (m, b), de manera que a tomará el valor m y volveremos a reiniciar.

float Ceros :: Calcula()
{ double x,y,y1;

   x = xi + paso;
   y1 = Funcion(xi);
   y = Funcion(x);
   for ( ;fabs(y) > error;) //aqui fijamos el error para el calculo del cero como la condición de terminación
     {paso /=2;
       if (y1*y>0 )
        {if (xi>x)
          { x-=paso;
             y1 = y;
           }
         else
          { x+=paso;
             y1 = y;
          }
        }
      else
        {if (xi>x)
           {x+=paso;
            }
         else
           {x-=paso;
            }
        }
     y = Funcion(x);
   }
return (x);
}

En la clase incluimos una función abstracta que será la que utilicemos en la clase heredera para incluir la función a la que le queremos calcular el cero, así la clase se definirá como:

class Ceros
{ private :double xi;
    double xf;
    float paso;
    float error;
public: Ceros (double xip,double xfp)
{xi = xip;
  xf = xfp;
  paso = fabs(xfp-xip)/2.0;
  error = 1e-15;
}
float Calcula();
float virtual Funcion (double x)=0;
};

y cuando vamos a trabajar con una función como la del seno tendremos que la clase heredera es:

#include "ceros.h"

class CerosSeno : public Ceros
{ public : CerosSeno(double xip,double xfp) : Ceros (xip,xfp)
{ }
float virtual Funcion(double x)
{ return (sin(x));
}
};

y por último el programa en que utilizaremos las clases será

#include "ceroseno.h"

void main()
{ double x1 = Pi/10.0;
   double xf = Pi+Pi/10.0;
   CerosSeno Seno(x1,xf);
   clrscr();
   printf ("El cero de la funcion esta en: %.4f",Seno.Calcula());
   getch();
}

En el que hemos creado un objeto de la clase CerosSeno que al herederar de la clase Ceros puede utilizar la función Calcula() que nos devolverá la raíz en el intervalo fijado.

arriba.jpg (2978 bytes) casa.jpg (31539 bytes)
Hosted by www.Geocities.ws

1