将ℝ的一个无关组正交化为的计算公式为:
将上述公式写成下列的Python函数:
import numpy as np #导入numpy
def orthogonalize(A): #计算存储在A中的向量组正交化
_,k=A.shape #读取向量个数k
B=A.copy() #将A拷贝为B
for i in range(1,k): #计算B的第1~k-1列
for j in range(i): #计算B[:,i]
B[:,i]-=(np.dot(B[:,j],A[:,i])/np.dot(B[:,j],B[:,j]))*B[:,j]
return B #正交化结果
程序的第2~8行定义无关向量组正交化函数orthogonalize,无关向量组以列的形式存储于参数A。第3行读取存储在A中的向量个数k。第4行将A的副本拷贝为B,作为正交化向量的初始值。第5~7行的两重for循环完成正交化向量组B的计算,外层for循环扫描B中从第2列(下标为1)开始的每一列(下标为0的第1列存储的是,不用处理),内层的for循环对B的当前列(下标为i)按公式
计算。注意,Python用复合赋值运算符x-=a表示x=x-a。由于B在第4行拷贝为A的副本,故B[:,i]的初始值就是。而B[:,[1:i]]中存储的是在当前的计算前已经计算完毕的诸,注意numpy的dot函数完成向量的内积运算。循环完成,B中存储的就是正交化后的向量组。
对正交换后的向量组,可以用下列定义的函数作单位化处理。
import numpy as np #导入numpy
def unitization(A): #A中存储各列向量
_,k=A.shape #读取向量个数
for i in range(k): #对每一个向量
A[:,i]/=np.linalg.norm(A[:,i]) #单位化
待单位化的向量以列的形式组织于函数unitization的参数A中。第3行读取向量个数k。第4~5行的for循环对A的每一列A[:,i](i取遍0~k-1),用自身的模(调用np.linalg的norm函数计算)除该列元素,即。循环结束,A中各列均完成单位化操作。
例1 用Python计算向量组ℝ的正交化及单位化。
import numpy as np #导入numpy
np.set_printoptions(precision=4, suppress=True) #设置输出精度
A=np.array([[1,1,-1], #向量组矩阵
[0,-1,1],
[-1,0,1],
[1,1,0]],dtype='float')
B=orthogonalize(A) #正交化
print(B)
unitization(B) #单位化
print(B)
程序的第3~6行设置由向量作为列构成的矩阵A。第7行调用以上定义的正交化函数orthogonalize对存储在A中的列向量正交化,得保存在B中的正交化后的向量组。第8行调用上述定义的单位化函数unitization将存储在B中的两两正交向量组单位化。运行程序,输出
[[ 1. 0.3333 -0.2 ]
[ 0. -1. 0.6 ]
[-1. 0.6667 0.6 ]
[ 1. 0.3333 0.8 ]]
[[ 0.5774 0.2582 -0.169 ]
[ 0. -0.7746 0.5071]
[-0.5774 0.5164 0.5071]
[ 0.5774 0.2582 0.6761]]
前四行表示正交化后的结果精确到万分位的近似值。后四行表示对单位化后的结果。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!