实验2 最速下降法和共轭梯度法的程序设计

  • 格式:doc
  • 大小:70.00 KB
  • 文档页数:4

下载文档原格式

  / 11
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验2 最速下降法和共轭梯度法的程序设计

一、实验目的

1、熟悉无约束优化问题的最速下降算法和共轭梯度法。

2、培养matlab 编程与上机调试能力。

二、实验课时:2个课时

三、实验准备

1、预习无约束优化问题的最速下降算法和共轭梯度法。

2、熟悉matlab 软件的基本操作及程序编写。

四、实验内容

课堂实验演示

根据最速下降法编写程序,求函数

21222121342)(min x x x x x x x f -++-=

的极小值,其中初始点为()01,1T x =

算法步骤如下:

Step1::给出初始点0x ,和精度1;0k ε<<=;

Step2:计算()k f x ∇,如果()k f x ε∇≤,则停止迭代,输出结果;否则转step3; Step3:令下降方向()k k d f x =-∇,计算步长因子k λ使得0()min ()k k k k k f x d f x d λλλ≥+=+,令1,1k k k k x x d k k λ+=+=+,转step2。

其程序如下:

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

共轭梯度法的计算步骤:

Step1: 给出初始点0x ,令)(00x f d -∇=,精度1;0k ε<<=;

Step2:计算()k f x ∇,如果()k f x ε∇≤,则停止迭代,输出结果;否则转step3; Step3:计算k k k k d x x λ+=+1,其中步长因子k λ使得0

()min ()k k k k k f x d f x d λλλ≥+=+,计算下降方向k k k k k d x f x f x f d 22111||

)(||||)(||)(∇∇+-∇=+++; 令1+=k k ,转step2。

其程序如下:

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)