- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
利用C程序编写格拉姆-施密特正交化的过程.
利用C程序编写格拉姆-施密特正交化的过程格拉姆-施密特正交化在线性代数中,如果内积空间上的一组向量能够组成一个子空间,那么这一组向量就称为这个子空间的一个基。Gram-Schmidt正交化提供了一种方法,能够通过这一子空间上的一个基得出子空间的一个正交基,并可进一步求出对应的标准正交基。这种正交化方法以J?rgen Pedersen Gram和Erhard Schmidt命名,然而比他们更早的拉普拉斯(Laplace)和柯西(Cauchy)已经发现了这一方法。在李群分解中,这种方法被推广为岩泽分解(Iwasawa decomposition)。在数值计算中,Gram-Schmidt正交化是数值不稳定的,计算中累积的舍入误差会使最终结果的正交性变得很差。因此在实际应用中通常使用豪斯霍尔德变换或Givens旋转进行正交化。记法:维数为n?的内积空间:中的元素,可以是向量、函数,等等:与的内积:、……张成的子空间:在上的投影基本思想Gram-Schmidt正交化的基本想法,是利用投影原理在已有正交基的基础上构造一个新的正交基。设。是上的维子空间,其标准正交基为,且不在上。由投影原理知,与其在上的投影之差是正交于子空间的,亦即正交于的正交基。因此只要将单位化,即那么就是在上扩展的子空间的标准正交基。根据上述分析,对于向量组张成的空间?(),只要从其中一个向量(不妨设为)所张成的一维子空间开始(注意到就是的正交基),重复上述扩展构造正交基的过程,就能够得到?的一组正交基。这就是Gram-Schmidt正交化。算法首先需要确定已有基底向量的顺序,不妨设为。Gram-Schmidt正交化的过程如下:这样就得到上的一组正交基,以及相应的标准正交基。例考察如下欧几里得空间Rn中向量的集合,欧氏空间上内积的定义为a,?b =?bTa:下面作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]表示正交化过程中向量前的系数 for(j=0;jM;j++) //j表示每个向量中的坐标 for(m=0;mi;m++) b[i][j]-=k[m]*b[m][j];} printf(正交化结果为:\n); for(i=0;iN;i++) { printf(第%d个向量是:\n,i+1); for(j=0;jM;j++) printf(%g ,b[i][j]); putchar(\n);}//下面是单位化过程 for(i=0;iN;i++) for(j=0;jM;j++) p[i][j]=b[i][j]/sqrt(zj(b[i],b[i])); printf(\n单位化结果为:\n); for(i=0;iN;i++) { printf(第%d个向量是:\n,i+1); for(j=0;jM;j++) printf(%g ,p[i][j]); putchar(\n);}}实验结果如下:实践课总结: 在这次实践课的课题讨论中,我所在的这个组个个都发挥自己得能动性。都积极主动。拿到课题后,我们马上讨论分工,针对自己所分到得板块去查阅资料,然后再次讨论总结,最后每个人都提出问题共同解决。 当然,在整个过程中遇到问题也是必然的。例如,由于对C语言不熟练而
文档评论(0)