最优化方法:最速下降法,FR共轭梯度法,牛顿法,BFGS拟牛顿法,精确搜索和Amijo非精确搜索习题解答

您所在的位置:网站首页 无约束优化问题的数值计算方法 最优化方法:最速下降法,FR共轭梯度法,牛顿法,BFGS拟牛顿法,精确搜索和Amijo非精确搜索习题解答

最优化方法:最速下降法,FR共轭梯度法,牛顿法,BFGS拟牛顿法,精确搜索和Amijo非精确搜索习题解答

2023-06-05 23:04| 来源: 网络整理| 查看: 265

1.以向量 ( 1 , 2 , 3 ) T (1,2,3)^T (1,2,3)T为初始向量,分别用最速下降法,FR共轭梯度法,牛顿法和BFGS拟牛顿法求解下面极小化问题,其中步长取为精确搜索步长,迭代至 ∥ Δ f ( x k ) ∥ ≤ 1 0 − 3 \parallel \Delta f(x_k) \parallel \le 10^{-3} ∥Δf(xk​)∥≤10−3:

m i n   x 1 2 + 4 x 2 2 + 6 x 3 2 + 3 min \ x_1^2+4x_2^2 +6x_3^2+3 min x12​+4x22​+6x32​+3,列表比较计算结果。

解:首先计算梯度和Hessian矩阵:

∇ f = ( 2 x 1 8 x 2 12 x 3 ) , ∇ 2 f = ( 2 0 0 0 8 0 0 0 12 ) \nabla f = \begin{pmatrix}2x_1\\8x_2\\12x_3\end{pmatrix}, \quad \nabla^2 f = \begin{pmatrix}2&0&0 \\ 0&8&0 \\ 0&0&12\end{pmatrix} ∇f= ​2x1​8x2​12x3​​ ​,∇2f= ​200​080​0012​ ​

计算过程采用matlab计算,计算程序代码附在最后。

最速下降法采用《最优化理论算法》(陈宝林)page283-295中介绍的公式进行设计;

FR共轭梯度法采用《最优化理论算法》(陈宝林)page294-295中介绍的公式进行设计;

牛顿法采用《最优化理论算法》(陈宝林)page287中介绍的公式进行设计;

BFGS拟牛顿法采用《最优化理论算法》(陈宝林)page314-315中介绍的公式进行设计;

将计算结果和迭代次数列表如下。

方法 x x x f ( x ) f(x) f(x)$\parallel \Delta f(x_k) \parallel $迭代次数最速下降法 1 0 − 3 × ( 0.3268 ,   0.0000 ,   0.0462 ) T 10^-3 \times (0.3268,\ 0.0000,\ 0.0462)^T 10−3×(0.3268, 0.0000, 0.0462)T 3.0000 3.0000 3.0000 8.572 × 1 0 − 5 8.572\times 10^{-5} 8.572×10−5 25 25 25FR共轭梯度法 1 0 − 15 × ( 0 ,   − 0.2845 ,   − 0.8032 ) T 10^-15 \times (0,\ -0.2845,\ -0.8032)^T 10−15×(0, −0.2845, −0.8032)T 3 3 3 9.9032 × 1 0 − 15 9.9032\times 10^{-15} 9.9032×10−15 4 4 4牛顿法 ( 0 , 0 , 0 ) T (0,0,0)^T (0,0,0)T 3 3 3 0 0 0 2 2 2BFGS拟牛顿法 1 0 − 40 × ( − 1.8367 ,   − 2.6403 ,   − 0 ) T 10^-40 \times (-1.8367,\ -2.6403,\ -0)^T 10−40×(−1.8367, −2.6403, −0)T 3.0 3.0 3.0 2.1464 × 1 0 − 39 2.1464\times 10^{-39} 2.1464×10−39 4 4 4

代码:

最速下降法:

%最速下降法 clc,clear %原始值载入 x=[1 2 3]' f=[-2,-8,-12]'; %一阶导负数 d_x=x.*f; %x代入后的一阶导数值 d_size=sqrt(dot(d_x,d_x)) %判别值 n=1 while d_size>0.001 syms t real %定义参数 y=x+t*d_x; %x迭代 ft=y(1,1)*y(1,1)+4*y(2,1)*y(2,1)+6*y(3,1)*y(3,1)+3; %目标表达式 dft=diff(ft,t); %求导 t=vpasolve(dft==0); %求导数为零时对应值 x=x+double(t)*d_x %新一轮迭代赋值 d_x=x.*f; %x代入后的一阶导数值 d_size=sqrt(dot(d_x,d_x)) %判别值 n=n+1 end fx=x(1,1)^2+4*x(2,1)^2+6*x(3,1)^2+3

FR共轭梯度法:

%FR共轭梯度法 clc,clear x=[1 2 3]' f=[2,8,12]'; %一阶导 g=f.*x; A=[2,0,0;0,8,0;0,0,12]; d=-x.*f %x代入后的一阶导数值 d_size=sqrt(dot(g,g)) n=1 while d_size>0.001 t=-(g'*d)/(d'*A*d); x=x+t*d g=f.*x; m=(d'*A*g)/(d'*A*d); d=-g+m*d; d_size=sqrt(dot(g,g)) n=n+1 end fx=x(1,1)^2+4*x(2,1)^2+6*x(3,1)^2+3

牛顿法:

%牛顿法 clc,clear %原始值载入 x=[1 2 3]' f1=[2,8,12]'; %一阶导 f2=[2,0,0;0,8,0;0,0,12]; d1=x.*f1; %x代入后的一阶导数值 d2=f2; %x代入后的一阶导数值 d_size=sqrt(dot(d1,d1)) %判别值 n=1 while d_size>0.01 x=x-d2\d1 d1=x.*f1; %x代入后的一阶导数值 d2=x.*f2; %x代入后的一阶导数值 d_size=sqrt(dot(d1,d1)) %判别值 n=n+1 end fx=x(1,1)^2+4*x(2,1)^2+6*x(3,1)^2+3

BFGS拟牛顿法:

%BFGS拟牛顿法 clc,clear x1=[1 2 3]' f=[2,8,12]'; %一阶导 H=[1,0,0;0,1,0;0,0,1]; B=[1,0,0;0,1,0;0,0,1]; %B初始值 %第一次迭代 n=1 g1=f.*x1; d=-H*g1; %搜索方向 d_size=sqrt(dot(g1,g1)) while d_size>0.001 syms t real %定义参数 y=x1+t*d; %x迭代 ft=y(1,1)*y(1,1)+4*y(2,1)*y(2,1)+6*y(3,1)*y(3,1)+3; %目标表达式 dft=diff(ft,t); %求导 t=vpasolve(dft==0); %求导数为零时对应值 x2=x1+t*d; %第二次x的值 g2=f.*x2; p=x2-x1; %p初始值 q=g2-g1; %q初始值 B=B+(q*q')/(q'*p)-(B*p*p'*B)/(p'*B*p); H=inv(B); d=-H*g2; d_size=sqrt(dot(g2,g2)) x1=x2 g1=g2; n=1+n end fx=x1(1,1)^2+4*x1(2,1)^2+6*x1(3,1)^2+3

2.以零向量为初始向量,使用最速下降法,FR共轭梯度法,牛顿法和BFGS拟牛顿法求解下面极小化问题,其中步长为不精确搜索步长,满足Amijo搜索,迭代至 ∥ Δ f ( x k ) ≤ 1 0 − 2 \parallel \Delta f(x_k) \le 10^{-2} ∥Δf(xk​)≤10−2:

m i n   x 1 4 + 2 x 2 4 + 4 x 3 4 − x 2 2 − 2 x 2 x 3 + x 1 min\ x_1^4+2x_2^4+4x_3^4-x_2^2-2x_2x_3+x_1 min x14​+2x24​+4x34​−x22​−2x2​x3​+x1​

其中Amijo搜索为:

f ( x k ) − f ( x k + α d k ) ≥ − α ρ Δ f ( x k ) T d k f(x_k)-f(x_k+\alpha d_k)\ge -\alpha \rho\Delta f(x_k)^Td_k f(xk​)−f(xk​+αdk​)≥−αρΔf(xk​)Tdk​

这是参数 ρ = 0.5 \rho=0.5 ρ=0.5, α \alpha α初始值为1,步长缩减因子为0.9,列表比较计算结果。

解:

求出基本参数:

x 0 = [ 0 0 0 ] , α = 1 x_0=\begin{bmatrix}0\\0\\0\end{bmatrix}, \alpha = 1 x0​= ​000​ ​,α=1

∇ f ( x k ) = [ 4 x 1 3 + 1 8 x 2 3 − 2 x 2 − 2 x 3 16 x 3 3 − 2 x 2 ] \nabla f(x_k) = \begin{bmatrix}4x_1^3+1\\8x_2^3-2x_2-2x_3\\16x_3^3-2x_2\end{bmatrix} ∇f(xk​)= ​4x13​+18x23​−2x2​−2x3​16x33​−2x2​​ ​

∇ 2 f ( x k ) = [ 12 x 1 2 0 0 0 24 x 2 2 − 2 − 2 0 − 2 48 x 3 2 ] \nabla^2 f(x_k) = \begin{bmatrix} 12x_1^2 &0 &0 \\ 0 &24x_2^2-2 &-2\\ 0 &-2 &48x_3^2 \end{bmatrix} ∇2f(xk​)= ​12x12​00​024x22​−2−2​0−248x32​​ ​

原理上和第一题是一样的,区别在于步长的选择,不精确的搜索过程求解过程更加简单,在程序上实现也要较为简单,具体的matlab算法附在最后。

将计算结果和迭代次数列表如下。

方法 x x x f ( x ) f(x) f(x)$\parallel \Delta f(x_k) \parallel $迭代次数最速下降法 ( − 0.6303 ,   0 ,   0 ) T (-0.6303,\ 0,\ 0)^T (−0.6303, 0, 0)T − 0.4725 -0.4725 −0.4725 0.0069 0.0069 0.0069 4 4 4FR共轭梯度法 ( − 0.6300 ,   0 ,   0 ) T (-0.6300,\ 0,\ 0)^T (−0.6300, 0, 0)T − 0.4725 -0.4725 −0.4725 0.0033 0.0033 0.0033 4 4 4牛顿法 ∇ 2 f ( x k ) 奇异 \nabla^2 f(x_k)奇异 ∇2f(xk​)奇异BFGS拟牛顿法 ( − 0.6317 ,   0 ,   0 ) T (-0.6317,\ 0,\ 0)^T (−0.6317, 0, 0)T − 0.4725 -0.4725 −0.4725 0.0083 0.0083 0.0083 6 6 6

代码:

最速下降法:

%最速下降法 clc,clear %原始值载入 x1=[0,0,0]' fx1=1*x1(1,1)^4+2*x1(2,1)^4+4*x1(3,1)^4-x1(2,1)^2-2*x1(2,1)*x1(3,1)+x1(1,1); g=[4*x1(1,1)^3+1; 8*x1(2,1)^3-2*x1(2,1)-2*x1(3,1); 16*x1(3,1)^3-2*x1(2,1)]; %一阶导数 d=-g; d_size=sqrt(dot(g,g)) %判别值 t=1; x2=x1+t*d %第二个x fx2=1*x2(1,1)^4+2*x2(2,1)^4+4*x2(3,1)^4-x2(2,1)^2-2*x2(2,1)*x2(3,1)+x2(1,1) n=1; while d_size>0.01 while fx2-fx1>=+t*0.5*g'*d t=0.9*t; x2=x1+t*d; fx2=1*x2(1,1)^4+2*x2(2,1)^4+4*x2(3,1)^4-x2(2,1)^2-2*x2(2,1)*x2(3,1)+x2(1,1); end x1=x2; fx1=fx2; g=[4*x1(1,1)^3+1; 8*x1(2,1)^3-2*x1(2,1)-2*x1(3,1); 16*x1(3,1)^3-2*x1(2,1)]; d=-g; x2=x1+t*d fx2=1*x2(1,1)^4+2*x2(2,1)^4+4*x2(3,1)^4-x2(2,1)^2-2*x2(2,1)*x2(3,1)+x2(1,1) d_size=sqrt(dot(g,g)) %判别值 n=n+1 end

FR共轭梯度法:

%FR共轭梯度法 clc,clear x1=[0,0,0]'; fx1=1*x1(1,1)^4+2*x1(2,1)^4+4*x1(3,1)^4-x1(2,1)^2-2*x1(2,1)*x1(3,1)+x1(1,1); g1=[4*x1(1,1)^3+1; 8*x1(2,1)^3-2*x1(2,1)-2*x1(3,1); 16*x1(3,1)^3-2*x1(2,1)]; %一阶导数 d_size=sqrt(dot(g1,g1)) d1=-g1; %x代入后的一阶导数值 t=1; x2=x1+t*d1 %第二个x fx2=1*x2(1,1)^4+2*x2(2,1)^4+4*x2(3,1)^4-x2(2,1)^2-2*x2(2,1)*x2(3,1)+x2(1,1) g2=[4*x2(1,1)^3+1; 8*x2(2,1)^3-2*x2(2,1)-2*x2(3,1); 16*x2(3,1)^3-2*x2(2,1)]; %一阶导数 n=1; while d_size>0.01 while fx2-fx1>=+t*0.5*g1'*d1 t=0.9*t; x2=x1+t*d1; fx2=1*x2(1,1)^4+2*x2(2,1)^4+4*x2(3,1)^4-x2(2,1)^2-2*x2(2,1)*x2(3,1)+x2(1,1); end g2=[4*x2(1,1)^3+1; 8*x2(2,1)^3-2*x2(2,1)-2*x2(3,1); 16*x2(3,1)^3-2*x2(2,1)]; %一阶导数 d2=-g2+dot(g2,g2)/dot(g1,g1)*d1; d1=d2; x1=x2; fx1=1*x1(1,1)^4+2*x1(2,1)^4+4*x1(3,1)^4-x1(2,1)^2-2*x1(2,1)*x1(3,1)+x1(1,1); g1=[4*x1(1,1)^3+1; 8*x1(2,1)^3-2*x1(2,1)-2*x1(3,1); 16*x1(3,1)^3-2*x1(2,1)]; %一阶导数 d_size=sqrt(dot(g1,g1)) x2=x1+t*d1 fx2=1*x2(1,1)^4+2*x2(2,1)^4+4*x2(3,1)^4-x2(2,1)^2-2*x2(2,1)*x2(3,1)+x2(1,1) g2=[4*x2(1,1)^3+1; 8*x2(2,1)^3-2*x2(2,1)-2*x2(3,1); 16*x2(3,1)^3-2*x2(2,1)]; %一阶导数 n=n+1 end

牛顿法:

%牛顿法 clc,clear %原始值载入 x1=[0,0,0]' t=1 fx1=1*x1(1,1)^4+2*x1(2,1)^4+4*x1(3,1)^4-x1(2,1)^2-2*x1(2,1)*x1(3,1)+x1(1,1) g1=[4*x1(1,1)^3+1; 8*x1(2,1)^3-2*x1(2,1)-2*x1(3,1); 16*x1(3,1)^3-2*x1(2,1)] %一阶导数 g2=[12*x1(1,1)^2,0,0; 0,24*x1(2,1)^2-2,-2; 0,-2,48*x1(3,1)^2] %二阶导数 d=-inv(g2) %二阶导无逆,终止计算 % x2=x1+t*d %第二个x % fx2=1*x2(1,1)^4+2*x2(2,1)^4+4*x2(3,1)^4-x2(2,1)^2-2*x2(2,1)*x2(3,1)+x2(1,1) % d_size=sqrt(dot(g1,g1)) %判别值 % n=1 % while d_size>0.01 % while fx2-fx1>=+t*0.5*g1'*d % t=0.9*t % x2=x1+t*d % fx2=1*x2(1,1)^4+2*x2(2,1)^4+4*x2(3,1)^4-x2(2,1)^2-2*x2(2,1)*x2(3,1)+x2(1,1) % end % x1=x2 % fx1=fx2 % g1=[4*x1(1,1)^3+1; % 8*x1(2,1)^3-2*x1(2,1)-2*x1(3,1); % 16*x1(3,1)^3-2*x1(2,1)] %一阶导数 % % g2=[12*x1(1,1)^2,0,0; % 0,24*x1(2,1)^2-2,-2; % 0,-2,48*x1(3,1)^2] %二阶导数 % % d=-g2\g1 % x2=x1+t*d % fx2=1*x2(1,1)^4+2*x2(2,1)^4+4*x2(3,1)^4-x2(2,1)^2-2*x2(2,1)*x2(3,1)+x2(1,1) % d_size=sqrt(dot(g1,g1)) %判别值 % n=n+1 % end

BFGS拟牛顿法:

%BFGS拟牛顿法 clc,clear x1=[0,0,0]' fx1=1*x1(1,1)^4+2*x1(2,1)^4+4*x1(3,1)^4-x1(2,1)^2-2*x1(2,1)*x1(3,1)+x1(1,1); H=[1,0,0;0,1,0;0,0,1]; B=[1,0,0;0,1,0;0,0,1]; %B初始值 %第一次迭代 n=1 g1=[4*x1(1,1)^3+1; 8*x1(2,1)^3-2*x1(2,1)-2*x1(3,1); 16*x1(3,1)^3-2*x1(2,1)]; %一阶导数 d=-H*g1; %搜索方向 t=1; x2=x1+t*d %第二个x fx2=1*x2(1,1)^4+2*x2(2,1)^4+4*x2(3,1)^4-x2(2,1)^2-2*x2(2,1)*x2(3,1)+x2(1,1) g2=[4*x2(1,1)^3+1; 8*x2(2,1)^3-2*x2(2,1)-2*x2(3,1); 16*x2(3,1)^3-2*x2(2,1)] %一阶导数 d_size=sqrt(dot(g1,g1)) while d_size>0.01 while fx2-fx1>=+t*0.5*g1'*d t=0.9*t; x2=x1+t*d; fx2=1*x2(1,1)^4+2*x2(2,1)^4+4*x2(3,1)^4-x2(2,1)^2-2*x2(2,1)*x2(3,1)+x2(1,1); end g2=[4*x2(1,1)^3+1; 8*x2(2,1)^3-2*x2(2,1)-2*x2(3,1); 16*x2(3,1)^3-2*x2(2,1)]; %一阶导数 fx2=1*x2(1,1)^4+2*x2(2,1)^4+4*x2(3,1)^4-x2(2,1)^2-2*x2(2,1)*x2(3,1)+x2(1,1) p=x2-x1; %p初始值 q=g2-g1; %q初始值 B=B+(q*q')/(q'*p)-(B*p*p'*B)/(p'*B*p); H=inv(B); d=-H*g2; x1=x2 g1=g2; fx1=fx2; x2=x1+t*d %第二次x的值 g2=[4*x2(1,1)^3+1; 8*x2(2,1)^3-2*x2(2,1)-2*x2(3,1); 16*x2(3,1)^3-2*x2(2,1)]; %一阶导数 fx2=1*x2(1,1)^4+2*x2(2,1)^4+4*x2(3,1)^4-x2(2,1)^2-2*x2(2,1)*x2(3,1)+x2(1,1) d_size=sqrt(dot(g2,g2)) n=1+n end


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3