声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4162|回复: 5

[C/C++] 黄金分割法优化子程序

[复制链接]
发表于 2006-10-11 16:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本程序包含4个C文件
mhjfgf.c
funct.c
jtf.c
hjfgf.c


本程序由heizi友情提供
回复
分享到:

使用道具 举报

 楼主| 发表于 2006-10-11 16:49 | 显示全部楼层
mhjfgf.c代码如下:

  1. #include "hjfgf.c"
  2. main()
  3. {double xx[1],a[1],b[1],ff;
  4. double s[]={1},x0[]={0};
  5. jtf(x0,0.1,s,1,a,b);
  6. ff=gold(a,b,0.00001,1,xx);
  7. printf("\nx[0]=%f,,ff=%f",xx[0],ff);
  8. getch();
  9. }
复制代码
 楼主| 发表于 2006-10-11 16:50 | 显示全部楼层
funct.c代码如下:

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "math.h"
  4. double objf(double x[])
  5. {double ff;
  6. ff=8*pow(x[0],3)-2*x[0]*x[0]-7*x[0]+3;
  7. return(ff);
  8. }
复制代码



jtf.c代码如下:

  1. #include "funct.c"
  2. void jtf(double x0[],double h0,double s[],int n,double a[],double b[])
  3. {int i;
  4. double *x[3],h,f1,f2,f3;
  5. for(i=0;i<3;i++)
  6.   x[i]=(double *)malloc(n*sizeof(double));
  7.   h=h0;
  8. for(i=0;i<n;i++)
  9.   *(x[0]+i)=x0[i];
  10. f1=objf(x[0]);
  11. for(i=0;i<n;i++)
  12.   *(x[1]+i)=*(x[0]+i)+h*s[i];
  13.   f2=objf(x[1]);
  14. if(f2>=f1)
  15.   {h=-h0;
  16.     for(i=0;i<n;i++)
  17.     *(x[2]+i)=*(x[0]+i);
  18.    f3=f1;
  19.     for(i=0;i<n;i++)
  20.     {*(x[0]+i)=*(x[1]+i);
  21.      *(x[1]+i)=*(x[2]+i);
  22.     }
  23.    f1=f2;
  24.    f2=f3;
  25.    }
  26.    for(;;)
  27.    {h=2*h;
  28.      for(i=0;i<n;i++)
  29.      *(x[2]+i)=*(x[1]+i)+h*s[i];
  30.    f3=objf(x[2]);
  31.    if(f2<f3) break;
  32.    else
  33.     { for(i=0;i<n;i++)
  34.        {*(x[0]+i)=*(x[1]+i);
  35.         *(x[1]+i)=*(x[2]+i);
  36.        }
  37.       f1=f2;
  38.       f2=f3;
  39.     }
  40.    }
  41.    if(h<0)
  42.     for(i=0;i<n;i++)
  43.     {a[i]=*(x[2]+i);
  44.      b[i]=*(x[0]+i);
  45.     }
  46.    else
  47.     for(i=0;i<n;i++)
  48.     {a[i]=*(x[0]+i);
  49.      b[i]=*(x[2]+i);
  50.      }
  51.    for(i=0;i<3;i++)
  52.    free(x[i]);
  53. }
复制代码



hjfgf.c代码如下:

  1. #include "jtf.c"
  2. double gold(double a[],double b[],double eps,int n,double xx[])
  3. {int i;
  4. double f1,f2,*x[2],ff,q,w;
  5. for(i=0;i<2;i++)
  6.   x[i]=(double *)malloc(n*sizeof(double));
  7. for(i=0;i<n;i++)
  8.   {*(x[0]+i)=a[i]+0.618*(b[i]-a[i]);
  9.    *(x[1]+i)=a[i]+0.382*(b[i]-a[i]);
  10.   }
  11.   f1=objf(x[0]);
  12.   f2=objf(x[1]);
  13.   do
  14.    {if(f1>f2)
  15.      {for(i=0;i<n;i++)
  16.       {b[i]=*(x[0]+i);
  17.        *(x[0]+i)=*(x[1]+i);
  18.        }
  19.      f1=f2;
  20.      for(i=0;i<n;i++)
  21.       *(x[1]+i)=a[i]+0.382*(b[i]-a[i]);
  22.      f2=objf(x[1]);
  23.      }
  24.     else
  25.      { for(i=0;i<n;i++)
  26.        {a[i]=*(x[1]+i);
  27.        *(x[1]+i)=*(x[0]+i);}
  28.      f2=f1;
  29.     for(i=0;i<n;i++)
  30.      *(x[0]+i)=a[i]+0.618*(b[i]-a[i]);
  31.     f1=objf(x[0]);
  32.      }
  33.   q=0;
  34.   for(i=0;i<n;i++)
  35.    q=q+(b[i]-a[i])*(b[i]-a[i]);
  36.   w=sqrt(q);
  37.   }while(w>eps);
  38.   for(i=0;i<n;i++)
  39.    xx[i]=0.5*(a[i]+b[i]);
  40.   ff=objf(xx);
  41.   for(i=0;i<2;i++)
  42.   free(x[i]);
  43.   return(ff);
  44. }
复制代码
发表于 2009-5-13 22:04 | 显示全部楼层

好帖,感谢,顶

如题:好帖,感谢,顶
发表于 2009-5-28 15:47 | 显示全部楼层
这也行 不错 学习了 谢过
发表于 2011-5-28 12:43 | 显示全部楼层
这个怎么组合啊
我怎出现: fatal error C1083: Cannot open include file: 'hjfgf.c': No such file or directory
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-17 09:46 , Processed in 0.058791 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表