2.1 基本优化问题
$\operatorname{minimize}\text{ }f(x)\text{ for }x\in {
{R}^{n}}$解决无约束优化问题的一般步骤为:
- Step1:选择一个初始出点${ {\mathbf{x}}_{0}}$(这里的${ {\mathbf{x}}_{0}}$是向量),设置一个收敛误差$\varepsilon $(解的精度)和一个迭代次数$k=0$;
- Step2:找到从点${ {\mathbf{x}}_{k}}$使函数$f(x)$下降最快的方向${ {d}_{k}}$;
- Step3:确定一个步长${ {\alpha }_{k}}>0$,使$f({ {\mathbf{x}}_{k}}+{ {\alpha }_{k}}{ {\mathbf{d}}_{k}})$减小,且${ {\mathbf{x}}_{k+1}}={ {\mathbf{x}}_{k}}+{ {\alpha }_{k}}{ {\mathbf{d}}_{k}}$;
- Step4:if走一步的距离$\left\| { {\alpha }_{k}}{ {\mathbf{d}}_{k}} \right\|<\varepsilon $,则停止并且输出解${ {\mathbf{x}}_{k+1}}$;else $k:=k+1$并返回Step2,继续迭代。
注意:Step2和Step3是优化问题的关键;Step3是一个元优化的问题,通常被称为线性搜索;其中$\mathbf{x}$是一个有n个元素的列向量;假设$f(x)$二阶连续可微(比较光滑);
我将以一个,求解非线性方程组的例子,介绍多元无约束优化的各个步骤。
2.2 解一个非线性方程:
ok,整个无约束多元优化问题,以解一个非线性方程开始,将介绍(度下降、牛顿法、拟牛顿法)。
$\left\{ \begin{aligned} & x_{1}^{2}+{
{x}_{2}}=11 \\& { {x}_{1}}+x_{2}^{2}=7 \\\end{aligned} \right.$(a)用Matlab的roots()函数去解多项式方程:
将${
{x}_{2}}=11-x_{1}^{2}$代入${ {x}_{1}}+x_{2}^{2}=7$中,有$x_{1}^{4}-22x_{1}^{2}+{ {x}_{1}}+114=0$解得:$x1={
{[3.5884\text{ 3}\text{.0000 -3}\text{.7793 -2}\text{.8051}]}^{T}};x2={ {[-1.8481\text{ 2}\text{.0000 -3}\text{.2832 -3}\text{.1313}]}^{T}}$(b) 用优化的方法去解
将解方程组的问题转化为优化问题:
\[\left\{ \begin{aligned}& {
{f}_{1}}(\mathbf{x})=x_{1}^{2}+{ {x}_{2}}-11=0 \\& { {f}_{2}}(\mathbf{x})={ {x}_{1}}+x_{2}^{2}-7=0 \\\end{aligned} \right.\Rightarrow \underset{\mathbf{x}}{\mathop{\operatorname{mini}}}\,f(\mathbf{x})=\underset{\mathbf{x}}{\mathop{\operatorname{mini}}}\,\left[ f_{1}^{2}(\mathbf{x})+f_{2}^{2}(\mathbf{x}) \right]\]要求得方程的解,按照优化理论的理解来说,就是要找到能使得${
{f}_{1}}(\mathbf{x})$和${ {f}_{2}}(\mathbf{x})$尽量趋近于0的$({ {x}_{1}},{ {x}_{2}})$。(至于这里为什么是二次方的和最小,而不是4次方、6次方...,这是一个非线性的方程组我还没法解释,如果是线性的到能解释——误差服从高斯分布)。ok,上面的问题可写为:$\operatorname{minimize}\text{ }f(\mathbf{x})\text{ for }\mathbf{x}\in {
{R}^{2}}$现在按照解一般优化问题的基本步骤走:
Step1:选择一个初始出点${
{\mathbf{x}}_{0}}$(这里的${ {\mathbf{x}}_{0}}$是向量),设置一个收敛误差$\varepsilon $(解的精度)和一个迭代次数$k=0$;Step2:找到从点${
{\mathbf{x}}_{k}}$使函数$f(x)$下降最快的方向${ {d}_{k}}$;由泰勒公式可知,如果一个函数足够平滑,在已知函数在某一点的各阶导数值的情况之下,泰勒公式可以用这些导数值做系数构建一个多项式来近似函数在这一点的邻域中的值。泰勒公式还给出了这个多项式和实际的函数值之间的偏差。
对于一个一元函数来说,泰勒公式可写为下式
$\begin{aligned}& f(x)=f({
{x}_{0}})+{f}'({ {x}_{0}})(x-{ {x}_{0}})+\frac{ {f}''({ {x}_{0}})}{2!}{ {(x-{ {x}_{0}})}^{2}}+ \\& \text{ }...+\frac{ { {f}^{(n)}}({ {x}_{0}})}{n!}{ {(x-{ {x}_{0}})}^{n}}+\frac{ { {f}^{(n+1)}}({ {x}_{0}})}{(n+1)!}{ {({ {x}_{0}}+\theta (x-{ {x}_{0}}))}^{n+1}} \\\end{aligned}$其中$0<\theta <1$,${
{x}_{0}}+\theta (x-{ {x}_{0}})=\xi $其实$\xi $就表示${ {x}_{0}}$与$x$之间的任意一点。现实中描述一个问题的时候,一般都有多个输入变量;在工程中一般认为展开到二阶导数就能精确的表示点${ {\mathbf{x}}_{k}}$周围任意一点${ {\mathbf{x}}_{k}}+\mathbf{\delta }$的函数值$f({ {\mathbf{x}}_{k}}+\mathbf{\delta })$,则有:\[\begin{aligned} & f({
{\mathbf{x}}_{k}}+\mathbf{\delta })=f({ {\mathbf{x}}_{k}})+{f}'({ {\mathbf{x}}_{k}})\mathbf{\delta }+\frac{1}{2}{ {\mathbf{\delta }}^{T}}{f}''({ {\mathbf{x}}_{k}})\mathbf{\delta }+O\left( { {\left\| \mathbf{\delta } \right\|}^{3}} \right) \\& \text{ =}f({ {\mathbf{x}}_{k}})+{ {\nabla }^{T}}f({ {\mathbf{x}}_{k}})\cdot \mathbf{\delta }+\frac{1}{2}{ {\mathbf{\delta }}^{T}}\cdot { {\nabla }^{2}}f({ {\mathbf{x}}_{k}})\cdot \mathbf{\delta }+O\left( { {\left\| \mathbf{\delta } \right\|}^{3}} \right) \\\end{aligned}\]从这里开始分各类算法,像最速下降法、牛顿法、拟牛顿法,这些方法的目的就是在找方向${
{d}_{k}}$。这些内容将在,02(b)、02(c)、02(e)中介绍。