- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
黄金分割法:
公式一
#include stdio.h
#include math.h
#include conio.h
#define e 0.00001 //收敛精度
#define tt 0.01 //一维搜索步长
float function(float x)
{
float y;
y=pow(x,2)-10*x+36;//目标函数
return(y);
}
/******返回目标函数值*************/
void finding(float a[3],float f[3])
{float h=tt,a1,f1,ia;int i;
a[0]=0;//从零开始搜索
f[0]=function(a[0]);
for(i=0;;i++)
{a[1]=a[0]+h;
f[1]=function(a[1]);
if(f[1]f[0]) break;//确定单峰区间右端点
if(fabs(f[1]-f[0])=e)//判断两端点之间精度
{h=-h;a[0]=a[1];f[0]=f[1];}//大于预定精度时,修改步长,反向搜索
else{ if(ia==1) return;
h=h/2;ia=1;}
}//满足精度时,缩短步长
//如果步长缩短后,还不满足,将返回。造成a[2]的值不确定
for(i=0;;i++)
{a[2]=a[1]+h;
f[2]=function(a[2]);
if(f[2]f[1]) break;
h=2*h;//加大步长
a[0]=a[1];f[0]=f[1];
a[1]=a[2];f[1]=f[2];
}//确定另一端点
if(a[0]a[2])
{a1=a[0];f1=f[0];
a[0]=a[2];f[0]=f[2];
a[2]=a1;f[2]=f1;
}//将单峰区间右端点值存入a[2]中,左端点存入a[0]中
return;
}
/*********进退法确定单峰区间********/
float gold(float *ff)
{
float a1[3],f1[3],a[4],f[4];
float aa;
int i;
finding(a1,f1);
a[0]=a1[0];f[0]=f1[0];
a[3]=a1[2];f[3]=f1[2];
a[1]=a[0]+0.382*(a[3]-a[0]);//取点x1
a[2]=a[0]+0.618*(a[3]-a[0]);//取点x2
f[1]=function(a[1]);//求F(x1)
f[2]=function(a[2]);//求F(x2)
for(i=0;;i++)
{
if(f[1]=f[2])
{
a[0]=a[1];f[0]=f[1];
a[1]=a[2];f[1]=f[2];
a[2]=a[0]+0.618*(a[3]-a[0]);
f[2]=function(a[2]);
}//F(x1)F(x2),将x2赋值给x1.另求x2
else
{
a[3]=a[2];f[3]=f[2];
a[2]=a[1];f[2]=f[1];
a[1]=a[0]+0.382*(a[3]-a[0]);
f[1]=function(a[1]);
}
if((a[3]-a[0])e)
{
aa=(a[1]+a[2])/2;
*ff=function(aa);
break;
}//判断两点间的精度。符合,返回单峰区间中间值
}
return(aa);
}
/*********黄金分割算法求最小值**********/
void main()
{
float xx,ff;
xx=gold(ff);
printf(优化结果是:\n);
printf(\n\tx*=%f\n\tf*=%f,xx,ff);
getch();//等待输入
}
公式二
float function(float x)
{
float y;
y=pow(x,4)-5*pow(x,3)+4*pow(x,2)-6*x+60;//目标函数
return(y);
}
/******返回目标函数值*************/
公式三
float function(float x)
{
float y;
y=pow(x-2,2)*(x+1);/
文档评论(0)