定义1 设 G ∈ R n × n \boldsymbol{G}\in\text{ℝ}^{n\times n} G∈Rn×n为一正定矩阵。非零向量组 d 1 , d 2 , ⋯ , d m ∈ R n \boldsymbol{d}_1,\boldsymbol{d}_2,\cdots,\boldsymbol{d}_m\in\text{ℝ}^n d1,d2,⋯,dm∈Rn( m ≤ n m\leq n m≤n)满足
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 di⊤Gdj=0,1≤i=j≤m
称 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,⋯,αm∈Rn, G ∈ R n × n \boldsymbol{G}\in\text{ℝ}^{n\times n} G∈Rn×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&1
则 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 αk⊤Gdi赋予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 di⊤Gdi赋予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 di⊤Gdiαk⊤Gdidi并用其与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= −31−211 。