Matlab无约束优化

无约束优化原理

求解无约束优化的方法主要有直接搜索法(search method)和梯度法(gradient method).
直接搜索法适合目标函数高度非线性,没有导数或者导数很难计算的情况,直接搜索方法包括单纯形法,Hooke-Jeeves搜索法,Pavell共轭方向法等.
梯度法在可以得到导数信息的情况下是一种更优的方法,该方法利用一阶导数和Hessian矩阵的信息,可以得到更快的收敛速度。常用的梯度法包括最速下降法,Newton法,Marquart法,共轭梯度法和拟牛顿法(Quasi-Newton method).

Matlab工具箱求解算法

  1. 大型优化算法:在提供函数梯度信息的情况下,默认使用大型优化算法,在每一个迭代步骤中使用PCG法求解大型线性系统得到近似解。
  2. 中型优化算法:fminunc函数中的参数options.LargeScale设置为off,该算法采用基于二次和三次混合插值的一维搜索算法的BFGS拟牛顿法
  3. 一维搜索算法的设置,options.LineSearchType设置为quadcubic时,采用二次和三次混合插值法,options.LineSearchType设置为cubicpoly时,将采用三次插值法

应用1:资金调用问题

source:Matlab优化算法 Page 186
x i x_i xi表示第 i i i所使用的资金,总收益为 T T T,目标函数为
max ⁡ T = x 1 + x 2 + x 3 + x 4 \max T=\sqrt{x_1}+\sqrt{x_2}+\sqrt{x_3}+\sqrt{x_4} maxT=x1 +x2 +x3 +x4
约束条件为
{ x 1 ≤ 400 1.1 x 1 + x 2 ≤ 440 1.21 x 1 + 1.1 x 2 + x 3 ≤ 484 1.331 x 1 + 1.21 x 2 + 1.1 x 3 + x 4 ≤ 532.4 x i ≥ 0 \begin{cases} x_1\leq 400\\ 1.1x_1+x_2\leq 440\\ 1.21x_1+1.1x_2+x_3\leq 484\\ 1.331x_1+1.21x_2+1.1x_3+x_4\leq 532.4\\ x_i\geq 0 \end{cases} x14001.1x1+x24401.21x1+1.1x2+x34841.331x1+1.21x2+1.1x3+x4532.4xi0

matlab code

clear all;
clc;
A = [1.1, 1, 0, 0; 1.21, 1.1, 1, 0; 1.331, 1.21, 1.1, 1];
b = [440, 484, 532.4];
lb = [0, 0, 0, 0];
ub = [400, 1000, 1000, 1000];
x0 = [100, 100, 100, 100]; % set initial point
[x, fval] = fmincon('obj_642', x0, A, b, [], [], lb, ub);
disp(x);
disp(fval);

应用2:经营最佳安排问题

source:Matlab优化算法 Page 189

matlab code

clear all;
clc;
lb = [0, 0];
x0 = [0, 0];
[x, w] = fmincon('obj_643', x0, [], [], [], [], lb, [], 'cons');
disp(x);
disp(w);

数值迭代法求解无约束极值问题

数值迭代的基本思想是从一个初始点 X ( 0 ) X^{(0)} X(0)出发,在可行方向 d ( 0 ) d^{(0)} d(0)搜索,确定最佳步长 α 0 \alpha_0 α0,使得函数沿着 d ⃗ ( 0 ) \vec{d}^{(0)} d (0)下降最大
X ( k + 1 ) = X ( k ) + α k d ⃗ ( 0 ) ( k ) (1) X^{(k+1)}=X^{(k)}+\alpha_k\vec{d}^{(0)(k)}\tag{1} X(k+1)=X(k)+αkd (0)(k)(1)

黄金分割法

该方法适合在已知极值区间的基础上,不断缩小区间找到极值,要求目标函数为单峰,算法步骤如下:

  1. 给定区间 [ a , b ] [a, b] [a,b] e p s > 0 eps>0 eps>0
  2. 计算 r = a + 0.382 ( b − a ) , u = a + 0.618 ( b − a ) r=a+0.382(b-a), u=a+0.618(b-a) r=a+0.382(ba),u=a+0.618(ba)
  3. 如果 f ( r ) > f ( u ) f(r)>f(u) f(r)>f(u),则进行下一步,否则转(5)
  4. 如果 u − r < e p s u-r<eps ur<eps,则停止计算,输出 x ∗ = u , f ∗ = f ( u ) x^*=u, f^*=f(u) x=u,f=f(u),否则令 a = r , r = u , u = a + 0.618 ( b − a ) a=r, r=u, u=a+0.618(b-a) a=r,r=u,u=a+0.618(ba),转(3)
  5. 如果 u − r < e p s u-r<eps ur<eps,则停止计算,输出 x ∗ = r , f ∗ = f ( r ) x^*=r, f^*=f(r) x=r,f=f(r),否则令 b = u , u = r , r = a + 0.382 ( b − a ) b=u, u=r, r=a+0.382(b-a) b=u,u=r,r=a+0.382(ba),转(3)

无约束多维极值

该类问题可以使用直接法求解,不需要计算导数,只需要计算函数值。

模式搜索法

轴向移动的目标是找到有利的下降方向,而模式移动的目标是沿着有利下降方向加速移动,可以使用patternsearch函数调用。

code

clear all;
clc;
x0 = [0, 0];
x = patternsearch(@psobj, x0);
disp(x);

单纯形搜索(Simplex)

单纯形法是从一个可行解出发,不断找到可以改进目标值的基本可行解,达到最优基本可行解。

Powell法

该方法的本质是共轭方向法,Powell法将整个计算过程分解为若干阶段,在每个阶段由 n + 1 n+1 n+1次一维搜索组成,首先沿着已知的 n n n个方向进行搜索,找到一个最好点,然后沿着本阶段的初始点与该最好点连线方向进行搜索,定位出本阶段的最好点。根据得到的最好方向进行下一阶段的迭代。

最速下降法

n n n维问题转化维一系列负梯度方向使用一维搜索方法寻优。
由方程 ( 1 ) (1) (1),设置方向为负梯度方向
d ⃗ ( k ) = − ∇ f ( x ( k ) ) ∥ ∇ f ( x ( k ) ) ∥ \vec{d}^{(k)}=-\frac{\nabla f(x^{(k)})}{\lVert\nabla f(x^{(k)})\rVert} d (k)=f(x(k))f(x(k))
最速方向的迭代公式为
X ( k + 1 ) = X ( k ) − α k ∇ f ( X ( k ) ) ∥ f ( X ( k ) ) ∥ X^{(k+1)}=X^{(k)}-\alpha_k\frac{\nabla f(X^{(k)})}{\lVert f(X^{(k)})\rVert} X(k+1)=X(k)αkf(X(k))f(X(k))
在第 k k k次迭代初始点 X ( k ) X^{(k)} X(k)和搜索方向 d ⃗ ( k ) \vec{d}^{(k)} d (k)确定时,原始目标函数为关于步长 α \alpha α的一维函数
φ ( α ) = f ( x ( k ) + α S ( k ) ) \varphi(\alpha)=f(x^{(k)}+\alpha S^{(k)}) φ(α)=f(x(k)+αS(k))
在可导的情况下,可以得到
{ φ ( α ) = [ ∇ f ( x ( k ) + α d ⃗ ( k ) ) ] T ∇ f ( x ( k ) ) = 0 [ ∇ f ( x ( k + 1 ) ) ] T ∇ f ( x ( k ) ) = 0 [ d ⃗ ( k + 1 ) ] T d ⃗ ( k ) = 0 \begin{cases} \varphi(\alpha)=[\nabla f(x^{(k)}+\alpha \vec{d}^{(k)})]^T\nabla f(x^{(k)})=0\\ [\nabla f(x^{(k+1)})]^T\nabla f(x^{(k)})=0\\ [\vec{d}^{(k+1)}]^T\vec{d}^{(k)}=0 \end{cases} φ(α)=[f(x(k)+αd (k))]Tf(x(k))=0[f(x(k+1))]Tf(x(k))=0[d (k+1)]Td (k)=0
可以发现,连续两次搜索方向互相正交,形成Z形状的搜索路径。

共轭梯度法

最速下降法在越接近极值点的区域的搜索效率越差,因此采用近似的思想对最速下降法进行改进,根据目标函数在极值点附近可以近似于一个二次函数,希望进行一次迭代达到极值点 x ∗ x^* x
x ∗ = x ( 1 ) + α d ⃗ ( 1 ) x^*=x^{(1)}+\alpha\vec{d}^{(1)} x=x(1)+αd (1)
f ( x ) f(x) f(x)进行Taylor Expansions
f ( x ) = 1 2 x T G x + B T x + C f(x)=\frac{1}{2}x^TGx+B^Tx+C f(x)=21xTGx+BTx+C
x ( 1 ) x^{(1)} x(1)的梯度为
∇ f ( x ( 1 ) ) = G x ( 1 ) + B \nabla f(x^{(1)})=Gx^{(1)}+B f(x(1))=Gx(1)+B
在极值点 x ∗ x^* x,满足必要条件,代入得到
∇ f ( x ∗ ) = G [ x ( 1 ) + α 1 d ⃗ ( 1 ) ] + B = ∇ f ( x ( 1 ) ) + α 1 G d ⃗ ( 1 ) = 0 \nabla f(x^*)=G[x^{(1)}+\alpha_1\vec{d}^{(1)}]+B=\nabla f(x^{(1)})+\alpha_1G\vec{d}^{(1)}=0 f(x)=G[x(1)+α1d (1)]+B=f(x(1))+α1Gd (1)=0
等式两侧同时乘以 [ d ⃗ ( 0 ) ] T [\vec{d}^{(0)}]^T [d (0)]T,可以得到
[ d ⃗ ( 0 ) ] T G d ⃗ ( 1 ) = 0 [\vec{d}^{(0)}]^TG\vec{d}^{(1)}=0 [d (0)]TGd (1)=0
向量 d ⃗ ( 0 ) \vec{d}^{(0)} d (0) d ⃗ ( 1 ) \vec{d}^{(1)} d (1)成为 G G G的共轭方向。

拟牛顿法

拟牛顿法是利用目标函数 f f f和一阶导数 g g g的信息,构造出目标函数的曲率近似

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quant0xff

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值