Powell算法总结

这是一种最优化算法,可以用于求解多元方程式的解。

1. 预备知识

对于任意一个n维非线性函f(x)=f(x_1,x_2,...,x_n),若其至少二阶连续可微,则可将其在某一点 x_0 处,进行泰勒展开,保留其二阶项,写成:

f(x)=f(x_0)+[\bigtriangledown f(x_0)]^T(x-x_0)+\frac{1}{2!}[x-x_0]^TH(x_0)[x-x_0]+o^n

略去二次以上高阶项,并将其写成如下形式:

f(\approx )\approx f(x_0)+b[x-x_0]+[x-x_0]^TA[x-x_0]=[x-x_0]^TA[x-x_0]+b[x-x_0]+c

若取x_0=[0,0,...,0]^T,则上式变为如下一般形式:

f(x)\approx x^TAx+bx+c

注意,其中(\frac{\partial^2f(x_0)}{\partial x_1^2} 表示 ,\frac{\partial^2f(x_0)}{\partial x_1^2}\mid_{ x=x_0}其余类似):A为n*n矩阵,b为n*1列向量,c为常量。

A=\frac{1}{2!}H(x_0)=\frac{1}{2}\begin{bmatrix} \frac{\partial^2f(x_0)}{\partial x_1^2} & \frac{\partial^2f(x_0)}{\partial x_1\partial x_2} & ... & \frac{\partial^2f(x_0)}{\partial x_1\partial x_n}\\ \frac{\partial^2f(x_0)}{\partial x_2\partial x_1} & \frac{\partial^2f(x_0)}{\partial x_2^2} & ... & \frac{\partial^2f(x_0)}{\partial x_2\partial x_n}\\ \vdots & \vdots & \ddots & \vdots\\ \frac{\partial^2f(x_0)}{\partial x_n\partial x_1} & \frac{\partial^2f(x_0)}{\partial x_n\partial x_2}& ... & \frac{\partial^2f(x_0)}{\partial x_n^2} \end{bmatrix}…(1)

b=\bigtriangledown f(x_0)=\begin{bmatrix} \frac{\partial f(x_0)}{\partial x_1} & \frac{\partial f(x_0)}{\partial x_2} & ... & \frac{\partial f(x_0)}{\partial x_n} \end{bmatrix}…(2)

c = f(x_0)…(3)

以上A、b在powell算法迭代过程中用于更新步长,步长计算公式为:

\alpha_i=-\frac{S_i^T(2Ax_k+b)}{2S_i^{(1)T}AS_i^{(1)}} …(4)

其中x_k表示搜索起始点。

2. 算法流程

例程:用powell算法求函数 f(x)=60-10x_1-4x_2+x_1^2+x_2^2-x_1x_2 的最小值点x*=[x_1^*,x_2^*]^T,计算收敛精度\varepsilon =0.0001

开始:

0. 首先将函数写成一般形式:

  1. 第一步,求一阶偏导数:\frac{\partial f(x)}{\partial x_1}= -10+2x_1-x_2,\frac{\partial f(x)}{\partial x_2}= -4+2x_2-x_1;
  2. 第二步,求二阶偏导数:\frac{\partial ^2f(x)}{\partial x_1^2}= 2, \frac{\partial ^2f(x)}{\partial x_2^2}= 2, \frac{\partial ^2f(x)}{\partial x_1\partial x_2}= \frac{\partial ^2f(x)}{\partial x_2\partial x_1}=-1;
  3. 得到A=\begin{bmatrix} 1 & -0.5\\ -0.5 & 1 \end{bmatrix}b=\begin{bmatrix} -10\\ -4 \end{bmatrix}

1. 第一轮迭代,

  1. 取初始点x_0^{(1)}=x^{(0)}=[0,0]^T,上标(k)表示迭代次数,下标表示第几个解,计算出初始点对应的函数值f_1=f(x^{(0)}) = 60
  2. 选取n个(n为未知数的个数)搜索方向,搜索方向为一组线性不相关(不共线)的向量即可,此处选择S_1^{(1)}=\begin{bmatrix} 1 \\ 0 \end{bmatrix}, S_2^{(1)}=\begin{bmatrix} 0 \\ 1 \end{bmatrix}
  3. 计算第一步搜索的最优步长,首先将初始点位置x_0^{(1)}代入步长计算公式(4),则第一步的最优步长为\alpha_1^{(1)}=-\frac{[\bigtriangledown f(x_0^{(1)})]^TS_1^{(1)}}{2S_1^{(1)T}AS_1^{(1)}}=-\frac{[-10,-4][1,0]'}{2}=5;根据第一步的最优步长和初始点,计算得到的第一步的解:x_1^{(1)}=x_0^{(1)}+\alpha_1^{(1)}S_1^{(1)}=\begin{bmatrix} 0\\0 \end{bmatrix}+5\begin{bmatrix} 1\\0 \end{bmatrix}=\begin{bmatrix} 5\\0 \end{bmatrix}
  4. 计算第二步搜索的最优步长,将x_1^{(1)}代入步长计算公式(4),求得第二步搜索最优步长\alpha_2^{(1)}=-\frac{[\bigtriangledown f(x_1^{(1)})]^TS_2^{(1)}}{2S_2^{(1)T}AS_2^{(1)}}=-\frac{[0,-9][0,1]'}{2*\begin{bmatrix} 0 &1 \end{bmatrix}\begin{bmatrix} 1 &-0.5 \\ -0.5 & 1 \end{bmatrix}\begin{bmatrix} 0\\1 \end{bmatrix}}=4.5;根据第二步的最优步长\alpha_2^{(1)}和搜索起始点x_1^{(1)},得到第二步的解:x_2^{(1)}=x_1^{(1)}+\alpha_2^{(1)}S_2^{(1)}=\begin{bmatrix} 5\\0 \end{bmatrix}+4.5\begin{bmatrix} 0\\1 \end{bmatrix}=\begin{bmatrix} 5\\ 4.5 \end{bmatrix}
  5. 计算第3(即额外的n+1)个搜索方向,S_3^{(1)}=x_2^{(1)}-x_0^{(1)}=\begin{bmatrix} 5\\ 4.5 \end{bmatrix}-\begin{bmatrix} 0\\0 \end{bmatrix} = \begin{bmatrix} 5\\4.5 \end{bmatrix}
  6. 计算S_3^{(1)}方向上的反射点:x_3^{(1)}=2x_2^{(1)}-x_0^{(1)}=\begin{bmatrix} 10\\9 \end{bmatrix}
  7. 计算相邻两点函数值的下降量:
    1. 计算各个点函数值f(x_0^{(1)})=60,f(x_1^{(1)})=35,f(x_2^{(1)})=14.75
    2. 计算下降量\Delta _1^{(1)}=f(x_0^{(1)})-f(x_1^{(1)})=25,\Delta _2^{(1)}=f(x_1^{(1)})-f(x_2^{(1)})=20.25
    3. 找到下降最快的搜索方向,\Delta_m^{(1)}=max(\Delta_1^{(1)},\Delta_2^{(1)})=\Delta_1^{(1)},S_m^{(1)}=S_1^{(1)}
  8. 检验二个Powell判别条件:
    1. 计算f_1=f(x_0^{(1)})=60,f_2f(x_2^{(1)})=14.75,f_3=f(x_3^{(1)})=15
    2. 是否满足条件f_3<f_1,此处满足;
    3. 是否满足(f_1-2f_2+f_3)(f_1-f_2-\Delta_m^{(1)})^2<0.5\Delta_m^{(1)}(f_1-f_3)^2,此处满足;
    4. 由于两个Powell条件都满足,因此用共轭方向S_3^{(1)}替换最速下降方向S_m^{(1)}=S_1^{(1)},并求S_3^{(1)} 方向上的极小值点(先计算最优步长=22.5/45.5,然后从x_n^{(1)}=x_2^{(1)}点出发做一维搜索,得到x^*=\begin{bmatrix} 7.4725\\ 6.7253 \end{bmatrix}),将此点作为下一轮迭代的出发点 。
  9. 若上述两个条件有一个不满足,则下一轮迭代的搜索方向不变,出发点为函数值最小点。
  1. 第k轮迭代,重复上一步过程;
  2. 每次迭代结束时,验证收敛精度是否达到要求,即两轮迭代的最小值点是否满足:\left \| x_0^{(k+1)} -x_0^{(k)}\right \|\leq \varepsilon _1\left | \frac{f(x_0^{(k+1)})- f(x_0^{(k)})}{ f(x_0^{(k)})} \right |\leq \varepsilon _2;若满足条件则停止迭代,输出最小值点,若不满足则继续迭代。
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值