本次写的是《A diagonal quasi-Newton updating method for unconstrained optimization》文献算法实现----最优化实验,使用的是matlab。如果代码有错的话,请温柔的指出,谢谢。😊
1、这篇文献的算法的基本思想:♦算法叫做DNRTR算法
使用一种对角拟牛顿更新算法。在弱割线方程的作用下,通过最小化之前的估计值变化的大小和迹的更新来确定对角矩阵中逼近Hessian的元素。在温和的经典假设下,算法是线性收敛的。对角拟牛顿的更新满足有界退化性质。
2、算法的基本步骤:
3、本次实验使用的算例如下(根据实际需要,也可以换成其他的算例):
f ( x ) = ∑ i = 1 n ( ( n − ∑ j = 1 n cos x j ) + i ( 1 − cos x i ) − sin x i ) 2 x = [ 0.2 , ⋯ , 0.2 ] T x 的维数是100 \begin{aligned} &f(x)=\sum_{i=1}^{n}\left(\left(n-\sum_{j=1}^{n} \cos x_{j}\right)+i\left(1-\cos x_{i}\right)-\sin x_{i}\right)^{2}\\ &x=[0.2, \cdots, 0.2]^{T}\\ &x \text { 的维数是100 } \end{aligned} f(x)=i=1∑n((n−j=1∑ncosxj)+i(1−cosxi)−sinxi)2x=[0.2,⋯,0.2]Tx 的维数是100
4、实验实现步骤:
1、 编写目标函数文件(hanshu.m)
2、 编写求解目标函数的梯度文件(grad.m)
3、 编写DNRTR算法使用的Wolfe线搜索文件(wolfe.m)
4、 编写DNRTR算法文件(DNRTR.m)
5、 编写主函数文件(main.m)
5、实验过程:
1、目标函数文件(hanshu.m)
%目标函数
function f = hanshu(x)
n = length(x);
a = n - sum(cos(x));
b = 1 - cos(x);
c = sin(x);
d = 1:n;
d = d';
e = d.* b;
f1 = a + e -c;
g = f1.^2;
f = sum(g);
end
2、目标函数的梯度文件(grad.m)
%梯度
function g = grad(x)
n = length(x);
a = n - sum(cos(x));
b = 1 - cos(x);
c = sin(x);
d = 1:n;
d = d';
e = d.* b;
f1 = a + e -c;
f2 = sum(f1);
f3 = 2 * f1.*( d.* sin(x)- cos(x));
g = 2 * sin(x) * f2 + f3;
end
3、Wolfe线搜索文件(wolfe.m)
%第三步:wolfe线搜索,计算步长alpha(k)
function [f1, g1, x1, s] = wolfe(x, f, gd, d)
rho = 1e-4;
alpha = 1;
sigma = 0.8;
a = 0;
b = Inf;
while 1
s = alpha * d; %计算sk
x1 = x + s;
f1 = hanshu(x1);
if ~( f1 <= f + rho * alpha * gd )
b = alpha;
alpha = ( alpha + a )/2; %计算出步长alpha(k)
continue
end
g1 = grad(x1);
if ~(g1'* d >= sigma * gd )
a = alpha;
alpha = min([2 * alpha, (b + alpha)/2]); %计算出步长alpha(k)
continue
end
break
end
4、DNRTR算法文件(DNRTR.m)
%功能:用对角拟牛顿修正法(DNRTR)求解无约束问题:min f(x)
function opt = DNRTR(x, epsg)
%第一步:初始化
n = length(x);
k = 0; %迭代次数
epsilon=0.01; %设置误差
g = grad(x); %计算梯度g0
f = hanshu(x);
d = -g; %计算搜索方向d0
B = eye(n);
%第二步:测试停止迭代的标准
while 1
opt = norm(g,'inf'); %计算gk的范数 max(abs(g))
if opt <= epsg
break %测试停止迭代的标准,满足条件,则停止
end
gd = g' * d;
%第三步:wolfe线搜索,计算步长alpha(k)
[f, g1, x, s] = wolfe(x, f, gd, d);
%第四步
y = g1 - g; %计算yk
g = g1; %更新梯度
%第五步:使用(21)式计算hessian更新对角线逼近的元素
I = eye(n);
Ak = diag(s.^2);
Ak2 = diag(s.^4);
B = B + ((s'*y + s' * s - s' * B * s )/trace(Ak2))* Ak - I; %这行代码还可以换成下面那个代码片上的代码,实现的效果是一样的
b = diag(B);
%第六步:计算搜索方向
d = -g;
p=length(d);
for pp=1:p
if b(pp)>= epsilon
d(pp) = -g(pp)./b(pp);
end
end
%第七步
k = k + 1;
end
disp("迭代次数为:")
k
disp("最优点为:")
x
disp("最优值为:")
val = hanshu(x)
disp("最后的梯度的范数为:")
B = B + ((s'*y + s' * s - s' * B * s )/trace(Ak2))* Ak - I; %可换成下面这行代码
B = B + ((s'*y + s' * s - s' * B * s )/sum(s.^4))* Ak - eye(n);
5、主函数文件(main.m)
clc
clear
n = 100;
x = 0.2 * ones(n,1);
epsg = 1e-5;
opt = DNRTR(x, epsg)
6、代码截图:
7、 运行结果截图:
8、实验结果分析:
迭代次数为:
k =
1871
最优点为:
x =[ 0.0006,…, 0.0006]’
x的维数为100.
最优值为:
val =
2.8293e-11
下面我把我的实验报告放上来,只需要关注我就可以下载了,不需要积分哦💡
DNRTR算法实现过程
本篇的参考文献可以在这个数据库找到:【Web of Science】