对函数2*x-cos(x)应用二分法,黄金分割法,斐波拉契法求根

比较二分法,黄金分割法,斐波拉契数列法求解区间的不同

#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),可改

输入的求根区间
输入的采用二分法
在这里插入图片描述采用黄金分割法
在这里插入图片描述采用斐波拉契数列
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值