#include <stdio.h>
#include <math.h>
#include <float.h>
double EPS;
double MAX_IT=1000;
double K=10000000;
typedef struct inter{
double a;
double a_val;
double b;
double b_val;
double len;
} interval;
double f_02(double x) {
return (cos(x)-exp(-((x*x)/2))+x-1);
}
double f_02_it(double x) {
return (-cos(x)+exp(-((x*x)/2))+1);
}
double f_09(double x){
return x*x-log(1+x)-3;
}
double f_09_it(double x){
return sqrt(log(1+x)+3);
}
double f_10(double x){
return 2*x*sin(x)-cos(x);
}
double f_10_it(double x){
return asin(sqrt(1/(4*x*x+1)));
}
interval divide(interval i,double (*func)(double)){
double c=(i.a+i.b)/2;
double c_val=(*func)(c);
if (c_val==0){
i.a=i.b=c;
i.a_val=i.b_val=c_val;
i.len=0;
return i;
}
if(c_val*i.a_val>0){
i.a=c;
i.a_val=c_val;
i.len=fabs(i.b-i.a);
}
else if(c_val*i.b_val>0){
i.b=c;
i.b_val=c_val;
i.len=fabs(i.b-i.a);
}
return i;
}
double dichotomy(double a, double b, double (*func)(double),int &it){
double x;
it=0;
interval i,i_old;
i.a=a;
i.a_val=(*func)(a);
i.b=b;
i.b_val=(*func)(b);
i.len=fabs(i.b-i.a);
do{
i_old=i;
i= divide(i,func);
it++;
}while(i.len>EPS && fabs(i.len-i_old.len)>EPS && it<MAX_IT);
if(i.len==0){
return i.a;
}
else{
x=(i.a+i.b)/2;
}
return x;
}
double iteration(double a, double b, double (*func_it)(double), double (*func)(double), int &it){
it=0;
double x=(a+b)/2;
double x0=x;
do{
x0=x;
x=(func_it)(x0);
it++;
}while(fabs(x-x0)>EPS && (func)(x)!=0 && it<MAX_IT);
return x;
}
double derivation(double (*func)(double), double x){
return (func(x+EPS)-func(x))/EPS;
}
double newton(double a, double b, double (*func)(double), int &it){
double x=(a+b)/2;
double x0=x;
it=0;
do{
x0=x;
x=x0 - (func)(x0)/derivation(func,x0);
it++;
}while(fabs(x-x0)>EPS && it<MAX_IT && func(x)!=0);
return x;
}
void print_methods(double a, double b, double (*func)(double),double (*func_it)(double),
char *str, char *str_func, char *str_func_it){
int it=0;
double x=0;
printf ("=====================================================================\n %s\n",str);
printf (" Function 1: %s\n",str_func);
printf (" Function 2: %s\n",str_func_it);
printf (" Interval: [%f,%f]\n\n",a,b);
printf ("--------------+-----------------+----------------+-------------------\n");
printf (" Method | Root | Value | Iterations\n");
printf ("--------------+-----------------+----------------+-------------------\n");
x=dichotomy(a,b,func,it);
printf (" Dichotomy | % 1.12f | % e | %4i\n",x,(func)(x),it);
printf ("--------------+-----------------+----------------+-------------------\n");
x=iteration(a,b,func_it, func, it);
printf (" Iteration | % 1.12f | % e | %4i\n",x,(func)(x),it);
printf ("--------------+-----------------+----------------+-------------------\n");
x=newton(a,b,func,it);
printf (" Newton | % 1.12f | % e | %4i\n",x,(func)(x),it);
printf ("--------------+-----------------+----------------+-------------------\n");
printf ("=====================================================================\n\n");
}
int main(){
EPS=DBL_EPSILON*K;
printf (" DBL_EPSILON: %e\n",DBL_EPSILON);
printf (" Epsilon: %2.3f*DBL_EPSILON\n",K);
print_methods(1,2,f_02,f_02_it,"Variant 2","","");
print_methods(2,3,f_09,f_09_it,"Variant 9","x*x-log(1+x)-3","sqrt(log(1+x)+3)");
print_methods(0.4,1,f_10,f_10_it,"Variant 10","2*x*sin(x)-cos(x)","asin(sqrt(1/(4*x*x+1)))");
scanf(" ");
}