用最速下降法求函数的极小值,迭代两次,计算各迭代点的函数值、梯度及其模,设初始点。
以下代码在求解的时候并没有严格按照题目中要求的迭代两次进行计算,而是设置了最大容许误差e,当迭代过程中g的范数小于e时候停止迭代,最终迭代了五次,如果按照题目中仅迭代两次的话误差就会稍微大一些。
clc
clear all
close all
% 定义允许误差e = 0.1
e = 0.1;
Q = [2 0;0 8];
X = [1,1]';
%% 最速下降法求解极小值
iloop1 = 1;
while(1)
g = [2,8]'.* X;
gArray(:,iloop1) = g;
gNorm = norm(g);
gNormVector(iloop1) = gNorm;
Xarray(:,iloop1) = X ;
fx = 0.5*X'*Q*X;
fxVector(iloop1) = fx;
X = X-(g'*g/(g'*Q*g))*g;
iloop1 = iloop1 + 1;
if (gNorm < e)
break
end
end
%% 绘制示意图
% 原函数fx图形
figure
[x1,x2] = meshgrid(-1:0.01:1,-1:0.01:1);
FX = x1.^2 + 4*x2.^2;
surfc(x1,x2,FX,'LineStyle','none')
hold on
plot3(Xarray(1,:),Xarray(2,:),fxVector,'-r')
hold off
%% 显示结果
fprintf('迭代变量坐标X\n')
disp(Xarray)
fprintf('迭代路径的函数值\n')
disp(fxVector)
fprintf('迭代点处的梯度\n')
disp(gArray)
fprintf('梯度的模\n')
disp(gNormVector)
绘制的示意图
运算结果
迭代变量坐标X
1.0000 0.7385 0.1108 0.0818 0.0123 0.0091
1.0000 -0.0462 0.1108 -0.0051 0.0123 -0.0006
迭代路径的函数值
5.0000 0.5538 0.0613 0.0068 0.0008 0.0001
迭代点处的梯度
2.0000 1.4769 0.2215 0.1636 0.0245 0.0181
8.0000 -0.3692 0.8862 -0.0409 0.0982 -0.0045
梯度的模
8.2462 1.5224 0.9134 0.1686 0.1012 0.0187
根据计算结果来看,最终程序的迭代停止在了(0.0181,-0.0045)处,与解析解的极小值点(0,0)非常接近,函数值0.0001也与解析解的极小值点处函数0相差很小,可以认为满足了实际应用的需求。