Академический Документы
Профессиональный Документы
Культура Документы
INSTITUTO
POLITÉCNICO
NACIONAL
ESCUELA SUPERIOR DE INGENIERÍA
MECÁNICA Y ELÉCTRICA
UNIDAD CULHUACÁN
Introducción
El método de la bisección o corte binario es un método de búsqueda incremental que
divide el intervalo siempre en 2. Si la función cambia de signo sobre un intervalo, se
evalúa el valor de la función en el punto medio. La posición de la raíz se determina
situándola en el punto medio del sub-intervalo donde exista cambio de signo. El proceso
se repite hasta mejorar la aproximación.
Paso 1
Elegir los valores iniciales Xa y Xb, de tal forma de que la función cambie de signo:
f(Xa)f(Xb) < 0
Paso 2
La primera aproximación a la raíz se determina con la fórmula del punto medio de esta
forma:
Paso 3
Si f(Xa)f(Xb) < 0, entonces la solución o raíz está entre Xa y Xpm, y Xb pasa a ser el punto
medio (Xpm).
Si f(Xa)f(Xb) > 0, entonces la solución o raíz está fuera del intervalo entre Xa y el punto
medio, y Xa pasa a ser el punto medio (Xpm).
Santiago Ventura Héctor Alonso 4EM14
Bisección Sucesiva
El siguiente programa tendrá un menú donde posteriormente se le irán agregando más
métodos de raíces, pero inicializaremos con Bisección sucesiva.
Código fuente:
int main (void)
{
int opc,opc2;
do{
cout<<"\t:::::::ANALISIS NUMERICOS:::::::\n";
cout<<"1. Raices de una Funcion"<<endl;
cout<<"2. Salir"<<endl;
cout<<"Opcion del menu a escoger: ";
cin>>opc;
system("cls");
switch(opc){
case 1: cout<<"1. Raices Por biseccion sucesiva"<<endl;
cout<<"2. Proximamente..."<<endl;
cout<<"Opcion del menu a escoger: ";
cin>>opc2;
switch(opc2){
case 1: RaizB(); // Funcion que contendra todo el desarrollo de
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa la Biseccion sucesiva//
break;
}
}
system("cls");
}while(opc != 2);
}
// El código anterior es la pantalla de muestra que saldrá al principio del programa //
Una vez ya estando dentro del método se pedirán los valores de la función a la que se le
desea calcular su raíz.
cout << " \n LOS VALORES DE LA FUNCION EN (Xa,Xb) SON LOS SIGUIENTES :";
printf ( "\n\n F(%.2f) = %lf F(%.2lf) = %f",xa,ya,xb,yb);
if(ya == 0.0 || fabs(ya)<= epsi)
{
cout << "\n\n *** EL EXTREMO DEL INTERVALO xa ES UNA RAIZ **** ";
nraiz ++;
goto fin;
}
if (yb== 0.0 || fabs( yb)<= epsi)
{
cout <<"\n *** EL EXTREMO DEL INTERVALO xb ES UNA RAIZ ****";
nraiz++;
goto fin;
}
if((ya*yb)> 0.0)
{
cout << "\n EL INTERVALO NO CONTIENE UNA RAIZ O CONTIENE PARES DE
RAICES";
cout << "\n PROPONGA OTRO INTERVALO ";
goto fin;
}
// salida positiva de la prueba, inicia proceso iterativo de busqueda
while( fabs(ya)>epsi )
{
system ("pause");
xm= ( xa + xb )/2.; iter++;
ym = bis.funcion(xm,m,a ); cout.setf(ios::fixed);
cout << " \n iteracion: " << iter << " XM= " << xm;
cout << " F(xm)= " << setprecision(10)<< ym <<endl;
if (ym==0 )
Santiago Ventura Héctor Alonso 4EM14
{
cout << "\n *** EL PUNTO X = " << xm << " ES UNA RAIZ EXACTA " ;
cout << "\n SE ENCONTRO EN " << iter << " ITERACIONES ";
nraiz ++;
goto fin;
}
if( fabs(ym)<= epsi)
{
cout <<" \n\n EL PUNTO X= " << xm ;
cout.setf(ios::fixed);
cout << " ES UNA RAIZ APROXIMADA F(X)= " <<setprecision(10)<< ym;
cout <<" \n SE ENCONTRO EN " << iter << " ITERACIONES ";
nraiz++;
goto fin;
}
if ((ya*ym)<0)
{ // en este medio intervalo se encuentra la raiz(xa,xm)
yb=ym;
xb=xm;
}
else
{
ya=ym;
xa=xm;
}
}
fin:
cout << "\n DESEA CONTINUAR BUSCANDO RAICES ??";
si = getch();
if(si =='s' || si =='S')
{
cout << "\n PROPONGA OTRO INTERVALO QUE EXCLUYA A LA X DE LA RAIZ
ENCONTRADA";
iter=0;
system ("cls");
}
} // fin del while principal
printf("\n TOTAL DE RAICES ENCONTRADAS = %2d",nraiz);
return 0;
} // fin de la funcion principal
double BISECCION::funcion ( float x,int m,float a[])
{
double yx,xp;
int i;
yx= a[0];
for( i=1 ; i<=m; i++)
{
Santiago Ventura Héctor Alonso 4EM14
xp = pow(x,i);
yx = yx + a[i] * xp;
}
return yx;
}
El código anterior es el que realiza todo el método solo que esta dentro de una función();
ya que al momento de colocarlo en un switch es más cómodo trabajarlo con una función
en lugar de ingresar todo el código dentro del switch, además de que es más complicado y
se puede perder en el código.
Santiago Ventura Héctor Alonso 4EM14
Durante esta prueba de ingreso del polinomio x3-2x2+5x-10, con un valor de precisión de
0.1 en los intervalos Xa= -5 y Xb= 5.
Realizo operación por operación hasta llegar a la iteración final donde mostraba que
punto era una raíz aproximada del polinomio.
Esta es una prueba con un polinomio que se realizó en clase y que ya se ha comprobado
que se terminaba hasta la iteración 8, por lo que podemos ver en la captura de pantalla
que el programa funciona de manera correcta.
El final del programa pregunta si queremos buscar más raíces de otro polinomio,
ingresando “s” decimos que sí y ahora lo ejecutamos con otro ejemplo.
Santiago Ventura Héctor Alonso 4EM14
Durante esta prueba de ingreso del polinomio 3x3+2x2+2x-10, con un valor de precisión
de 0.1 en los intervalos Xa= -2 y Xb= 2.
Realizo operación por operación hasta llegar a la iteración final donde mostraba que
punto era una raíz aproximada del polinomio.
Conclusión
El método de Bisección Sucesiva puede ser tan bueno dependiendo el margen de error
que se proponga y a su vez se puede alargar dependiendo del intervalo que de igual
manera se propone, es decir si se propone una margen muy reducido será más exacto el
punto donde se encuentra la raíz y si se colocan unos intervalos muy alejados los
procedimiento para llegar a la raíz serán muchos más que si se colocaran cerca de la raíz
de la función y por ultimo todo esto ocurrirá si la raíz se encuentra dentro del intervalo de
no ser asi no se podrá llegar a la raíz con intervalos afuera.