Wednesday, April 23, 2008

Program Bisection method - Farey addition

# include ;
# include ;
# include ;
# include ;
# include ;
# include ;

# define epx 1e-17 //epx=eps pt F
# define max 1500 //nr max de iteratii

long unsigned int cmmdc(long unsigned int a,long unsigned int b)
{
long unsigned int aux;
while(fmod(a,b))
{
aux=a;
a=b;
b=fmod(aux,a);
}
return b;
}

//-------------------------------------
long double F(long double x) { return x*x-3; }
//-------------------------------------

long double a,a_aux,b_aux,b,dc,mij,epx_aux,val;
long unsigned int ia,ia_aux,ib_aux,ib,v_N[3],v_D[3];
//[0] pt a, [1] pt mij, [2] pt b

int c,opt,pa,pb,pmax; //contor,optiune,puteri

void main()
{
clrscr();
opt=0;

while(opt!=3)
{
clrscr();
cout<<"Alegeti o optiune :\n";
cout<<"\t1. Metoda bisectiei\n";
cout<<"\t2. Metoda bisectiei utilizand insumarea FAREY\n";
cout<<"\t3. Introducere interval\n";
cout<<"\t4. TERMINARE PROGRAM\n";
cin>>opt;
if(opt!=3) cout<<"\a";
}

while(opt<=3)
{
c=1;
if(opt==3)
{
cout<<"Introduceti a,b :\n";

//Conversie la tipul: unsigned long int
char * sa,* sb;
int poz;
gets(sa);
gets(sb);
a=a_aux=_atold(sa);
b=b_aux=_atold(sb);

int i;

//pentru a --------------
poz=0; //-daca nr e intreg
for(i=0;i < strlen(sa);i++)
if(sa[i]=='.') poz=i;
pa=strlen(sa)-poz-1;//exponentul lui a; (puterea lui a)

//pentru b --------------
poz=0; //-daca nr e intreg
for(i=0;i if(sb[i]=='.') poz=i;
pb=strlen(sb)-poz-1;//exponentul lui b; (puterea lui b)

//Calcul putere maxima
if(pa>pb) pmax=pa;
else pmax=pb;
//

ib=b*pow10(pmax);
ia=a*pow10(pmax);

//Afisare de control
cout.precision(12);
cout<<"Am citit datele:\n"<< a <<" "<< b;
cout<<"\nDatele convertite sunt:\n"<< ia <<" "<< ib;
getche();
}

if(opt<=2)
{
a=a_aux;
b=b_aux;

//Initializari
if(opt==1) mij=(a+b)/2;
else if(opt==2)
{
v_N[0]=ia;
v_D[0]=pow10(pmax);
//----------------------
dc=cmmdc(v_N[0],v_D[0]);
cout<<"\n v_*[0]= "< v_N[0]=v_N[0]/dc;
v_D[0]=v_D[0]/dc;
cout<<"Dupa siplif cu "< cout<<"v_*[0]= "< getche();
//----------------------
v_N[2]=ib;
v_D[2]=pow10(pmax);
//----------------------
dc=cmmdc(v_N[2],v_D[2]);
cout<<"\n v_*[2]= "< v_N[2]=v_N[2]/dc;
v_D[2]=v_D[2]/dc;
cout<<"Dupa siplif cu "< cout<<"v_*[2]= "< getche();
//----------------------
v_N[1]=v_N[0]+v_N[2];
v_D[1]=v_D[0]+v_D[2];
//----------------------
dc=cmmdc(v_N[1],v_D[1]);
cout<<"\n v_*[1]= "< v_N[1]=v_N[1]/dc;
v_D[1]=v_D[1]/dc;
cout<<"Dupa siplif cu "< cout<<"v_*[1]= "< getche();
//----------------------
mij=(long double)(v_N[1])/(long double)(v_D[1]);
}

c=0;
epx_aux=epx+1;
val=fabs(F(mij));

while((c < max)&&(val >= epx))
{
epx_aux=fabs(F(mij)/mij);

if(F(a)*F(mij)< 0)
{
if(opt==1) b=mij;
else
{
v_N[2]=v_N[1];
v_D[2]=v_D[1];
//----------------------
dc=cmmdc(v_N[2],v_D[2]);
cout<<"\n v_*[2]= "< v_N[2]=v_N[2]/dc;
v_D[2]=v_D[2]/dc;
cout<<"Dupa siplif cu "< cout<<"v_*[2]= "< getche();
//----------------------
b=(long double)v_N[2]/(long double)v_D[2];
}
}
else if((F(mij)*F(b)< 0)&&(F(a)*F(mij) > 0))
{
if(opt==1) a=mij;
else
{
v_N[0]=v_N[1];
v_D[0]=v_D[1];
//----------------------
dc=cmmdc(v_N[0],v_D[0]);
cout<<"\n v_*[0]= "< v_N[0]=v_N[0]/dc;
v_D[0]=v_D[0]/dc;
cout<<"Dupa siplif cu "< cout<<"v_*[0]= "< getche();
//----------------------
a=(long double)v_N[0]/(long double)v_D[0];
}
}

if(opt==1) mij=(a+b)/2;
else
{
v_N[1]=v_N[0]+v_N[2];
v_D[1]=v_D[0]+v_D[2];
//----------------------
dc=cmmdc(v_N[1],v_D[1]);
cout<<"\n v_*[1]= "< v_N[1]=v_N[1]/dc;
v_D[1]=v_D[1]/dc;
cout<<"Dupa siplif cu "< cout<<"v_*[1]= "< //----------------------
mij=(long double)(v_N[1])/(long double)(v_D[1]);
}

c++;

cout.precision(12);
cout<
if(c>=max) cout<<"\n Nr. de it. ="< if(fabs(F(mij))<=epx) cout<<"\n Criteriu cu epx ="<
cout<<"\n";
cout<<"\nNr. de it. PRG ="<
cout< cout<<"\t1. Metoda bisectiei\n";
cout<<"\t2. Metoda bisectiei utilizand insumarea FAREY\n";
cout<<"\t3. Modificare interval\n";
cout<<"\t4. TERMINARE PROGRAM\n";
cin>>opt;

}

}

No comments: