Bisection method:
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "iostream.h"
int fn[20];
int n;
double a,b,x0;
double fnval;
float abso(float x)
{
if (x<0) return -x;else return x;
}
double power(double a,int b)
{
int i;
double c=1;
for (i=0;i<=b;i++)
c=c*a;
return c;
}
void getfunction()
{
int i;
printf("Enter the degree of the function: ");
cin >> n;
printf("\nStart entering the coefficients\n\n");
for (i=n;i>=0;i--)
{
printf("Enter coefiicient of degree %d: ",i);
cin >> fn[i];
}
}
void displayfunction()
{
int i;
printf("\nCurrent function is:\n ");
for (i=n;i>-1;i--)
{
if (i==0) printf("%d",fn[i]);
else printf("%dx^%d + ",fn[i],i);
}
}
float getaccuracy()
{
float no;
printf("\nEnter the accuracy required: ");
cin >> no;
return no;
}
double fx(double x)
{
int i;
double ans=0;
for (i=n;i>-1;i--)
{
ans=ans+fn[i]*power(x,i);
}
return ans;
}
void getinitialvals()
{
float curr=0,prev=0;
static float left=-100;
for (int i=left;i<=100;i++)
{
curr=fx(i);
a=i-1;b=i;
if (curr==0)
{
left=i+1;
printf("\nroot is %f",b);
getinitialvals();
}
if (i==99)
{
printf("\n\nThe equation has no further real roots");
exit(1);
}
if (curr*prev<0)
{
left=i;
break;
}
prev=curr;
}
}
void checkinivals()
{
if(fx(a)>fx(b))
{
double temp=a;
a=b;
b=temp;
}
}
int main()
{
int i=0,itr=0;
int j=1;
clrscr();
getfunction();
float accu=getaccuracy();
displayfunction();
do
{
i=0;
getinitialvals();
checkinivals();
cout << "\n\nInitial values are "<< a<< " and " << b << "\n";
do
{
x0=(a+b)/2;
fnval=fx(x0);
printf("%d%15f%15f%15f%15f%15f\n",i+1,a,b,x0,fnval,b-a);
if (fnval<0) a=x0; else b=x0;
i++;
} while (abso(b-a)>accu);
printf("\n\nThe root of the equation is %f in %d iterations",x0,i);
printf("\nPress any key to search for more roots");
getch();
} while(1);
}
No comments:
Post a Comment