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版,自己复制粘贴一下作业