工程优化目标函数的几种极值求解方法c++编程
更新时间:2024-04-23 23:05:01 阅读量: 综合文库 文档下载
- kmeans优化目标函数推荐度:
- 相关推荐
目标函数极值求解的几种方法
题目:分别用最速下降法,牛顿法,共轭梯度法,拟牛顿法求函数
f?(x1?1)?5(x2?5)?(x3?1)?5(x4?5)2222的最小值,初始点自拟。
一维搜索法:
迭代下降算法大都具有一个共同点,这就是得到点x?k?后需要按某种规则确定一个方向d?k?,再从x?k?出发,沿方向d?k?在直线(或射线)上求目标函数的极小点,从而得到x?k?的后继点x?k?1?,重复以上做法,直至求得问题的解,这里所谓求目标函数在直线上的极小点,称为一维搜索。
一维搜索的方法很多,归纳起来大体可以分为两类,一类是试探法:采用这类方法,需要按某种方式找试探点,通过一系列的试探点来确定极小点。另一类是函数逼近法或插值法:这类方法是用某种较简单的曲线逼近本来的函数曲线,通过求逼近函数的极小点来估计目标函数的极小点。这里采用的是第一类试探法中的黄金分割法。实现过程如下:
⑴ 置初始区间[a1,b1]及精度要求L>0,计算试探点?1和?1,计算函数值
f??1?和f??1?,计算公式是:?1?a1?0.382?b1?a1?,?1?a1?0.618?b1?a1?。令
k=1。
⑵ 若
bk?ak?Lf??k?则停止计算。否则,当f??K?>时,转步骤⑶;当
f??K??f??k?时,转步骤⑷ 。
⑶ 置数值
f??k?1?ak?1??k,
bk?1?bk,
?k?1??k,
?k?1?ak?1?0.618?bk?1?ak?1?,计算函
,转⑸。
ak?1?ak ⑷ 置函数值
f??k?1?,
bk?1??k,
?k?1??k,
?k?1?ak?1?0.382?bk?1?ak?1?,计算
,转⑸。
最速下降法
实现原理描述:在求目标函数极小值问题时,总希望从一点出发,选择一个目
标函数值下降最快的方向,以利于尽快达到极小点,正是基于这样一种愿望提出的最速下降法,并且经过一系列理论推导研究可知,负梯度方向为最速下降方向。
最速下降法的迭代公式是x?k?1??x?k???kd?k?,其中d?k?是从x?k?出发的搜索方向,这里取在点x?k?处最速下降方向,即d?k????f?xk?。?k是从x?k?出发沿方向d?k?进行的一维搜索步长,满足f?x?k???kd?k???minf?x?k???d?k??。
??0实现步骤如下:
⑴ 给定初点x?1??Rn ,允许误差??0,置k=1。
⑵ 计算搜索方向d?k????f?xk?, 若d?k???,则停止计算;否则,从x?k?出发,沿方向d?k?进行的一维搜索,求?k,使f?x?k???kd?k???minf?x?k???d?k??。
??0 ⑶ x?k?1??x?k???kd?k?,置k=k+1返回步骤 ⑵。
牛顿法
牛顿法迭代公式:x?k?1??x?k???kd?k?,d?k?是在点x?k?处的牛顿方向,
d?k????f?x2?k???1?f?x?k??,?k是从x?k?出发沿牛顿方向d?k?进行搜索的最优步长。
⑴ 给定初点x?1??Rn ,允许误差??0,置k=1。
⑵ 计算g?k???f?xk?, 若g?k???,则停止计算;否则,转⑶。 ⑶ 计算d?k????2f?x?k??gk,从x?k?出发,沿方向d?k?进行的一维搜索,
?1求?k,使f?x?k???kd?k???minf?x?k???d?k??,x?k?1??x?k???kd?k?,置k=k+1返回
??0步骤 ⑵。
共轭梯度法
若d?1?,d?2?,?,d?k?是Rn中k个方向,它们两两关于A共轭,即满足
d?i?TAd?j??0,i?j;i,j?1,?,k,称这组方向为A的k个共轭方向。共轭梯度法的
基本思想是把共轭性与最速下降法相结合,利用已知点处的梯度构造一组共轭方
向,并沿这组方向进行搜索,求出目标函数的极小点,根据共轭方向的基本性质这种方法具有二次终止性。
实现步骤如下:
⑴ 给定初点x?1??Rn ,允许误差??0; ⑵ 若?f(x1)??,则停止计算;否则,转⑶; ⑶ 置d?1????f?x?1??,k=1。
⑷ 作一维搜索,求?k,满足f?x?k???kd?k???minf?x?k???d?k??;
??0⑸ 令x?k?1??x?k???kd?k?,求g?k?1???f?x?k?1??。 ⑹ 若g?k?1???,则停止计算;否则,转⑺; ⑺ 若k=n,则令x?1??x?n?1?,转⑶;否则,转8);
gx⑻ 令d?k?1???g(k?1)??kd?k?,其中?k???k?1??k??22gx??,置k=k+1,转⑷。
程序
#include
#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;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(f1 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,arph,g[N],p[N]; eps=0.000001; sum=0; for(i=0;i } i=0; while(sqrt(sum)>eps&&i sum=0; arph=HJFC(x,p,xi,ba,n); for(i=0;i sum=sum+p[i]*p[i]; { x[i]=x[i]+arph*p[i]; g[i]=2*xi[i]*(x[i]-ba[i]); p[i]=-g[i]; sum=sum+p[i]*p[i]; } printf(\第%d次迭代:\\n\\n\ printf(\步长lambda=%f\\n\ for(i=0;i printf(\ printf(\ k++; } printf(\最后结果为:\\n\ for(i=0;i } void gonge(double x[],double xi[],double ba[],int n) { int k=1,i; double sum1,sum2,eps,bita,arph,g[N],p[N]; eps=0.000001; sum1=0; for(i=0;i g[i]=2*xi[i]*(x[i]-ba[i]); sum1+=g[i]*g[i]; } while((sqrt(sum1)>eps)&&(k if(k==1) { for(i=0;i bita=0; } else { bita=sum1/sum2; for(i=0;i p[i]=-g[i]+bita*p[i]; } arph=HJFC(x,p,xi,ba,n); sum1=0; sum2=0; for(i=0;i g[i]=2*xi[i]*(x[i]-ba[i]); sum1+=g[i]*g[i]; sum2+=g[n+i]*g[n+i]; } printf(\第%d次迭代:\\n\\n\ printf(\步长lambda=%f\\t\ printf(\ for(i=0;i } printf(\最后结果为:\\n\ for(i=0;i void niudun(double x[],double xi[],double ba[],int n) { int k=1,i,j; double sum,eps,arph,g[N],p[N],h[N][N]; eps=0.000001; sum=0; for(i=0;i printf(\过程\\n\\n\ while((sqrt(sum)>eps)&&(k for(j=0;j if(i==j) h[i][j]=-1/(2*xi[i]); printf(\ else h[i][j]=0; for(i=0;i for(j=0;j p[i]=p[i]+h[i][j]*g[j]; arph=HJFC(x,p,xi,ba,n); sum=0; for(i=0;i { g[i]=2*xi[i]*(x[i]-ba[i]); sum+=g[i]*g[i]; x[i]=x[i]+arph*p[i]; } printf(\第%d次迭代:\\n\\n\ printf(\步长lambda=%f\\n\ for(i=0;i } printf(\最后结果为:\\n\ for(i=0;i void main() { int i,n; double x[N],xi[N],ba[N]; printf(\请输入函数的元数:\ scanf(\ printf(\请输入函数的系数:\ for(i=0;i scanf(\ printf(\请输入ba[i]的值:\ for(i=0;i scanf(\ printf(\请输入初始值:\\n\ for(i=0;i scanf(\ /* printf(\最速下降法迭代过程:\\n\ zuisu(x,xi,ba,n);*/ /* printf(\牛顿法迭代过程:\\n\ niudun(x,xi,ba,n);*/ printf(\共轭梯度法迭代过程:\\n\ } gonge(x,xi,ba,n); printf(\
正在阅读:
2019年整理三字惯用语集锦03-14
2019年中考英语冠词考题汇集03-09
中秋节拜月的风俗故事介绍11-20
2019年自动化灌溉设计方案 - 图文02-29
翻译作业03-08
奥鹏西工大16春《市场营销学》平时作业03-08
论崇高03-29
如何做一名合格的共产党员02-19
我国互联网金融发展存在的问题及对策建议03-26
- 《江苏省环境水质(地表水)自动监测预警系统运行管理办法(试行)》
- 安乐死合法化辩论赛立论稿(浙大新生赛)
- 公共科目模拟试卷公务员考试资料
- 我国固定资产投资FAI对GDP的影响
- 大学生创新创业训练计划项目申请书大创项目申报表
- 完美版—单片机控制步进电机
- 2013资阳中考化学试题
- 18.两位数减一位数退位(397道)
- 工程量计算规则
- 二年级操行评语(下)
- 第3章 流程控制语句
- 浅基桥墩加固技术
- 课题研究的主要方法
- 5100软件说明书 - 图文
- 车间技术员年终总结
- 关于印发《中铁建工集团开展项目管理实验室活动方案》的通知
- 经典诵读结题报告
- 地下水动力学习题答案
- 2018年全国各地高考数学模拟试题平面解析几何试题汇编(含答案解
- 街道办事处主任2018年度述职述廉报告
- 极值
- c++
- 求解
- 函数
- 优化
- 目标
- 编程
- 方法
- 工程
- 山东电厂GIS三维可视化管理平台(地下管线信息管理系统)介绍-济
- 工会业务知识竞赛试题
- 苏教版四年级语文苏教上册4语苏教第2单元单元测试卷B卷
- 1~3年级小学篮球C操的编排方法
- 公交车乘务员管理制度
- 罗马书讲义大纲
- 论文开题报告样式 - 图文
- 超高纯电子特气管道系统的真正含义 - 图文
- 凤庆县教育局文件 - 图文
- 作文素材 中考一轮复习2019年作文热点素材汇总:16年末人物盘点-
- 心电图基本知识常见心律失常的处理
- 《乘法分配律》教学设计
- 语文病句专题训练
- 2016年文明校园创建活动实施方案
- 结合科学发展观谈地税如何开展纪检监察工作-精选模板
- 实习实务训练指引(DOC)
- 《教育学》考试简答题汇总
- 优秀少先队员自我介绍
- 东财 经济法B 在线作业 答案全
- 2018年部编版小学一年级语文上册第二单元教案