当前位置:文档之家› 常用无约束最优化方法(一)

常用无约束最优化方法(一)

项目三 常用无约束最优化方法(一)
[实验目的]
编写最速下降法、Newton 法(修正Newton 法)的程序。

[实验学时]
2学时
[实验准备]
1.掌握最速下降法的思想及迭代步骤。

2.掌握Newton 法的思想及迭代步骤;
3.掌握修正Newton 法的思想及迭代步骤。

[实验内容及步骤]
编程解决以下问题:【选作一个】
1.用最速下降法求
22120min ()25[22]0.01T f X x x X ε=+==,,,.
2.用Newton 法求
22121212min ()60104f X x x x x x x =--++-,
初始点
0[00]0.01T X ε==,,.
最速下降法
Matlab 程序:
clc;clear;
syms x1 x2;
X=[x1,x2];
fx=X(1)^2+X(2)^2-4*X(1)-6*X(2)+17;
fxd1=[diff(fx,x1) diff(fx,x2)];
x=[2 3];
g=0;
e=0.0005;
a=1;
fan=subs(fxd1,[x1 x2],[x(1) x(2)]);
g=0;
for i=1:length(fan)
g=g+fan(i)^2;
end
g=sqrt(g);
step=0;
while g>e
step=step+1;
dk=-fan;
%点x(k)处的搜索步长
ak=((2*x(1)-4)*dk(1)+(2*x(2)-6)*dk(2))/(dk(1)*dk(2)-2*dk(1)^2-2*dk(2)^2);
xu=x+ak*dk;
x=xu;
%输出结果
optim_fx=subs(fx,[x1 x2],[x(1) x(2)]);
fprintf(' x=[ %d %d ] optim_fx=%d\n',x(1),x(2),optim_fx);
%计算目标函数点x(k+1)处一阶导数值
fan=subs(fxd1,[x1 x2],[x(1) x(2)]);
g=0;
for i=1:length(fan)
g=g+fan(i)^2;
end
g=sqrt(g);
end
%输出结果
optim_fx=subs(fx,[x1 x2],[x(1) x(2)]);
fprintf('\n最速下降法\n结果:\n x=[ %d %d ] optim_fx=%d\n',x(1),x(2),optim_fx); c++程序
#include<stdio.h>
#include<iostream.h>
#include<iomanip.h>
#include<math.h>
float goldena(float x[2],float p[2])
{float a;
a=-1*(x[0]*p[0]+4*x[1]*p[1])/(p[0]*p[0]+4*p[1]*p[1]);
return a;
}
void main()
{float a=0,x[2],p[2],g[2]={0,0},e=0.001,t;
int i=0;
x[0]=1.0;
x[1]=1.0;
p[0]=2*x[0];
p[1]=8*x[1];
g[0]=-p[0];
g[1]=-p[1];
printf("\n\n");
while(sqrt(g[0]*g[0]+g[1]*g[1])>e&&i<=100)
{
i=i+1;
a=goldena(x,g);
x[0]=x[0]+a*g[0];
x[1]=x[1]+a*g[1];
p[0]=2*x[0];
p[1]=8*x[1];
g[0]=-p[0];
g[1]=-p[1];
t=float(sqrt(g[0]*g[0]+g[1]*g[1]));
printf("第%d次t=%f x1=%f\tx2=%f\ta=%f\n",i,sqrt(g[0]*g[0]+g[1]*g[1]),x[0],x[1],a);
}
printf("\n最优解为:x1=%f,x2=%f\n最优值为y=%f\n",x[0],x[1],x[0]*x[0]+4*x[1]*x[1]); }。

相关主题