- 9
- 0
- 约2.86千字
- 约 7页
- 2023-01-08 发布于上海
- 举报
利用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(b[m],b[m]); //k[m]表示正交化过程中向
原创力文档

文档评论(0)