收到校友的提问,这次的题目跟我当时不太一样,要求的精确线搜索,而且维数很高,之前的代码需要修改。为此专门写了这个博客,时间仓促,可能会有问题,有啥问题欢迎私信和评论,由于我要做其他事情,其他的请读者看懂了自己写,我只提供最速下降法的代码,其他的举一反三,并不难写。
具体理论,比如迭代方式等可以参看我其他博客
大连理工大学 2021年最优化方法大作业(1)_Jiang_Tesla的博客-CSDN博客_大连理工优化方法课后作业
大连理工大学 2021年最优化方法大作业(2)_Jiang_Tesla的博客-CSDN博客_大连理工大学最优化方法答案
这次的题比较抽象,我们首先应该知道下面两个式子
第二个式子考试也会用到,推导过程我就不写了,因为是精确线搜索,就需要指导兰姆达的具体数值,下面是推导过程
推导完了咱们就可以上代码讲解了,这里我只对改动部分进行注释,这里带入我的学号了
n = 244;
x = zeros(n,1);
a = unidrnd(10,n,1);
G = a*a'+unidrnd(2)*eye(n);
b =0.5*G*ones(n,1);
eps = 0.0001;
start_zuisu(x,eps,G,b);
%改动的式子方程
function f = fun(x,G,b)
f = 0.5*x'*G*x + b'*x
end
%改动的梯度
function g = grad(x,G,b)
g = G *x +b;
end
function start_zuisu(x0,eps,G,b)
gk = grad(x0,G,b);
res = norm(gk);
k = 0;
while res > eps
fprintf('The %d-th iteration, the residual is %f\n',k,res);
fprintf('**********************************************\n');
lamda = gk'*(G*x0+b)/(gk'*G*gk);%上面推导的兰姆达公式
x0= x0 - lamda*gk;%最速迭代公式
k = k+1;
gk = grad(x0,G,b);
res = norm(gk);
end
fprintf('The %d-th iteration, the residual is %f\n',k,res);
fprintf('%f\n',x0);
fprintf('mi n(f):%f\n',fun(x0,G,b));
end
写的有点仓促,确实可能有不对的,欢迎指正。