0、前言
朋友请我帮他做一个他们老师留的课堂作业,就自学了一下,我给他做了A准则和G准则的,W准则的留给他自己改了,也没有多难就是换一个判断条件就行了。
一、问题描述
二、要求
三、代码
3.1A准则加回退法
%帮别人做的小作业
clc
clear all
close all
t=-5:0.01:5;
[x111,y111] = meshgrid(t);
Z=100*(x111.^2-y111).^2+(x111-1).^2;
% f1=@(x1,y1) 100*(x1.^2-y1).^2+(x1-1).^2;%题中函数
% Z=f1(x11,y11);
% plot3(x11,y11,Z,'Color','#4F4F2F','Linewidth',1.5);
mesh(x111,y111,Z);
axis([-5 5 -5 5 -10 2000])%设置坐标范围
title('Line in 3-D Space');%标题
xlabel('X');ylabel('Y');zlabel('Z');%x,y,z轴标签
grid on;%开启网格线
hold on
f=@(x) 100*(x(1).^2-x(2)).^2+(x(1)-1).^2;%题中函数
grad_f=@(x) [400*x(1)*(x(1)^2-x(2))+2*(x(1)-1) -200*(x(1)^2-x(2)) ];%对题中函数求梯度
x=[-1; 1];%当前点
x_next(1,:)=x;
f_next(1)=f(x);
p=[1; -2];%搜索方向
c=0.1;%Armijo准则中的常数
c1=0.5;
max_iter=100;%最大迭代次数
max_alpha=0.005;%步长因子的最大值
alpha = 1; % 初始化步长因子
for iter = 1:max_iter
x_1=x;
x_next(iter+1,:)=x+alpha.* p;%下一个下降点的存储
x=x+alpha.* p%下一个下降点
f_next(iter+1)=f(x);%下一个下降点对应的函数值
scatter3(x_next(iter,1), x_next(iter,2), f_next(iter), 10,"yellow" , 'filled');
pause(1)
hold on; % 保持图形以添加更多的散点
if f(x) <= f(x_1) +c * alpha * grad_f(x_1)'* p'
break;
else
alpha = alpha*c1; % 回退法缩小步长因子
end
if alpha < max_alpha
break;
end
end
alpha%第三问下降方向的迭代步长的值
x_next(iter+1,:)=x+alpha.* p;
x_next(iter+1,:)%第三问下一个迭代点的坐标
x_next(iter+1,:)=x+alpha.* p;
x_next(iter+1,:)%第三问下一个迭代点的坐标
f_next(iter+1)=f(x_next(iter+1,:));
f_next(1,iter+1)
3.2G准则加回退法
%帮别人做的小作业
clc
clear all
close all
t=-10:0.01:10;
[x111,y111] = meshgrid(t);
Z=100*(x111.^2-y111).^2+(x111-1).^2;
% f1=@(x1,y1) 100*(x1.^2-y1).^2+(x1-1).^2;%题中函数
% Z=f1(x11,y11);
% plot3(x11,y11,Z,'Color','#4F4F2F','Linewidth',1.5);
mesh(x111,y111,Z);
axis([-10 10 -10 10 -10 2000])%设置坐标范围
title('Line in 3-D Space');%标题
xlabel('X');ylabel('Y');zlabel('Z');%x,y,z轴标签
grid on;%开启网格线
hold on
f=@(x) 100*(x(1).^2-x(2)).^2+(x(1)-1).^2;%题中函数
grad_f=@(x) [400*x(1)*(x(1)^2-x(2))+2*(x(1)-1) -200*(x(1)^2-x(2)) ];%对题中函数求梯度
x=[-1; 1];%当前点
x_next(1,:)=x;
f_next(1)=f(x);
p=[1; -2];%搜索方向
c=0.001;%Armijo准则中的常数
c1=0.5;
max_iter=100;%最大迭代次数
max_alpha=0.005;%步长因子的最大值
alpha = 1; % 初始化步长因子
for iter = 1:max_iter
x_1=x;
x_next(iter+1,:)=x+alpha.* p;%下一个下降点的存储
x=x+alpha.* p%下一个下降点
f_next(iter+1)=f(x);%下一个下降点对应的函数值
scatter3(x_next(iter,1), x_next(iter,2), f_next(iter), 10,"yellow" , 'filled');
% pause(1)延时一秒看数据动态变化
hold on; % 保持图形以添加更多的散点
f(x) <= f(x_1) +c * alpha * grad_f(x_1)'* p'
A1=ans;
f(x) >= f(x_1) +(1-c) * alpha * grad_f(x_1)'* p'
A2=ans;
if all(A1,'all')&&all(A2,'all')
break;
else
alpha = alpha*c1; % 回退法缩小步长因子
end
if alpha < max_alpha
break;
end
end
alpha%第三问下降方向的迭代步长的值
x_next(iter+1,:)=x+alpha.* p;
x_next(iter+1,:)%第三问下一个迭代点的坐标
f_next(iter+1)=f(x_next(iter+1,:));
f_next(1,iter+1)
四、现象展示
每次的下降点及函数的图像如图所示,下降点我用了黄色表示你们也可以换颜色,函数图像我是把这个曲面函数给画了出来。要求三中的迭代步长见下面这一句
alpha%第三问下降方向的迭代步长的值
下一个迭代点的坐标为多少,以及下一 步的函数值为多少,见下面这两句
x_next(iter+1,:)=x+alpha.* p;
x_next(iter+1,:)%第三问下一个迭代点的坐标
f_next(iter+1)=f(x_next(iter+1,:));
f_next(1,iter+1)
4.1 A准则加回退法
4.2 G准则加回退法
五 总结
这东西没难度,W准则的我就不写了留给读者们在我代码基础上改吧,如果有问题了可以加微信联系,我会尽力解答的。研究生阶段太忙了一般没时间来csdn看评论。微信联系方式每篇博文下面的微信名片里面都有。