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= 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 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 25 |
FR共轭梯度法 | 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 2 |
BFGS拟牛顿法 | 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−2x2x3+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−2x316x33−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)= 12x1200024x22−2−20−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 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