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

文章详细展示了以向量(1,2,3)^T作为初始向量,使用最速下降法、FR共轭梯度法、牛顿法和BFGS拟牛顿法解决极小化问题的过程。通过Matlab程序,计算了每个方法的迭代次数和结果,并对不同算法的性能进行了比较。此外,文章还探讨了在步长选择上采用Amijo搜索的不精确步长情况,以零向量为初始向量,再次应用上述算法进行求解,并分析了结果。
摘要由CSDN通过智能技术生成

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)∥≤103:

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= 2x18x212x3 ,2f= 2000800012

计算过程采用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 103×(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×105 25 25 25
FR共轭梯度法 1 0 − 15 × ( 0 ,   − 0.2845 ,   − 0.8032 ) T 10^-15 \times (0,\ -0.2845,\ -0.8032)^T 1015×(0, 0.2845, 0.8032)T 3 3 3 9.9032 × 1 0 − 15 9.9032\times 10^{-15} 9.9032×1015 4 4 4
牛顿法 ( 0 , 0 , 0 ) T (0,0,0)^T (0,0,0)T 3 3 3 0 0 0 2 2 2
BFGS拟牛顿法 1 0 − 40 × ( − 1.8367 ,   − 2.6403 ,   − 0 ) T 10^-40 \times (-1.8367,\ -2.6403,\ -0)^T 1040×(1.8367, 2.6403, 0)T 3.0 3.0 3.0 2.1464 × 1 0 − 39 2.1464\times 10^{-39} 2.1464×1039 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)102:

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+4x34x222x2x3+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+18x232x22x316x332x2

∇ 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)= 12x1200024x22220248x32

原理上和第一题是一样的,区别在于步长的选择,不精确的搜索过程求解过程更加简单,在程序上实现也要较为简单,具体的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 4
FR共轭梯度法 ( − 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值