#include <stdio.h>
#include <math.h>
#include <stdlib.h>
double f1(double x);
void erfenfa(double a,double b)
{
double root,fa,fb,froot;
int i,act_b;
fa=f1(a);
fb=f1(b);
if(fa*fb>0)
{
printf("方法错误。");
exit(0);
}
for(i=1;i<=50;i++)
{
root=(a+b)/2;
froot=f1(root);
if(froot==0)
{
a=root;
b=root;
}
else if(fb*froot>0)
{
b=root;
fb=froot;
}
else
{
a=root;
fa=froot;
}
if(fabs(b-a)<0.000001)
break;
}
root=(a+b)/2;
froot=f1(root);
act_b=i;
printf("root=%f 次数=%d",root,i);
}
double g(double x)
{
return (pow((x+1),1.0/3.0));
}
void iterate(double a,double b,double x0)
{
int k=1;
double x1;
while(k<=50)
{
x1=g(x0);
if((x1<a)||(x1>b))
{
printf("有错误。");
exit(0);
}
if(fabs(x1-x0)<0.00001)
{
//printf("成功。");
printf("root=%10.6lf ",x1);
break;
}
x0=x1;
k++;
}
printf("次数=%d/n",k);
if(k>50)
printf("方法错误。");
}
double f1(double x)
{
return (x*x*x-x-1);
}
double fdao(double x)
{
return (3*x*x-1);
}
void f(double a,double b)
{
int k=1;
double x,x0=1.5,temp1,tempd;
while(k<=50)
{
temp1=f1(x0);
tempd=fdao(x0);
x=(x0-temp1/tempd);
if(x<a||x>b)
{
printf("请另选值。");
exit(0);
}
if(fabs(x-x0)<0.00001)
{
printf("%lf 次数=%d",x,k);
break;
}
x0=x;
k++;
}
if(k>50)
printf("迭代次数达到上界,不收敛。/n");
}
int main()
{
double a=0,b=2.0;
int maxs=50;
printf("二分法:");
erfenfa(1,2);//二分法
printf("/n");
double a_jd=1.0,b_jd=2.0,x0=(a_jd+b_jd)/2;
printf("简单迭代:");
iterate(a_jd,b_jd,x0);//简单迭代
printf("牛顿迭代:");
f(1,2);//牛顿迭代
printf("/n");
return 0;
}