Hey there, first time posting. I have a program that is kinda put together from a program to generate polynomials and evaluate them and a program to do bisection to solve for the root.
It may be a mess. The problem is, i believe, when I try to use the evalPoly in the bisection function and it gives a DOMAIN error, and sometimes just doesn't do anything (pauses when executed).
Any insight would be helpful.
#include<iostream>
#include<cmath>
#include <math.h>
#define FALSE 0
#define TRUE 1
using namespace std;
typedef short Boolean;
class Polynomial {
private:
int n;
float *coeff;
public:
zeroPoly();
void ReadPoly();
void PrintPoly();
double EvalPoly(double x);
};
zeroPoly(){
return 0;
}
//ReadPoly -- read and store the contents of a polynomial along with its degree.
void Polynomial::ReadPoly(){
Boolean b;
int i;
// Enter the degree of the polynomial
// See if the degree is postive integer
b = FALSE;
while (!b){
cout << "What is the degree of your polynomial? ";
cin >> n;
if (n < 0){
cout << "Only positve integer values for the degree!"<<endl<<endl;
}
else{
b = TRUE;
}
}
// Allocate memory for the coeff array
coeff = new float[n+1];
// Enter the coefficients of the polynomial
for (i = n; i >= 0; i--){
cout << "Enter the coefficient for the degree " << i << " term: ";
cin >> coeff[i];
}
}
// Print out the Polynomial
void Polynomial::PrintPoly(){
int i;
cout << "f(x) =";
for (i = n; i >= 0; i--){
cout << " + " << coeff[i] << "x^" << i;
}
cout <<endl<<endl;
}
double Polynomial::EvalPoly(double x){
double temp;
int j;
double sum = 0;
for(j=0; j<=n; j++){
temp = (pow(x, j)*(coeff[j]));
sum = sum + temp;
}
return sum;
}
double bisect1(double xL, double xR, double accuracy, double maxiter){
int i;
double c;
Polynomial poly;
if(xL*xR < 0){
for(i=0; i<maxiter; i++){
c=(xL + xR)/2.0;
if(fabs((poly.EvalPoly(c)) < accuracy )){
break; //break if solution becomes close to the convergence point(root)
}
if((poly.EvalPoly(xL))*(poly.EvalPoly(c))<0.0){
xR = c;
}
else xL = c;
}
}
return c;
}
int main(void){
double xL, xR, root1, accuracy, maxiter;
Polynomial poly;
poly.ReadPoly();
cout<<"Enter 2 bracketing values : "<<endl; //define the two starting points
cout<<"xL : ";
cin>>xL;
cout<<"xR : ";
cin>>xR;
cout<<"Enter the accuracy : ";
cin>>accuracy;
cout<<"Enter the maximum iteration value : ";
cin>>maxiter;
cout<<endl;
root1 = bisect1(xL, xR, accuracy, maxiter);
if(xL*xR<0){
if(fabs(poly.EvalPoly(root1)) > accuracy ){
cout<<"ERROR: Could not compute root of X^2 - 4 within accuracy."<<endl<<endl<<endl;
}
else{
cout<<"The root for X^2 - 4 is : "<<root1<<endl<<endl;
}
}
else{
cout << "ERROR: Improper interval, try again!" <<endl<<endl;
}
return 0;
}