实现
消去法
要实现消去法,需要计算满足
的满秩矩阵
求解 KKT 系统
计算 Newton 步或不可行 Newton 步都要求解 KKT 形式的线性方程组
其中假设
直接求解完整的 KKT 系统
最直接的方法是把 KKT 系统当作关于
通过消去求解 KKT 系统
通常更好的方法是基于消去变量
解出
由于
算法 10.3(分块消去求解 KKT 系统) 给定
- 形成
和 。 - 形成 Schur 补
。 - 解
确定 。 - 解
确定 。
第 1 步可通过
若能高效分解
例子:等式约束解析中心。问题
例子:带等式约束的最短分段线性曲线。在
奇异时的消去法
当
取使
而新系统的左上块正定,可以用消去法求解。
例子
本节给出几个较长的例子,展示如何利用结构高效计算 Newton 步。
等式约束解析中心
考虑问题
方法一:带等式约束的 Newton 方法。 Newton 步由 KKT 系统定义,利用消去法求解:先解
再由
方法二:对偶 Newton 方法。 对对偶问题
给出。比较两式可见两种方法的计算复杂度相同。
方法三:不可行初始点 Newton 方法。 应用于最优性条件
然后
实验(

上图由下面的 TikZ 代码编译而来:
\definecolor{cblue}{RGB}{31,119,180}
\definecolor{cred}{RGB}{214,39,40}
\definecolor{cgreen}{RGB}{44,160,44}
\definecolor{corange}{RGB}{255,127,14}
\definecolor{cpurple}{RGB}{148,103,189}
\definecolor{cbrown}{RGB}{140,86,75}
\definecolor{cpink}{RGB}{227,119,194}
\definecolor{cgray}{RGB}{127,127,127}
\begin{tikzpicture}[x=1cm,y=1cm,>=stealth,line cap=round,line join=round]
\draw[color=black!25,very thin] (0.0000,0.0000) -- (6.6000,0.0000) (0.0000,0.2687) -- (6.6000,0.2687) (0.0000,0.5375) -- (6.6000,0.5375) (0.0000,0.8062) -- (6.6000,0.8062) (0.0000,1.0750) -- (6.6000,1.0750) (0.0000,1.3438) -- (6.6000,1.3438) (0.0000,1.6125) -- (6.6000,1.6125) (0.0000,1.8812) -- (6.6000,1.8812) (0.0000,2.1500) -- (6.6000,2.1500) (0.0000,2.4187) -- (6.6000,2.4187) (0.0000,2.6875) -- (6.6000,2.6875) (0.0000,2.9562) -- (6.6000,2.9562) (0.0000,3.2250) -- (6.6000,3.2250) (0.0000,3.4937) -- (6.6000,3.4937) (0.0000,3.7625) -- (6.6000,3.7625) (0.0000,4.0313) -- (6.6000,4.0313) (0.0000,4.3000) -- (6.6000,4.3000);
\draw[color=black!15,very thin] (0.0000,0.0000) -- (0.0000,4.3000) (0.7333,0.0000) -- (0.7333,4.3000) (1.4667,0.0000) -- (1.4667,4.3000) (2.2000,0.0000) -- (2.2000,4.3000) (2.9333,0.0000) -- (2.9333,4.3000) (3.6667,0.0000) -- (3.6667,4.3000) (4.4000,0.0000) -- (4.4000,4.3000) (5.1333,0.0000) -- (5.1333,4.3000) (5.8667,0.0000) -- (5.8667,4.3000) (6.6000,0.0000) -- (6.6000,4.3000);
\draw[->,color=black!60] (0.0000,0.0000) -- (6.9500,0.0000) node[anchor=west,xshift=2pt,yshift=-6pt] {$k$};
\draw[->,color=black!60] (0.0000,0.0000) -- (0.0000,4.6500) node[left=1pt] {$f-p^{\star}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,0.0000) {$10^{-14}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,0.2687) {$10^{-13}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,0.5375) {$10^{-12}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,0.8062) {$10^{-11}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,1.0750) {$10^{-10}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,1.3438) {$10^{-9}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,1.6125) {$10^{-8}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,1.8812) {$10^{-7}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,2.1500) {$10^{-6}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,2.4187) {$10^{-5}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,2.6875) {$10^{-4}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,2.9562) {$10^{-3}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,3.2250) {$10^{-2}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,3.4937) {$10^{-1}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,3.7625) {1};
\node[left,font=\scriptsize,color=black!60] at (0.0000,4.0313) {$10$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,4.3000) {$10^{2}$};
\node[below,font=\scriptsize,color=black!60] at (0.0000,0.0000) {0};
\node[below,font=\scriptsize,color=black!60] at (0.7333,0.0000) {1};
\node[below,font=\scriptsize,color=black!60] at (1.4667,0.0000) {2};
\node[below,font=\scriptsize,color=black!60] at (2.2000,0.0000) {3};
\node[below,font=\scriptsize,color=black!60] at (2.9333,0.0000) {4};
\node[below,font=\scriptsize,color=black!60] at (3.6667,0.0000) {5};
\node[below,font=\scriptsize,color=black!60] at (4.4000,0.0000) {6};
\node[below,font=\scriptsize,color=black!60] at (5.1333,0.0000) {7};
\node[below,font=\scriptsize,color=black!60] at (5.8667,0.0000) {8};
\node[below,font=\scriptsize,color=black!60] at (6.6000,0.0000) {9};
\draw[cblue,very thick] plot coordinates {(0.000,3.684) (0.733,3.085) (1.467,2.172) (2.200,0.561) (2.933,-0.269)};
\draw[cred,very thick] plot coordinates {(0.000,3.811) (0.733,3.377) (1.467,2.825) (2.200,1.925) (2.933,-0.269) (3.667,-0.269)};
\draw[cgreen,very thick] plot coordinates {(0.000,4.010) (0.733,3.743) (1.467,3.426) (2.200,3.003) (2.933,2.277) (3.667,0.844) (4.400,-0.269)};
\draw[corange,very thick] plot coordinates {(0.000,4.038) (0.733,3.888) (1.467,3.778) (2.200,3.672) (2.933,3.533) (3.667,3.301) (4.400,2.866) (5.133,2.010) (5.867,0.349) (6.600,-0.269)};
\node[anchor=south] at (3.3,4.8999999999999995) {primal Newton, four starting points};
\end{tikzpicture}
上图由下面的 TikZ 代码编译而来:
\definecolor{cblue}{RGB}{31,119,180}
\definecolor{cred}{RGB}{214,39,40}
\definecolor{cgreen}{RGB}{44,160,44}
\definecolor{corange}{RGB}{255,127,14}
\definecolor{cpurple}{RGB}{148,103,189}
\definecolor{cbrown}{RGB}{140,86,75}
\definecolor{cpink}{RGB}{227,119,194}
\definecolor{cgray}{RGB}{127,127,127}
\begin{tikzpicture}[x=1cm,y=1cm,>=stealth,line cap=round,line join=round]
\draw[color=black!25,very thin] (0.0000,0.0000) -- (6.6000,0.0000) (0.0000,0.2529) -- (6.6000,0.2529) (0.0000,0.5059) -- (6.6000,0.5059) (0.0000,0.7588) -- (6.6000,0.7588) (0.0000,1.0118) -- (6.6000,1.0118) (0.0000,1.2647) -- (6.6000,1.2647) (0.0000,1.5176) -- (6.6000,1.5176) (0.0000,1.7706) -- (6.6000,1.7706) (0.0000,2.0235) -- (6.6000,2.0235) (0.0000,2.2765) -- (6.6000,2.2765) (0.0000,2.5294) -- (6.6000,2.5294) (0.0000,2.7824) -- (6.6000,2.7824) (0.0000,3.0353) -- (6.6000,3.0353) (0.0000,3.2882) -- (6.6000,3.2882) (0.0000,3.5412) -- (6.6000,3.5412) (0.0000,3.7941) -- (6.6000,3.7941) (0.0000,4.0471) -- (6.6000,4.0471) (0.0000,4.3000) -- (6.6000,4.3000);
\draw[color=black!15,very thin] (0.0000,0.0000) -- (0.0000,4.3000) (0.9429,0.0000) -- (0.9429,4.3000) (1.8857,0.0000) -- (1.8857,4.3000) (2.8286,0.0000) -- (2.8286,4.3000) (3.7714,0.0000) -- (3.7714,4.3000) (4.7143,0.0000) -- (4.7143,4.3000) (5.6571,0.0000) -- (5.6571,4.3000) (6.6000,0.0000) -- (6.6000,4.3000);
\draw[->,color=black!60] (0.0000,0.0000) -- (6.9500,0.0000) node[anchor=west,xshift=2pt,yshift=-6pt] {$k$};
\draw[->,color=black!60] (0.0000,0.0000) -- (0.0000,4.6500) node[left=1pt] {$p^{\star}-g$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,0.0000) {$10^{-14}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,0.2529) {$10^{-13}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,0.5059) {$10^{-12}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,0.7588) {$10^{-11}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,1.0118) {$10^{-10}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,1.2647) {$10^{-9}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,1.5176) {$10^{-8}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,1.7706) {$10^{-7}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,2.0235) {$10^{-6}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,2.2765) {$10^{-5}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,2.5294) {$10^{-4}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,2.7824) {$10^{-3}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,3.0353) {$10^{-2}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,3.2882) {$10^{-1}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,3.5412) {1};
\node[left,font=\scriptsize,color=black!60] at (0.0000,3.7941) {$10$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,4.0471) {$10^{2}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,4.3000) {$10^{3}$};
\node[below,font=\scriptsize,color=black!60] at (0.0000,0.0000) {0};
\node[below,font=\scriptsize,color=black!60] at (0.9429,0.0000) {1};
\node[below,font=\scriptsize,color=black!60] at (1.8857,0.0000) {2};
\node[below,font=\scriptsize,color=black!60] at (2.8286,0.0000) {3};
\node[below,font=\scriptsize,color=black!60] at (3.7714,0.0000) {4};
\node[below,font=\scriptsize,color=black!60] at (4.7143,0.0000) {5};
\node[below,font=\scriptsize,color=black!60] at (5.6571,0.0000) {6};
\node[below,font=\scriptsize,color=black!60] at (6.6000,0.0000) {7};
\draw[cblue,very thick] plot coordinates {(0.000,4.201) (0.943,4.118) (1.886,3.988) (2.829,3.769) (3.771,3.365) (4.714,2.579) (5.657,1.010) (6.600,0.267)};
\draw[cred,very thick] plot coordinates {(0.000,4.043) (0.943,3.864) (1.886,3.543) (2.829,2.930) (3.771,1.711) (4.714,0.343)};
\draw[cgreen,very thick] plot coordinates {(0.000,3.781) (0.943,3.444) (1.886,2.733) (2.829,1.319) (3.771,0.267)};
\draw[corange,very thick] plot coordinates {(0.000,3.965) (0.943,3.864) (1.886,3.543) (2.829,2.930) (3.771,1.711) (4.714,0.267)};
\node[anchor=south] at (3.3,4.8999999999999995) {dual Newton, four starting points};
\end{tikzpicture}
上图由下面的 TikZ 代码编译而来:
\definecolor{cblue}{RGB}{31,119,180}
\definecolor{cred}{RGB}{214,39,40}
\definecolor{cgreen}{RGB}{44,160,44}
\definecolor{corange}{RGB}{255,127,14}
\definecolor{cpurple}{RGB}{148,103,189}
\definecolor{cbrown}{RGB}{140,86,75}
\definecolor{cpink}{RGB}{227,119,194}
\definecolor{cgray}{RGB}{127,127,127}
\begin{tikzpicture}[x=1cm,y=1cm,>=stealth,line cap=round,line join=round]
\draw[color=black!25,very thin] (0.0000,0.0000) -- (6.6000,0.0000) (0.0000,0.2687) -- (6.6000,0.2687) (0.0000,0.5375) -- (6.6000,0.5375) (0.0000,0.8062) -- (6.6000,0.8062) (0.0000,1.0750) -- (6.6000,1.0750) (0.0000,1.3438) -- (6.6000,1.3438) (0.0000,1.6125) -- (6.6000,1.6125) (0.0000,1.8812) -- (6.6000,1.8812) (0.0000,2.1500) -- (6.6000,2.1500) (0.0000,2.4187) -- (6.6000,2.4187) (0.0000,2.6875) -- (6.6000,2.6875) (0.0000,2.9562) -- (6.6000,2.9562) (0.0000,3.2250) -- (6.6000,3.2250) (0.0000,3.4937) -- (6.6000,3.4937) (0.0000,3.7625) -- (6.6000,3.7625) (0.0000,4.0313) -- (6.6000,4.0313) (0.0000,4.3000) -- (6.6000,4.3000);
\draw[color=black!15,very thin] (0.0000,0.0000) -- (0.0000,4.3000) (0.7333,0.0000) -- (0.7333,4.3000) (1.4667,0.0000) -- (1.4667,4.3000) (2.2000,0.0000) -- (2.2000,4.3000) (2.9333,0.0000) -- (2.9333,4.3000) (3.6667,0.0000) -- (3.6667,4.3000) (4.4000,0.0000) -- (4.4000,4.3000) (5.1333,0.0000) -- (5.1333,4.3000) (5.8667,0.0000) -- (5.8667,4.3000) (6.6000,0.0000) -- (6.6000,4.3000);
\draw[->,color=black!60] (0.0000,0.0000) -- (6.9500,0.0000) node[anchor=west,xshift=2pt,yshift=-6pt] {$k$};
\draw[->,color=black!60] (0.0000,0.0000) -- (0.0000,4.6500) node[left=1pt] {$\|r\|$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,0.0000) {$10^{-13}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,0.2687) {$10^{-12}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,0.5375) {$10^{-11}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,0.8062) {$10^{-10}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,1.0750) {$10^{-9}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,1.3438) {$10^{-8}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,1.6125) {$10^{-7}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,1.8812) {$10^{-6}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,2.1500) {$10^{-5}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,2.4187) {$10^{-4}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,2.6875) {$10^{-3}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,2.9562) {$10^{-2}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,3.2250) {$10^{-1}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,3.4937) {1};
\node[left,font=\scriptsize,color=black!60] at (0.0000,3.7625) {$10$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,4.0313) {$10^{2}$};
\node[left,font=\scriptsize,color=black!60] at (0.0000,4.3000) {$10^{3}$};
\node[below,font=\scriptsize,color=black!60] at (0.0000,0.0000) {0};
\node[below,font=\scriptsize,color=black!60] at (0.7333,0.0000) {1};
\node[below,font=\scriptsize,color=black!60] at (1.4667,0.0000) {2};
\node[below,font=\scriptsize,color=black!60] at (2.2000,0.0000) {3};
\node[below,font=\scriptsize,color=black!60] at (2.9333,0.0000) {4};
\node[below,font=\scriptsize,color=black!60] at (3.6667,0.0000) {5};
\node[below,font=\scriptsize,color=black!60] at (4.4000,0.0000) {6};
\node[below,font=\scriptsize,color=black!60] at (5.1333,0.0000) {7};
\node[below,font=\scriptsize,color=black!60] at (5.8667,0.0000) {8};
\node[below,font=\scriptsize,color=black!60] at (6.6000,0.0000) {9};
\draw[cblue,very thick] plot coordinates {(0.000,4.374) (0.733,4.023) (1.467,3.736) (2.200,3.632) (2.933,3.517) (3.667,3.371) (4.400,3.147) (5.133,2.733) (5.867,1.912) (6.600,0.377)};
\draw[cred,very thick] plot coordinates {(0.000,4.309) (0.733,3.757) (1.467,3.503) (2.200,3.226) (2.933,2.791) (3.667,1.978) (4.400,0.422)};
\draw[cgreen,very thick] plot coordinates {(0.000,4.176) (0.733,4.095) (1.467,3.443) (2.200,3.070) (2.933,2.481) (3.667,1.367) (4.400,0.358)};
\draw[corange,very thick] plot coordinates {(0.000,4.440) (0.733,4.360) (1.467,3.643) (2.200,3.332) (2.933,2.883) (3.667,2.153) (4.400,0.771)};
\node[anchor=south] at (3.3,4.8999999999999995) {infeasible-start Newton, four starting points};
\end{tikzpicture}最优网络流
考虑一个有
守恒方程只有在
以流量
Hessian 是对角阵(目标可分)。计算 Newton 步最直接的方法是用稀疏
最优控制
考虑问题
其中
把所有等式约束(状态方程)写成
对这个问题还可以更进一步利用
线性矩阵不等式的解析中心
考虑问题
变量
选择一:求解对偶问题。
(定义域
选择二:利用矩阵结构求解原始问题。 对 KKT 条件中的第一式(在
可以用分块消去高效求解:由第一式解出
代入第二式得到关于