利用C程序编写格拉姆_施密特正交化的过程.pdfVIP

  • 9
  • 0
  • 约2.89千字
  • 约 7页
  • 2023-01-08 发布于上海
  • 举报

利用C程序编写格拉姆_施密特正交化的过程.pdf

利用C程序编写格拉姆-施密特正交化的过程 格拉姆-施密特正交化 在线性代数中,如果内积空间上的一组向量能够组成一个子空间,那么这一组向量就称为这个子空间的 一个基。Gram -Schmidt正交化提供了一种方法,能够通过这一子空间上的一个基得出子空间的一个正 交基,并可进一步求出对应的标准正交基。 这种正交化方法以Jørgen Pedersen Gram和Erhard Schmidt命名,然而比他们更早的拉普拉斯 (Laplace) 和柯西 (Cauchy)已经发现了这一方法。在李群分解中,这种方法被推广为岩泽分解 (Iwasawa decomposition)。 在数值计算中,Gram -Schmidt正交化是数值不稳定的,计算中累积的舍入误差会使最终结果的正交性 变得很差。因此在实际应用中通常使用豪斯霍尔德变换或Givens旋转进行正交化。 记法 l :维数为n 的内积空间 l : 中的元素,可以是向量、函数,等等 l : 与 的内积 l : 、 …… 张成的子空间 l : 在 上的投影 基本思想 Gram-Schmidt正交化的基本想法,是利用投影原理在已有正交基的基础上构造一个新的正交基。 设 。 是 上的 维子空间,其标准正交基为 ,且 不在 上。由投影原理 知, 与其在 上的投影 之差 是正交于子空间 的,亦即 正交于 的正交基 。因此只要将 单位化,即 那么 就是 在 上扩展的子空间 的标准正交基。 根据上述分析,对于向量组 张成的空间 ( ) ,只要从其中一个向量(不妨设为 )所张成的一维子空间 开始(注意到 就是 的正交基),重复上述扩展构造正 交基的过程,就能够得到 的一组正交基。这就是Gram-Schmidt正交化。 算法 首先需要确定已有基底向量的顺序,不妨设为 。Gram-Schmidt正交化的过程如下: 这样就得到 上的一组正交基 ,以及相应的标准正交基 。 例 n T 考察如下欧几里得空间R 中向量的集合,欧氏空间上内积的定义为a, b b a: 下面作Gram -Schmidt正交化,以得到一组正交向量: 下面验证向量 与 的正交性: 将这些向量单位化: 于是 就是 的一组标准正交基底。 不同的形式 随着内积空间上内积的定义以及构成内积空间的元素的不同,Gram-Schmidt正交化也表现出不同的形 式。 例如,在实向量空间上,内积定义为: 在复向量空间上,内积定义为: 函数之间的内积则定义为: 与之对应,相应的Gram -Schmidt正交化就具有不同的形式。 利用C程序编写格拉姆-施密特正交化的过程 C语言程序如下: #include stdio.h #include math.h #define N 3 //N表示基的个数 #define M 4 //M表示维数 float zj(float a[],float b[]) //这是求内积函数 {int i; float k=0; for(i=0;iM;i++) k+=a[i]*b[i]; return k; } main() {float p[N][M],b[N][M],k[N]; int i,j,m; for(i=0;iN;i++) { printf(请输入第%d个向量:\n,i+1); for(j=0;jM;j++) scanf(%f,p[i]+j);} for(i=0;iN*M;i++) b[0][i]=p[0][i]; //下面是正交化过程 for(i=1;iN;i++) //i表示第i个向量 { for(m=0;mi;m++) k[m]=zj(b[i],b[m])/zj

文档评论(0)

1亿VIP精品文档

相关文档