對函數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),可改

輸入的求根區間
輸入的採用二分法
在這裏插入圖片描述採用黃金分割法
在這裏插入圖片描述採用斐波拉契數列
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章