无约束优化方法.docx
- 文档编号:27605286
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:8
- 大小:16.41KB
无约束优化方法.docx
《无约束优化方法.docx》由会员分享,可在线阅读,更多相关《无约束优化方法.docx(8页珍藏版)》请在冰豆网上搜索。
无约束优化方法
无约束优化方法---DFP方法
本实验用DFP方法求函数f(x)=(x1-5)2+(x2-6)2的最优解。
一、简述DFP法的基本原理
变尺度的基本思想与梯度法和牛顿法有密切的联系。
观察梯度法和牛顿法的迭代公式x(k+1)=x(k)-a(k)gk
X(k+1)=x(k)–a(k)H(-1,k)gk
由以上得出结论及特点。
梯度法的搜索方向为负梯度,构造简单,只需要计算函数的一阶偏导数,计算工作量小,当迭代点远离最优点时对突破函数的非二次性极为有利,但是当迭代点接近最优点时收敛速度极慢。
牛顿法的搜索方向时-H(-1,k)gk,其牛顿方向需要计算梯度。
海塞矩阵及其逆矩阵,计算工作量大为增加,但它具有二次收敛性,当迭代点接近最优点时收敛速度极快。
为此,从综合上述两种方法各自的优点出发,提出了如下便尺度的基本思想。
将迭代公式写成下面的形式;
X(k+1)=x(k)-a9k0Akgk
式中的Ak是根据需要构造的nxn阶对称矩阵,它是随着迭代点位置的变化而变化的。
若Ak=E,上式为迭代法式,若Ak为目标函数二阶导数矩阵的逆矩阵,则为阻尼牛顿法迭代式。
变尺度法是牛顿法的修正算法,它不用计算二阶导数矩阵及其逆矩阵,而是构造一个矩阵Ak代替海塞矩阵的逆矩阵,当迭代点逼近最优点时,迭代方向就趋于牛顿方向。
根据这一思想所建立的式子就是基本迭代式。
式中的-Akgk是变尺度法所规定的基本搜索方向。
S(k)=-Akgk
称为你牛顿方向。
变尺度法中的n阶构造矩阵Ak可以看成是搜索过程中的一种尺度矩阵,它从一次迭代到另一次迭代是变化的,起到改变矩阵尺度的作用,这就是把拟牛顿法称作变尺度法的由来。
二、DFP法的程序
#include"stdafx.h"
#include"stdlib.h"
#include"math.h"
#include"stdio.h"
#definesqr(x)((x)*(x))
#defineMAXN10
doublexkk[MAXN],xk[MAXN],sk[MAXN];
intN,type,nt,et;
doublerk;
doublefunt(double*x,double*g,double*h)
{
g[0]=x[0];g[1]=x[1]-1;g[2]=11-x[0]-x[1];
returnsqr(x[0]-8)+sqr(x[1]-8);
}
doubleF(double*x)
{
return4*pow(x[0]-5,2.0)+pow(x[1]-6,2.0);
}
//一维搜索和无约束优化的桥函数
doublef(doublex)
{
inti;
for(i=0;i returnF(xkk); } doubleDF(double*x,double*df) { df[0]=8*(x[0]-5);df[1]=2*(x[1]-6); return(sqrt(df[0]*df[0]+df[1]*df[1])); } voidfind_ab(doublex0,doubleh0,double*a,double*b) { doubleh,x1,y1,x2,y2,x3,y3; h=h0; x1=x0;y1=f(x1); x2=x1+h;y2=f(x2); if(y2>=y1){ h=-h0;x3=x1;y3=y1; x1=x2;y1=y2;x2=x3;y2=y3; } for(;;){ h*=2.0;x3=x2+h;y3=f(x3); if(y2 x1=x2;y1=y2;x2=x3;y2=y3; } if(h>0){*a=x1;*b=x3;} else{*a=x3;*b=x1;} } voidsearch_gold(doublea,doubleb,doublee,double*x,double*y) { doublex1,x2,y1,y2; x1=a+0.382*(b-a);y1=f(x1); x2=a+0.618*(b-a);y2=f(x2); do{ if(y1 b=x2;x2=x1;y2=y1; x1=a+0.382*(b-a);y1=f(x1); }else{ a=x1;x1=x2;y1=y2; x2=a+0.618*(b-a);y2=f(x2); } }while(b-a>e); *x=0.5*(a+b);*y=f(*x); } //计算Ak+1 voidcomputer_A(doubleA[][MAXN],double*cc,double*yy) { doubleB[MAXN][MAXN],C[MAXN][MAXN],D[MAXN][MAXN],E[MAXN][MAXN]; doublea,b,c;inti,j,k; for(i=0;i for(i=0;i for(i=0;i E[i][j]=0;for(k=0;k } for(i=0;i C[i][j]=0;for(k=0;k } a=0;for(i=0;i b=0; for(i=0;i c=0; for(j=0;j b+=c*yy[i]; } for(i=0;i } //无约束优化--DFP方法 doublenc_dfp(double*x0,doublee1,doublee2) { inti,j,k; doublea,b,ax,ay,d; doubleA[MAXN][MAXN],gk[MAXN],g0[MAXN],cc[MAXN],yy[MAXN]; d=DF(x0,g0); if(d<=e1)returnF(x0); for(;;){ for(i=0;i for(i=0;i for(k=0;k for(j=0;j sk[j]=0; for(i=0;i } find_ab(0,1,&a,&b); search_gold(a,b,e2,&ax,&ay); printf("==%lf==",ax); for(j=0;j d=DF(xk,gk); for(j=0;j printf("d=%lf\n",d); if(d<=e1){ for(i=0;i returnF(x0); } for(i=0;i computer_A(A,cc,yy); for(i=0;i } } } intmain(intargc,char*argv[]) { doublefk,fkk,ck,d1,d2,e1,e2; doubleg[MAXN],h[MAXN],x1[MAXN],x0[MAXN]; inti; /**********根据不同的问题给下列变量赋值***********/ N=2; nt=3; et=0; type=1; e1=0.0001; e2=0.0001; rk=0.001;ck=2; x0[0]=8;x0[1]=8; printf("=========\n"); fk=nc_dfp(x0,0.01,0.001); for(i=0;i printf("rk=%lf\n",rk); for(i=0;i printf("%lf\n",fk); for(;;){ rk*=ck; fkk=nc_dfp(x0,0.01,0.005); printf("rk=%lf\n",rk); for(i=0;i printf("%lf\n",fkk); d1=0;for(i=0;i d1=sqrt(d1); d2=fabs((fkk-fk)/fk); printf("d1=%lfd2=%lf\n",d1,d2); if(d1<=e1||d2<=e2)break; for(i=0;i fk=fkk; } fk=funt(x0,g,h); printf("**********************\n"); for(i=0;i printf("F*=%lf\n",fk); for(i=0;i return1; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 无约束 优化 方法