大连理工大学2022年春季最优化方法上机作业——用Matlab实现最速下降法、阻尼牛顿法、BFGS方法、共轭梯度法、DFP方法、惩罚函数法、增广拉格朗日函数法

2022年大工最优化方法作业-庞丽萍老师——用Matlab实现最速下降法、阻尼牛顿法、BFGS方法、共轭梯度法、DFP方法、惩罚函数法、增广拉格朗日函数法

在这里插入图片描述
实现代码:

%%BFGS拟牛顿算法
function    BFGS()
%函数初始值设定
n=205;
a=unidrnd(10,n,1);
G=a*(a)'+unidrnd(2)*eye(n);
b=0.5*G*ones(n,1);
x{1}=zeros(n ,1);
maxiter=100;
err=10^(-2);
H{1}=eye(n,n);
for i=1:maxiter
%更新下降方向d
d=-H{i} *(G*x{i}+b);
%进行一维搜索,详细代码见下面的精确一维搜索
a=buchang(G,b,x{i},d);
%更新点
x{i+1}=x{i}+a*d;
%判断是否结束
if norm(G*x{i+1}+b)<=err
    disp("迭代次数为");
    disp(i);
    disp("最优值为");
    f=0.5*x{i+1}'*G*x{i+1}+b'*x{i+1};
    disp(f);
     disp("精度为");
     disp(norm(G*x{i+1}+b));
    disp("最优解为")  ;
   
    disp(x{i+1});
    break;
end
%计算delt_x,delt_y
delt_x=x{i+1}-x{i};
delt_y=(G*x{i+1}+b)-((G*x{i}+b));
delt_v=delt_x/(delt_x'*delt_y)-(H{i}*delt_y)/(delt_y'*H{i}*delt_y);
H{i+1}=H{i}+(delt_x*delt_x')/(delt_x'*delt_y)-((H{i}*delt_y)*(H{i}*delt_y)')/(delt_y'*H{i}*delt_y)+(delt_y'*H{i}*delt_y)*(delt_v*delt_v');

end
return

%%最速下降法
function zuisuxiajiang( )
%%设置问题的维数
%本人学号为--手动马赛克 :)就不告诉你们了--故
n=242;
a=unidrnd(10,n,1);
G=a*(a)'+unidrnd(2)*eye(n);
b=0.5*G*ones(n,1);
x{1}=zeros(n ,1);
maxiter=100;
err=10^(-6);
for i = 1:maxiter
%初始点x[1]=0
%负梯度方向,二次函数的导数为Gx+b
d=-(G*x{i}+b);

%求a步长
a=buchang(G,b,x{i},d);

%更新迭代点
x{i+1}=x{i}+a*d;
%判断梯度是否符合精度,结束循环
if norm(G*x{i+1}+b)<=err
    disp("迭代次数为");
    disp(i);
    disp("最优值为");
    f=0.5*x{i+1}'*G*x{i+1}+b'*x{i+1};
    disp(f);
     disp("精度为");
     disp(norm(G*x{i+1}+b));
    disp("最优解为")  ;
    disp(x{i+1});
    break;
end

end
return;
%%共轭梯度法
function gongetidu()
%函数初始值设定
n=242;
a=unidrnd(10,n,1);
G=a*(a)'+unidrnd(2)*eye(n);
b=0.5*G*ones(n,1);
x{1}=zeros(n ,1);
maxiter=280;
err=10^(-2);
%初始下降方向 d
d{1}=-(G*x{1}+b);
for i=1:maxiter
 disp("迭代次数为");
    disp(i);
%进行一维搜索
a=buchang(G,b,x{i},d{i});
%更新点
x{i+1}=x{i}+a*d{i};
%判断是否结束
if norm(G*x{i+1}+b)<=err
    disp("迭代次数为");
    disp(i);
     disp("精度为");
     disp(norm(G*x{i+1}+b)); 
     disp("最优值为");
    eval("f=0.5*x{i+1}'*G*x{i+1}+b'*x{i+1}")
    disp("最优解为")  ;
    disp(x{i+1});
   
    break;
end
%计算共轭方向
belt=((G*x{i+1}+b)'*(G*x{i+1}+b))/((G*x{i}+b)'*(G*x{i}+b));
d{i+1}=-(G*x{i+1}+b)+belt*d{i};

end
%%阻尼牛顿法
function zhuninewdun()
n=242;
a=unidrnd(10,n,1);
G=a*(a)'+unidrnd(2)*eye(n);
b=0.5*G*ones(n,1);
x{1}=zeros(n ,1);
maxiter=100;
err=10^(-2)
for i=1:maxiter
%初始值x{1}=0;
g=G*x{i}+b;
g2=G;
%求d
d=-inv(g2)*g;
%求步长
a=buchang(G,b,x{i},d);
%更新点
x{i+1}=x{i}+a*d;
%判断   
if norm(G*x{i+1}+b)<=err
    disp("迭代次数为");
    disp(i);
     disp("精度为");
     disp(norm(G*x{i+1}+b));
     disp("最优值为");
    f=0.5*x{i+1}'*G*x{i+1}+b'*x{i+1};
    disp(f);
    disp("最优解为")  ;
    disp(x{i+1});
    break;
end
end


return;

精确一维搜索

function a=buchang(G,b,x,d)
syms a1 
x1=x+a1*d;
f=0.5*x1'*G*x1+b'*x1;
a=solve(diff(f,'a1')==0,a1);
a=eval(a);
return;

上面是第一题的,把每个.m文件名都命名为当前函数的名字,一共五段代码五个文件移动到一个文件夹内,就可以正确执行了,其它的题的答案就不贴了,想要的自己下载

资源链接:https://download.csdn.net/download/weixin_42137483/85127199
不想花积分的,去这里下载word版,自己复制粘贴一下作业

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值