实验2 最速下降法和共轭梯度法的程序设计
实验2 最速下降法和共轭梯度法的程序设计
一、实验目的
1、熟悉无约束优化问题的最速下降算法和共轭梯度法。
2、培养matlab编程与上机调试能力。
二、实验课时:2个课时
三、实验准备
1、预习无约束优化问题的最速下降算法和共轭梯度法。
2、熟悉matlab软件的基本操作及程序编写。 四、实验内容
课堂实验演示
根据最速下降法编写程序,求函数
22 minf(x),x,2xx,4x,x,3x112212
Tx,1,1的极小值,其中初始点为 ,,0
算法步骤如下:
,,,,1;0kStep1::给出初始点,和精度; x0
,,fx(),Step2:计算,如果,则停止迭代,输出结果;否则转step3; ,fx()kk
fxdfxd()min(),,,,,Step3:令下降方向,计算步长因子使得,dfx,,,(),kkkkkkkk,,0
令,转step2。 xxdkk,,,,,,1kkkk,1
其程序如下:
function [x,iter,val,dval] = Steepest_Descent_Method(x,eps)
k = 1;
dy = grad_obj(x);
x_mat(:,1) = x;%存储每一次迭代得到的点x
while norm(dy)>eps
d = -dy; % 搜索方向
lambda = line_search(x,d);%步长
x = x + d*lambda;
k = k + 1;
x_mat(:,k) = x;
dy = grad_obj(x); end
iter = k - 1;
val = obj(x);%目标函数在极值点处的函数值
dval = grad_obj(x);%目标函数在极值点处的梯度
%--------------------------------------------------------------
x1 = linspace(-1.2,1.2,40);
x2 = linspace(-0.2,1.2,40);
[xx,yy] = meshgrid(x1,x2);
for i = 1:length(x1)
for j = 1:length(x2)
z(i,j) = obj([xx(i,j);yy(i,j)]);
end
end
contour(xx,yy,z,10);%画出目标函数的等高线
hold on
plot(x_mat(1,:),x_mat(2,:),'-o')%画出最速下降法的迭代路径 hold off
function y = obj(x)
%目标函数
y = x(1).^2 - 2*x(1).*x(2) + 4*x(2).^2 + x(1) - 3*x(2);
function dy = grad_obj(x)
%目标函数的梯度
dy = [2*x(1) - 2*x(2) + 1; -2*x(1) + 8*x(2) - 3];
function lambda = line_search(xk,dk) %作线搜索,求步长
%phi(lambda) = obj( xk + lambda*dk ) %d_phi(lambda) = dk'*grad_obj( xk + lambda*dk )
syms eqn lambda
eqn = dk'*grad_obj(xk+lambda*dk); lambda = solve(eqn); %用符号计算命令solve求方程d_phi(\lambda)=0的根 lambda = eval(lambda);%将符号计算的结果转化为数值类型
>> x = [1;1]; eps = 1.0e-6;
>> [x,iter,val,dval] = Steepest_Descent_Method(x,eps) x =[ -0.1667 0.3333]’
val = -0.5833
dval = [0.5280*1.0e-006 -0.1760*1.0e-006]’
iter = 43
共轭梯度法的计算步骤:
,,,,1;0kStep1: 给出初始点,令,精度; d,,,f(x)x000
,,fx(),Step2:计算,如果,则停止迭代,输出结果;否则转step3; ,fx()kk
fxdfxd()min(),,,,,Step3:计算x,x,,d,其中步长因子使得,,kkkkkk,1kkkk,,0
2||,()||fx1k,计算下降方向; 令k,k,1,转step2。 ,,,(),dfxdk1k1k,,2||,()||fxk
其程序如下:
function [x,iter,val,dval] = Conjugate_Gradient_Method(x,eps)
k = 1;
x_mat(:,1) = x;%存储每一次迭代得到的点x
x_old = x;
dy_old = grad_obj(x_old); d_old = -dy_old;
while norm(dy_old)>eps
lambda = line_search(x_old,d_old);%步长
x_new = x_old + lambda*d_old;
dy_new = grad_obj(x_new);
coef = norm(dy_new)/norm(dy_old);
d_new = -dy_new + coef^2*d_old; % 搜索方向
k = k + 1;
x_old = x_new;
dy_old = dy_new;
d_old = d_new;
x_mat(:,k) = x_new;
%防止死循环
if k > 100
break;
end
end
x = x_new;
iter = k - 1;
val = obj(x_new);%目标函数在极值点处的函数值
dval = grad_obj(x_new);%目标函数在极值点处的梯度 %--------------------------------------------------------------
x1 = linspace(-1.2,1.2,40); x2 = linspace(-0.2,1.2,40); [xx,yy] = meshgrid(x1,x2); for i = 1:length(x1)
for j = 1:length(x2)
z(i,j) = obj([xx(i,j);yy(i,j)]);
end
end
contour(xx,yy,z,10);%画出目标函数的等高线
hold on
plot(x_mat(1,:),x_mat(2,:),'-o')%画出最速下降法的迭代路径 hold off
function y = obj(x)
%目标函数
y = x(1)^2 - 2*x(1)*x(2) + 4*x(2)^2 + x(1) - 3*x(2);
function dy = grad_obj(x)
%目标函数的梯度
dy = [2*x(1) - 2*x(2) + 1; -2*x(1) + 8*x(2) - 3];
function lambda = line_search(xk,dk) %作线搜索,求步长
%phi(lambda) = obj( xk + lambda*dk ) %d_phi(lambda) = dk'*grad_obj( xk + lambda*dk )
syms eqn lambda
eqn = dk'*grad_obj(xk+lambda*dk); lambda = solve(eqn); %用符号计算命令solve求方程d_phi(\lambda)=0的根 lambda = max(eval(lambda));%将符号计算的结果转化为数值类型 课堂实验任务
编写函数文件,实现最速下降法和共轭梯度法,并分别求解下列问题
22, minf(x),x,4x12
T,6x,1,1,,10初始点取,精度取; ,,0
五、实验主要步骤
1、安装matlab7.0及以上版本软件;
2、编写m文件以创建和保存各函数;
3、运行程序,保存结果;
4、撰写实验
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
。
六、实验报告的撰写
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
1. 写出实验课程名称、日期;
2. 写出姓名、学号;
3. 写出实验目的、实验内容;
4. 写出实验过程及结果(程序代码及数值解),尽量给出其图象; 5. 写出心得体会;