- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
工程优化目标函数的几种极值求解方法c编程
目标函数极值求解的几种方法
题目:分别用最速下降法,牛顿法,共轭梯度法,拟牛顿法求函数的最小值,初始点自拟。
一维搜索法:
迭代下降算法大都具有一个共同点,这就是得到点后需要按某种规则确定一个方向,再从出发,沿方向在直线(或射线)上求目标函数的极小点,从而得到的后继点,重复以上做法,直至求得问题的解,这里所谓求目标函数在直线上的极小点,称为一维搜索。
一维搜索的方法很多,归纳起来大体可以分为两类,一类是试探法:采用这类方法,需要按某种方式找试探点,通过一系列的试探点来确定极小点。另一类是函数逼近法或插值法:这类方法是用某种较简单的曲线逼近本来的函数曲线,通过求逼近函数的极小点来估计目标函数的极小点。这里采用的是第一类试探法中的黄金分割法。实现过程如下:
⑴ 置初始区间[]及精度要求L0,计算试探点和,计算函数值和,计算公式是:,。令k=1。
⑵ 若则停止计算。否则,当时,转步骤⑶;当时,转步骤⑷ 。
⑶ 置,,,,计算函数值,转⑸。
⑷ 置,,,,计算函数值,转⑸。
最速下降法
实现原理描述:在求目标函数极小值问题时,总希望从一点出发,选择一个目标函数值下降最快的方向,以利于尽快达到极小点,正是基于这样一种愿望提出的最速下降法,并且经过一系列理论推导研究可知,负梯度方向为最速下降方向。
最速下降法的迭代公式是,其中是从出发的搜索方向,这里取在点处最速下降方向,即。是从出发沿方向进行的一维搜索步长,满足。
实现步骤如下:
⑴ 给定初点 ,允许误差,置k=1。
⑵ 计算搜索方向, 若,则停止计算;否则,从出发,沿方向进行的一维搜索,求,使。
⑶ ,置k=k+1返回步骤 ⑵。
牛顿法
牛顿法迭代公式:,是在点处的牛顿方向,,是从出发沿牛顿方向进行搜索的最优步长。
⑴ 给定初点 ,允许误差,置k=1。
⑵ 计算, 若,则停止计算;否则,转⑶。
⑶ 计算,从出发,沿方向进行的一维搜索,求,使,,置k=k+1返回步骤 ⑵。
共轭梯度法
若是中k个方向,它们两两关于A共轭,即满足 ,称这组方向为A的k个共轭方向。共轭梯度法的基本思想是把共轭性与最速下降法相结合,利用已知点处的梯度构造一组共轭方向,并沿这组方向进行搜索,求出目标函数的极小点,根据共轭方向的基本性质这种方法具有二次终止性。
实现步骤如下:
⑴ 给定初点 ,允许误差;
⑵ 若,则停止计算;否则,转⑶;
⑶ 置,k=1。
⑷ 作一维搜索,求,满足;
⑸ 令,求。
⑹ 若,则停止计算;否则,转⑺;
⑺ 若k=n,则令,转⑶;否则,转8);
⑻ 令,其中,置k=k+1,转⑷。
程序
#includestdio.h
#includemath.h
#includeiostream.h
#define N 100
double F(double x[],double p[],double xi[],double ba[],int n,double t)
{
double f=0;
int i;
for(i=0;in;i++)
f=f+xi[i]*(x[i]+t*p[i]-ba[i])*(x[i]+t*p[i]-ba[i]);
return f;
}
double HJFC(double x[],double p[],double xi[],double ba[],int n)
{
double a=0,b=10,x1,x2,f1,f2,e=0.0001,y;
x2=a+0.618*(b-a);
f2=F(x,p,xi,ba,n,x2);
x1=a+0.382*(b-a);
f1=F(x,p,xi,ba,n,x1);
while(fabs(b-a)e)
{
if(f1f2)
{
b=x2;x2=x1;f2=f1;
x1=a+0.382*(b-a);
f1=F(x,p,xi,ba,n,x1);
}
else if(f1==f2)
{
a=x1;b=x2;
x2=a+0.618*(b-a);
f2=F(x,p,xi,ba,n,x2);
x1=a+0.382*(b-a);
f1=F(x,p,xi,ba,n,x1);
}
else
{
a=x1;x1=x2;f1=f2;
x2=a+0.618*(b-a);
f2=F(x,p,xi,ba,n,x2);
}
}
y=0.5*(b+a);
return y;
}
void zuisu(double x[],double xi[],double ba[],int n)
{
int i,k=1;
double sum,eps
原创力文档


文档评论(0)