Anda di halaman 1dari 3

/*

IPN
Programa Biseccion
Objetivo: encntrar la raiz de una funcion con biseccion
fecha de entrega 08/09/15
*/
using namespace std;
#include <iostream>
#include <cmath>
struct Bise
{
double IntMen; //Intervalo Menor = Xa
double fxa; // Valor de Xa evaludo en la funcion
double IntMay; //Intervalo Mayor = Xb
double fxb; // Valor de Xb evaludo en la funcion
double Emin; // Error minimo
double Xm; // Punto Medio
double fxm; // Valor de Punto Medio evaluado en la funcion
};
void SolicitIntervalo(Bise *AptA); // Solicita Xa, Xb, Error minimo y calcula Fx
a, Fxb
void BiseccionInicial(Bise *AptA); // Valida que de inicia sea una grafica valid
a para la biseccion
void EvaluarPunOpues(Bise *AptA); //Compara en que sector Xa-Xm * Xm-Xb se proce
de con la biseecion
double Funcion(double I); //Evalua los distintos puntos en la funcion dada
void CalMedia(Bise *AptA); // Calcula el punto medio
void Imprimir(Bise *A);
int main(void)
{
system("cls");
Bise A;
Bise *AptA;
AptA = &A;
double C=0;
int It=0;
SolicitIntervalo(AptA);
BiseccionInicial(AptA);
cout<<endl;
Imprimir(AptA);
cout<<endl;
cout << "fxa: "<< AptA->fxa << endl;
cout << "fxb: "<< AptA->fxb << endl;
cout << "Biseccion procede" << endl << endl;

do

{ It++;
CalMedia(AptA);
AptA->fxm = Funcion(AptA->Xm);
cout << endl;
EvaluarPunOpues(AptA);
C=AptA->fxm;
if(C < 0 )
{
C = AptA->fxm *-1;
}
cout << endl << endl;
cout<<"Nemuero de iteraciones: "<<It<<endl;
Imprimir(AptA);
}
while(C >(AptA->Emin) );
{
cout << endl << endl;
cout << "Biseccion Final" << endl;
CalMedia(AptA);
AptA->fxm = Funcion(AptA->Xm);

}
system("pause");
return 0;
}
void SolicitIntervalo(Bise *AptA)
{
cout << "Ingresa intervalo menor: ";
cin >> AptA->IntMen;
cout << "Ingresa intervalo Mayor: ";
cin >> AptA->IntMay;
cout << "Ingresa Error Minimo: ";
cin >> AptA->Emin;
AptA->fxa = Funcion(AptA->IntMen);
AptA->fxb = Funcion(AptA->IntMay);
cout << endl;
}
void BiseccionInicial(Bise *AptA)
{
if((AptA->fxa * AptA->fxb) > 0)
{
cout << "No procede Biseccion: ";

Imprimir(AptA);
system("Pause");
exit(-1);
}
}
void EvaluarPunOpues(Bise *AptA)
{
if (AptA->fxa * AptA->fxm < 0)
{
AptA->IntMay = AptA->Xm;
AptA->fxb = Funcion(AptA->IntMay);
}
else //if (AptA->fxb*AptA->fxm < 0)
{
AptA->IntMen = AptA->Xm;
AptA->fxa = Funcion(AptA->IntMen);
}
}
double Funcion(double I)
{
//return ((pow(I,3))-(pow(I,2))-9*I+9);
return ((pow(I,3))-(pow(I,2))-9*I+9);
}
void CalMedia(Bise *AptA)
{
AptA->Xm = (AptA->IntMen + AptA->IntMay) / 2;
}
void Imprimir(Bise *A)
{
//cout.precision(2);
cout << "Xa: " << A->IntMen << endl;
cout << "Xb: " << A->IntMay << endl;
cout << "Xm: " << A->Xm
<< endl;
cout << "fxa: "<< A->fxa << endl;
cout << "fxb: "<< A->fxb << endl;
cout << "la raiz es : "<< A->fxm << endl;
}