Вы находитесь на странице: 1из 10

2018

INSTITUTO
POLITÉCNICO
NACIONAL
ESCUELA SUPERIOR DE INGENIERÍA
MECÁNICA Y ELÉCTRICA
UNIDAD CULHUACÁN

INGENIERÍA EN COMUNICACIONES Y ELECTRÓNICA

SANTIAGO VENTURA HÉCTOR ALONSO


2014111326
GRUPO: 4EM14

PROGRAMA BISECCIÓN SUCESIVA


ANÁLISIS NUMÉRICO

PROFESOR: MONROY OSTRIA IGNACIO


Santiago Ventura Héctor Alonso 4EM14

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

Realizar las siguientes evaluaciones para determinar el intervalo de la raíz:

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 //

En la imagen se muestra como se desplegaría el primer menú donde podemos seleccionar


de momento 2 opciones: 1) Entrar en la opción de raíces de una función y 2) Salir del
programa.
Santiago Ventura Héctor Alonso 4EM14

Como nosotros realizaremos la prueba con raíces ingresamos el #1 como se muestra en la


imagen anterior y se aprieta “enter” para continuar.

Posteriormente como se visualiza saldrá un submenú donde la única opción disponible de


momento es bisección sucesiva así que la seleccionamos como en el anterior menú.

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.

Código fuente del método de bisección:


#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <iostream>
#include <iomanip>
#include <stdlib.h>
using namespace std;
class BISECCION
{
public:
double funcion ( float x,int m,float a[]);
} bis;
float RaizB(); // Se declara una function de tipo flotante para que se logren realizar los
returns, esta function contendra el metodo de biseccion //
float RaizB(){ // Inicio del metodo de Biseccion Sucesiva //
int i,m,nraiz,iter=0;
char si;
float a[8];
double epsi;
float xa,xb, xm;
double ya,yb,ym;
nraiz =0; si= 's';
system ("CLS");
// DETERMINACION DEL GRADO DE LA FUNCION Y DE LOS COEFICIENTES
cout <<"\n CUAL ES EL MAXIMO GRADO DE LA FUNCION "; cin >> m;
cout <<"\n INDICA EL VALOR DE PRECISION (EPSILON)"; cin >> epsi;
cout <<"\n PROPORCIONA LOS COEFICIENTES DE LA FUNCION F(X) \n";
Santiago Ventura Héctor Alonso 4EM14

for( i=m; i>=0 ; i-- )


{
cout <<" A(" <<i<< ") = ";
cin >>a[i];
}
// PRUEBA DE LA FUNCION EN EL INTERVALO PROPUESTO COMO ARRANQUE DEL
METODO
while (si == 's'|| si =='S' ) // while principal
{
cout <<"\n INDICA UN INTERVALO (Xa,Xb) "<<endl;
cout << " xa= "; cin >>xa ;
cout <<endl<< " xb= " ; cin >> xb;
cout << "\n PRUEBA DE EXISTENCIA DE RAICES EN EL INTERVALO("
<<xa<< "," << xb <<")"<<endl;
// PRUEBA EN LOS EXTREMOS Xa y Xb
ya= bis.funcion(xa,m,a);
yb= bis.funcion(xb,m,a);

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

A continuación se mostrara una imagen del funcionamiento del programa en la parte ya


del método de bisección.

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.

La comprobación se hizo en el cuaderno como un ejercicio de tarea donde de igual forma


la raíz aproximada se calculó hasta la iteración 8 y como se observa en la captura de
pantalla de igual forma la raíz se detuvo en la iteración 8 con el mismo valor del punto X,
también de esta forma se comprueba el correcto funcionamiento del programa.
Santiago Ventura Héctor Alonso 4EM14

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.

Вам также может понравиться