最优化方法Python计算:构造正定矩阵的共轭向量

定义1 G ∈ R n × n \boldsymbol{G}\in\text{ℝ}^{n\times n} GRn×n为一正定矩阵。非零向量组 d 1 , d 2 , ⋯   , d m ∈ R n \boldsymbol{d}_1,\boldsymbol{d}_2,\cdots,\boldsymbol{d}_m\in\text{ℝ}^n d1,d2,,dmRn m ≤ n m\leq n mn)满足
d i ⊤ G d j = 0 , 1 ≤ i ≠ j ≤ m \boldsymbol{d}_i^{\top}\boldsymbol{G}\boldsymbol{d}_j=0,1\leq i\not=j\leq m diGdj=0,1i=jm
d 1 , d 2 , ⋯   , d m \boldsymbol{d}_1,\boldsymbol{d}_2,\cdots,\boldsymbol{d}_m d1,d2,,dm关于 G \boldsymbol{G} G共轭。
定理1 设无关向量组 α 1 , α 2 , ⋯   , α m ∈ R n \boldsymbol{\alpha}_1,\boldsymbol{\alpha}_2,\cdots,\boldsymbol{\alpha}_m\in\text{ℝ}^n α1,α2,,αmRn G ∈ R n × n \boldsymbol{G}\in\text{ℝ}^{n\times n} GRn×n为一正定阵。令,
d k = { α 1 k = 1 α k − ∑ i = 1 k − 1 α k ⊤ G d i d i ⊤ G d i d i 1 < k ≤ m \boldsymbol{d}_k=\begin{cases}\boldsymbol{\alpha}_1&k=1\\ \boldsymbol{\alpha}_{k}-\sum\limits_{i=1}^{k-1}\frac{\boldsymbol{\alpha}_{k}^\top\boldsymbol{G}\boldsymbol{d}_i}{\boldsymbol{d}_i^\top\boldsymbol{G}\boldsymbol{d}_i}\boldsymbol{d}_i&1dk= α1αki=1k1diGdiαkGdidik=11<km
d 1 , d 2 , ⋯   , d m \boldsymbol{d}_1,\boldsymbol{d}_2,\cdots,\boldsymbol{d}_m d1,d2,,dm关于 G \boldsymbol{G} G共轭。
利用定理1,下列Python函数将 R n \text{ℝ}^n Rn中的自然基 { e 1 , e 2 , ⋯   , e n } \{\boldsymbol{e}_1,\boldsymbol{e}_2,\cdots,\boldsymbol{e}_n\} {e1,e2,,en}(线性无关)转换为关于指定正定矩阵 G \boldsymbol{G} G共轭的向量组。

import numpy as np                                              #导入numpy
def conjugation(G):                                             #G为正定阵
    n,_=G.shape                                                 #G的行数
    A=np.eye(n)                                                 #初始线性无关组
    for k in range(1,n):                                        #依次构造G的共轭向量d2,...
        for i in range(k):                                      #按公式(3.3)构造dk
            numerator=np.matmul(np.matmul(A[:,k].T,G),A[:,i])   #第i项分子
            denominator=np.matmul(np.matmul(A[:,i].T,G),A[:,i]) #第i项分母
            A[:,k]-=numerator/denominator*A[:,i]                #减去第i项
    return A

程序的第2~10行定义函数conjugation,参数G表示正定阵 G \boldsymbol{G} G,计算关于 G \boldsymbol{G} G的共轭向量 { d 1 , d 2 , ⋯   , d n } \{\boldsymbol{d}_1,\boldsymbol{d}_2,\cdots,\boldsymbol{d}_n\} {d1,d2,,dn}。第3行读取G的行数n。第4行调用numpy的eye函数生成n阶单位阵 I n \boldsymbol{I}_n In(每一列为一单位向量,所有列构成一线性无关组)赋予A。第5 ~9行的for循环,按定理1构造 G \boldsymbol{G} G的共轭向量 { d k , k = 2 , ⋯   , n } \{\boldsymbol{d}_k,k=2,\cdots,n\} {dk,k=2,,n} d 1 \boldsymbol{d}_1 d1即为A的第1列A[:,0])。对表示第 k k k个向量 d k \boldsymbol{d}_k dk的A的第k列A[:,k],第6 ~9行的for循环按式(3.3)计算:第7行
np.matmul(np.matmul(A[:,k].T,G),A[:,i]) \text{np.matmul(np.matmul(A[:,k].T,G),A[:,i])} np.matmul(np.matmul(A[:,k].T,G),A[:,i])
计算 α k ⊤ G d i \boldsymbol{\alpha}_k^\top\boldsymbol{G}\boldsymbol{d}_i αkGdi赋予numerator,第8行
np.matmul(np.matmul(A[:,i].T,G),A[:,i]) \text{np.matmul(np.matmul(A[:,i].T,G),A[:,i])} np.matmul(np.matmul(A[:,i].T,G),A[:,i])
计算 d i ⊤ G d i \boldsymbol{d}_i^\top\boldsymbol{G}\boldsymbol{d}_i diGdi赋予denominator,第9行计算
numerator/denominator*A[:,i] \text{numerator/denominator*A[:,i]} numerator/denominator*A[:,i]
计算 α k ⊤ G d i d i ⊤ G d i d i \frac{\boldsymbol{\alpha}_{k}^\top\boldsymbol{G}\boldsymbol{d}_i}{\boldsymbol{d}_i^\top\boldsymbol{G}\boldsymbol{d}_i}\boldsymbol{d}_i diGdiαkGdidi并用其与A[:,k](表示 α k \boldsymbol{\alpha}_k αk)相减。循环完成,按定理1, d k \boldsymbol{d}_k dk的计算完成。执行函数完毕,返回存储在A中 G n × n \boldsymbol{G}_{n\times n} Gn×n的共轭向量组 { d 1 , d 2 , ⋯   , d n } \{\boldsymbol{d}_1,\boldsymbol{d}_2,\cdots,\boldsymbol{d}_n\} {d1,d2,,dn}。conjugation函数可以用来构造正定矩阵的满秩共轭向量组。
例1 对正定阵 G = ( 3 0 1 0 4 2 1 2 3 ) ∈ R 3 × 3 \boldsymbol{G}=\begin{pmatrix}3&0&1\\0&4&2\\1&2&3\end{pmatrix}\in\text{ℝ}^{3\times3} G= 301042123 R3×3构造一组共轭相量 { d 1 , d 2 , d 3 } \{\boldsymbol{d}_1,\boldsymbol{d}_2,\boldsymbol{d}_3\} {d1,d2,d3}
:下列代码完成计算。

import numpy as np                      #导入numpy
G=np.array([[3,0,1],                    #设置正定矩阵G
            [0,4,2],
            [1,2,3]],dtype='float')
print(conjugation(G))                   #计算并输出共轭向量组

程序很简单,借助注释信息不难理解。运行程序,输出

[[ 1.          0.         -0.33333333]
 [ 0.          1.         -0.5       ]
 [ 0.          0.          1.        ]]

即得到了关于 G = ( 3 0 1 0 4 2 1 2 3 ) \boldsymbol{G}=\begin{pmatrix}3&0&1\\0&4&2\\1&2&3\end{pmatrix} G= 301042123 的共轭向量组为 d 1 = ( 1 0 0 ) \boldsymbol{d}_1=\begin{pmatrix} 1\\0\\0 \end{pmatrix} d1= 100 d 2 = ( 0 1 0 ) \boldsymbol{d}_2=\begin{pmatrix} 0\\1\\0 \end{pmatrix} d2= 010 d 3 = ( − 1 3 − 1 2 1 ) \boldsymbol{d}_3=\begin{pmatrix} -\frac{1}{3}\\-\frac{1}{2}\\1 \end{pmatrix} d3= 31211

你可能感兴趣的:(最优化方法,python,矩阵)