定义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<k\leq m\end{cases}
dk=⎩
⎨
⎧α1αk−i=1∑k−1di⊤Gdiαk⊤Gdidik=11<k≤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,下列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
。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!