比较二分法,黄金分割法,斐波拉契数列法求解区间的不同
#include <stdio.h>
#include <math.h>
const double eps = 1e-4; //定义精度
double i,j,sum;
double f(double x) //定义函数
{
return 2*x-cos(x);
}
void binary(double m,double n)//二分法
{
int c;
if(f(m)*f(n)<0)
{
for(c=1;fabs(m-n)>eps;c++)
{
i=(m+n)/2.0;
sum=f(i);
printf("第%d次区间[%lf %lf]\n",c,m,n);
if(fabs(sum)<eps)
break;
else if(f(i)*f(m)<0)
{
n=i; //修正区间,将[m,n]换成[m,i],这里的i是中点
}
else if(f(i)*f(n)<0)
{
m=i;//修正区间,将[m,n]换成[i,n],这里的i是中点
}
}
}
printf("%lf %lf",m,n);
j=(m+n)/2;
printf("\n用二分法求得该方程组的近似根为:x*=%lf\n",j);
}
void golden(double m,double n)//黄金分割法
{
int c;
if(f(m)*f(n)<0)
{
for(c=1;fabs(m-n)>eps;c++)
{
i=m+0.618*(n-m);
sum=f(i);
printf("第%d次区间[%lf %lf]\n", c,m,n);
if(fabs(sum)<eps)
break;
else if(f(i)*f(m)<0)
{
n=i; //修正区间,将[m,n]换成[m,i],这里的i是中点
}
else if(f(i)*f(n)<0)
{
m=i;//修正区间,将[m,n]换成[i,n],这里的i是中点
}
}
}
printf("%lf %lf",m,n);
j=(m+n)/2;
printf("\n用黄金分割法求得该方程组的近似根为:x*=%lf\n",j);
}
double F(int c)//斐波拉契数列
{ if(c==1) return 1;
else if(c==2) return 1;
else
return F(c-1)+F(c-2);
}
int fibonacci(double m,double n)//斐波拉契法
{ int c;//定义次数
if(f(m)*f(n)<0)
{
for(c=1;fabs(m-n)>eps;c++)
{
i=m+F(c+1)/F(c+2)*(n-m);
sum=f(i);
printf("第%d次区间[%lf %lf]\n",c,m,n);
if(fabs(sum)<eps)
break;
else if(f(i)*f(m)<0)
{
n=i; //修正区间,将[m,n]换成[m,i],这里的i是中点
}
else if(f(i)*f(n)<0)
{
m=i;//修正区间,将[m,n]换成[i,n],这里的i是中点
}
}
}
printf("%lf %lf",m,n);
j=(m+n)/2;
printf("\n用黄金分割法求得该方程组的近似根为:x*=%lf\n",j);
}
int main()
{
double m,n;
double m1,n1;//m,n的备份
int shu;
printf("\n请输入求根区间[m,n](不需要,):");
scanf("%lf%lf",&m,&n);
m1=m;n1=n;
do{
printf("\n二分法输入1,黄金分割法输入2,斐波拉契法输入3,结束操作输入0\n");
scanf("%d",&shu);
switch(shu)
{
case 1:binary(m1,n1);break;
case 2:golden(m1,n1); break;
case 3:fibonacci(m1,n1);break;
case 0:printf("结束操作!\n"); break;
default:printf("错误输入!请重新输入!\n");break;
}
}while(shu!=0);
}
代码中函数为2*x-cos(x),可改
输入的求根区间
采用二分法
采用黄金分割法
采用斐波拉契数列