[python]施密特正交化的几何解释与代码实现

1、施密特正交化的几何解释

给定一组基α1,α2,...,αn,将其变换成另外一组正交基β1,β2,...,βn,使这两组基等价
施密特正交化方法:


image.png

首先清除一个公式,两个向量α,β,那么α在β上的投影向量为
image.png

如图红色部分即为投影部分


在这里插入图片描述

则蓝色部分向量为


image.png

对应两个向量的施密特法则


image.png

可见蓝色向量为β2与β1是垂直的
而当向量个数为3时,对应三维空间的几何解释如图


在这里插入图片描述

其中绿色的为需要正交的原始基αi(α1是红色的因为α1同时也是β1)
将二维得到的β2平移到坐标原点出后则α3在xoy平面的投影即是


image.png

即α3在β1和β2上的投影组成的平行四边形的斜边,则得到的β3就是α3与该投影的向量差,即红色部分的β3,显然可以看出来β1,β2,β3是正交的。
同样可以推广到三维以上的欧氏空间Rm,即施密特正交公式。

2、代码实现

import numpy as np
A = np.array([[1,1,0],[0,1,1],[1,0,1]],dtype=float)
Q = np.zeros_like(A)
m, n = Q.shape
cnt = 0
for a in A.T:
    u = np.copy(a)
    for i in range(0, cnt):
        u -= np.dot(np.dot(Q[:, i].T, a), Q[:, i]) # 减去待求向量在以求向量上的投影
    e = u / np.linalg.norm(u)  # 归一化
    Q[:, cnt] = e
    cnt += 1
print(Q)

或者

from scipy import linalg
A = np.array([[1,1,0],[0,1,1],[1,0,1]])
a = linalg.orth(A)
print(np.array(linalg.orth(A),dtype=float))
print(np.dot(A,A.T)-1)

参考:
1、施密特正交化的几何解释
2、自己动手写施密特正交化

你可能感兴趣的:([python]施密特正交化的几何解释与代码实现)