本文章包含以下内容
1、画出最速下降法的算法流程图;
2、MATLAB 编写用数值微分法的梯度计算函数(函数式 M 文件);
3、MATLAB 编写最速下降法求解无约束优化问题的函数,要求采用黄金分割法精确一维搜索,用数值微分法计算梯度(函数式 M 文件,精度设为 epson 可调);
4、MATLAB 编写最速下降法求解无约束优化问题的函数,要求采用 Wolfe-Powell 非精确一维搜索,用数值微分法计算梯度(函数式 M 文件, 精度设为 epson 可调);
5、MATLAB 编写程序(命令式 M 文件),分别利用精确搜索和不精确搜索 的最速下降法,求解如下问题:
精度为 0.001,初始点为(-1,1);
改变初始点为(-1.2,1)重新运行,观察运行结果。
一维搜索,进退法,黄金分割法代码链接
本实验中函数用单独function计算
function y=f(x)if(length(x)==1)global xk;global pk;x=xk+x*pk;endy=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
1.最速下降法的算法流程图
2、MATLAB 编写用数值微分法的梯度计算函数(函数式 M 文件);
function g=shuzhiweifenfa(x)for i = 1:length(x)m=zeros(1,length(x));m(i)=(10^-6)/2;g(i)=f(x+m)-f(x-m);endg=g/10^-6;
3、最速下降法求解无约束优化问题的函数,采用黄金分割法精确一维搜索,用数值微分法计算梯度(函数式 M 文件,精度设为 epson 可调);
function x=zuisuxiajiangfa_hjfg(e,x)%step 1%没用到k,只存储当前迭代的值。global xk;global pk;while 1%step 2g=shuzhiweifenfa(x);%step 3%范数用的是平方和开根号if sqrt(sum(g.^2))<=ereturn;endpk=-g;xk=x;%这两个函数见之前代码(matlab无约束最优化的一般算法)[a,b,c]=jintuifa(0,0.1);a=huangjinfenge(a,c,10^-4);%step 4x=x+a*pk;end
4、最速下降法求解无约束优化问题的函数,要求采用 Wolfe-Powell 非精确一维搜索,用数值微分法计算梯度(函数式 M 文件, 精度设为 epson 可调);
function a=Wolfe_Powell(x,pk)%step 1u=0.1;b=0.5;a=1;n=0;m=10^100;%step 2fx=f(x);g=shuzhiweifenfa(x);while 1xk=x+a*pk;fxk=f(xk);gk=shuzhiweifenfa(xk);if (fx-fxk)>=(-u*a*g*pk.')%(3-1)if (gk*pk.')>=(b*g*pk.')%(3-2)return;else%step 4n=a;a=min(2*a,(a+m)/2);endelse%step 3m=a;a=(a+n)/2;endend
function x=zuisuxiajiangfa_Wolfe(e,x)%step 1%没用到k,只存储当前迭代的值。while 1%step 2g=shuzhiweifenfa(x);%step 3%范数用的是平方和开根号if sqrt(sum(g.^2))<=ereturn;endpk=-g;a=Wolfe_Powell(x,pk);%step 4x=x+a*pk;end
5、分别利用精确搜索和不精确搜索 的最速下降法,问题:
clearclcfor i=1:2if(i==1)x=[-1,1];fprintf('=========================');fprintf('\nx=%f\t\t%f\n',x(1),x(2));fprintf('=========================\n');elsex=[-1.2,1];fprintf('=========================');fprintf('\nx=%f\t\t%f\n',x(1),x(2));fprintf('=========================\n');endfprintf('精确搜索的最速下降法:\n');x_=zuisuxiajiangfa_hjfg(10^-3,x);fprintf('x*=%f\t%f\n',x_(1),x_(2));fprintf('f(x)=%f\n',f(x_));fprintf('不精确搜索的最速下降法\n');x_=zuisuxiajiangfa_Wolfe(10^-3,x);fprintf('x*=%f\t%f\n',x_(1),x_(2));fprintf('f(x)=%f\n',f(x_));end