⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zouyaoxian.txt

📁 黄金分割法
💻 TXT
字号:

#include<stdio.h>
#include<math.h>
#define AF 0.618033988
float *p;
float f(float x)
   {
    float y;
    y=p[0]*x*x*x*x*x+p[1]*x*x*x*x+p[2]*x*x*x+p[3]*x*x+p[4]*x+p[5];
    return y;
   }
float daoshu(float x)  /*对函数求一阶导数*/
   {
      float y;
      y=(f(x+x*10e-6)-f(x))/(x*10e-6);
      return y;
    }
float daoshu2(float x)/*对函数求二阶导数*/

   {
     float y;
     y=20*p[0]*x*x*x+12*p[1]*x*x+6*p[2]*x+2*p[3];
     return y;
   }
float fun1(float a,float b,float e)   /*利用二分法*/
    {
      float x;
      int n=1;      /*n用于统计循环次数*/
      x=(a+b)/2;
      while(fabs(daoshu(x))>e)
     {
       if(daoshu(x)<0)
         a=x;
        else if(daoshu(x)>0)
         b=x;
	if(fabs(b-a))
         x=(a+b)/2;
         n++;
     }
     printf("%d\n",n);
     return x;
     }
float fun2(float a,float b,float e)  /* 利用黄金分割法求*/
     {
      float x,y,fai1,fai2;
      int n=1;     /*n用于统计循环次数*/
      x=a+(1-AF)*(b-a);
      y=a+AF*(b-a) ;
      fai1=f(x) ;
      fai1=f(y);
      while(fabs(b-a)>e)
      {
        if(fai1<=fai2)
          {
        b=y; y=x; fai2=fai1; x=a+b-y; fai1=f(x);
          }
         else
          {
        a=x; x=y; fai1=fai2; y=a+b-x; fai2=f(y);
          }
         n++;
       }
    printf("%d\n",n);
    x=(a+b)/2;
    return x;
      }
float fun3(float a,float b,float e)
     {
    float x0=b,x1;
    int n=1;
    x1=x0-daoshu(x0)/daoshu2(x0);
    while(fabs((x1-x0)/x0)>e)
      {
         x0=x1;
         x1=x0-daoshu(x0)/daoshu2(x0);
         n++;
      }
     printf("%d\n",n);
       return x1;
     }
int Fib(int n)
   { int y;
     if(n==0||n==1)
      y=1;
      else
     y=Fib(n-1)+Fib(n-2);
     return y;
   }
float fun4(float a,float b,float e)   /*Fibonacci法*/
    {
      int n,i;
      float t,tp,z;
      n=0;
      while(Fib(n)<1/e)
     n++;
       printf("%d\n",n);
       for(i=n;i>1;i++)
     {
       t=b+Fib(n-1)*(a-b)/Fib(n);
       tp=a+Fib(n-1)*(b-a)/Fib(n);
        if(f(t)<f(tp))
          {
        b=tp;
        tp=t;
        t=b+Fib(n-2)*(a-b)/Fib(n-1);
          }
      if(f(t)>f(tp))
          {
        a=t;
        t=tp;
        t=b+Fib(n-2)*(a-b)/Fib(n-1);
          }
      }
     t=(a+b)/2;
     tp=a+(0.5+e/8)*(b-a);
     if(f(t)<f(tp))
         {
        z=f(t);t=(t+b)/2;
        printf("the min result is:x=%f",t);
        printf("  y=%f\n",z);
         }
       else
         {
        z=f(tp);t=(a+tp)/2;
        printf("the min result is:x=%f",t);
        printf("  y=%f\n",z);
         }
     return t;
     }
main()
   {
     float x,y,z,w,a,b,e;
     int i;
     printf("    please enter six number stand for the number of f(x):\n");
     for(i=0;i<6;i++)
       scanf("%f",&p[i]);
     printf("f(x)=%6.3fx*x*x*x*x+%6.3fx*x*x*x+%6.3fx*x*x+%6.3fx*x+%6.3fx+%6.3f\n",p[0],p[1],p[2],p[3],p[4],p[5]);
     scanf("%f %f %f",&a,&b,&e);
     printf("\n");
     x=fun1(a,b,e);
     printf("the min result is:x=%f   y=%f\n",x,f(x));
     y=fun2(a,b,e);
     printf("the min result is:x=%f   y=%f\n",y,f(y));
     z=fun3(a,b,e);
     printf("the min result is:x=%f   y=%f\n",z,f(z));
     w=fun4(a,b,e);
     getchar();
  }



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -