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

合集下载

格拉姆施密特正交化证明过程

格拉姆施密特正交化证明过程

格拉姆施密特正交化证明过程嘿,咱今儿个就来聊聊格拉姆施密特正交化证明过程这档子事儿。

你说这格拉姆施密特正交化,就像是一个神奇的魔法,能把一堆杂乱无章的向量变得整整齐齐、相互正交。

这可太有意思啦!想象一下,那些向量就像是一群调皮的孩子,在那里跑来跑去,没个规矩。

而格拉姆施密特正交化呢,就像是一位厉害的老师,把这些孩子一个个地拉过来,教导他们要站直了,别歪七扭八的,要相互尊重,保持垂直。

咱先从第一个向量开始,把它当作基准,让其他向量都向它看齐。

这就好比是在一群人中先找出一个带头的,其他人都跟着他走。

然后呢,对于第二个向量,咱就把它投影到第一个向量上,把这个投影的部分去掉,剩下的不就是和第一个向量正交的部分啦?这多巧妙啊!就好像把一个东西拆分成两个不同的部分,一个是和别人有关系的,一个是独特的自己。

接着,对于第三个向量,咱又得把它分别投影到前面两个向量上,把那些重叠的部分去掉,留下那独一无二的正交部分。

这就跟搭积木似的,一层一层地往上搭,每一层都有自己的特点,但又和下面的层相互配合。

这样一步一步地进行下去,那些向量就变得越来越规矩,越来越正交啦!这证明过程不就像是一场奇妙的冒险嘛!在这个过程中,咱们得仔细地计算,不能有一点儿马虎。

你说这数学咋就这么神奇呢?能想出这么厉害的方法来让这些向量乖乖听话。

而且啊,这格拉姆施密特正交化在好多领域都有用呢,比如在信号处理啦,图像处理啦,都能看到它的身影。

咱普通人可能觉得这玩意儿高深莫测,但其实只要咱静下心来,好好琢磨琢磨,也能明白个大概。

就像爬山一样,一开始觉得那山好高好难爬,但只要一步一步地往上走,总能爬到山顶,看到那美丽的风景。

所以啊,别被这格拉姆施密特正交化证明过程给吓住啦!大胆地去探索,去发现,你会发现其中的乐趣和奥秘的。

相信我,等你真的搞懂了,你肯定会感叹:哇塞,原来这么神奇啊!这不就像是打开了一扇通往新世界的大门嘛!怎么样,准备好和我一起去探索这个神奇的数学世界了吗?。

施密特正交化计算的步骤

施密特正交化计算的步骤

施密特正交化计算的步骤1. 引言嘿,大家好!今天我们来聊聊施密特正交化,这可是个数学界的小英雄,让我们在高维空间里轻松自如!听上去有点复杂,但其实就像做菜,只要掌握了步骤,轻松搞定不在话下。

要不,我们一起来“下厨房”,看看这道数学大餐该怎么做吧!2. 施密特正交化的基本概念首先,施密特正交化的目标就是把一组线性无关的向量,变成一组正交的向量。

哎呀,正交就是彼此垂直的意思,你想想,像两个小朋友玩“捉迷藏”,总得分开藏才行嘛!这不仅好看,而且在后续计算中可谓是事半功倍。

你只需拿出几根向量,就能创造出一片正交的天地,真是太酷了!2.1 向量的准备好的,我们先准备一些向量,假设有三个小伙伴,向量A、B、C。

哇,它们在一起真是热闹,但没经过施密特的洗礼,它们的关系有点“乱”,不太好相处。

我们要把它们理顺一下,先让A登场,大家伙准备好接招了吗?2.2 开始正交化首先,咱们把A向量给定为“第一位”,然后让它保持不变。

接着,B向量要向A的方向靠拢,先把它的“影子”投影到A上,记住,投影就像给B戴上了A的“面具”。

所以我们要从B中减去这个“面具”,这样B就变得更清晰,更好相处了。

接下来,C向量也不甘示弱,照样要经过A和B的考验。

就这么一来二去,向量们一个个都被正交化了,活脱脱像一群舞者在舞台上翩翩起舞。

3. 正交化的公式行了,数学公式也不能缺席。

施密特正交化的核心公式其实不复杂,记住几个简单的步骤就行。

首先,对于任意的向量,记得计算投影:。

projA(B) = frac{B cdot A{A cdot A A 。

这就像是在给B量身定制一件“A”的外套,太合身了。

然后,像刚才那样,用B减去这个投影。

接下来,我们来个“减法”运算,形成新的正交向量,记得这个过程可别偷懒哦!3.1 逐步推进随着我们的向量逐步正交化,大家是不是觉得越来越顺手了?每当你完成一个步骤,就像是完成了一道菜肴,总有种成就感油然而生。

最后的结果就是一组完全正交的向量,它们在空间中各自占据一席之地,再也不会“争风吃醋”了。

如何在 MATLAB 中用 行代码实现 Gram-Schmidt 正交化

如何在 MATLAB 中用 行代码实现 Gram-Schmidt 正交化

如何在MATLAB 中用9行代码实现Gram-Schmidt 正交化Gram-Schmidt 方法利用n 个独立的向量a 1,…,a n (A 的列向量产生n 个正交的向量q 1,…,q n (Q 的列向量。

求得q j 首先要从a j 中去其在前面的q 的投影,然后除以向量的长度,得到一个单位矩阵。

内积q i T a j 产生一个满足A=QR 的方阵R 。

因为当i 大于j 时q i T a j =0,所以R 是上三角形阵(后面的q 正交于以前的a ,这就是这个方法的要点。

下面是由A 产生Q 和R 的只有9行的MATLAB 的代码。

首先执行[m,n]=size (A;Q=zeros (m,n;R=zeros (n,m;以使矩阵具有正确的大小。

for j=1:n %Gram-Schmidt 正交化v=A(:,j; %v 初始化为A 的第j 列for i=1:j-1R(i,j=Q(:,i’*A(:,j; %为提高精确度用A(:,j代替vv=v-R(i,j*Q(:,i; %减去投影 q i T a j q i =(q i T vq iend %v 现在和q 1,…,q j −1正交R(j,j=norm(v;Q(:,j=v/R(j,j; %将v 规范化使之成为单位向量q j end如果你重复最后的步骤和中间的步骤你会发现:R(j,j q j =(v 减去它的投影=(A 的第j 列- R(i,jq i j −1i=1将和移到左侧就是乘积A=QR 的第j 列。

第4行的“改进的Gram-Schmidt ”在从a j 转换到v 中作了关键的调整。

由运算可知R(i.j= q i T a j 和q i T v 相等。

(现在v 已经从a j 中减去了在q 1,…,q i −1的投影,但是新的q i 要和这些方向都正交。

实际上这种正交状态并不完全正确,计算时便会在Q 中产生一点误差。

多数情况下在代码中的那一步使用v 。

例A 是2阶方阵。

施密特正交化详细计算

施密特正交化详细计算

施密特正交化详细计算施密特正交化是一种方法,用于将一个向量集转化为一个正交的向量集。

这个过程创建了一个正交基,可以更轻松地处理向量集。

在本文中,我们将详细介绍施密特正交化的计算步骤。

步骤1:给定向量集首先,我们需要有一个向量集,我们将其表示为 {v1, v2, ..., vn},其中vi是向量集中的第i个向量。

步骤2:计算第一个正交向量我们将求解向量集中的第一个正交向量。

我们选择 v1 作为我们正交基的第一个向量,因为它是向量集中的第一个向量。

步骤3:计算第二个正交向量为了计算第二个正交向量,我们需要将向量 v2 投影到基 v1 上。

投影的计算公式如下所示:projv1(v2) = ( v2 • v1 / ||v1||^2 ) * v1其中,• 表示向量的点积运算,||v1|| 表示向量v1 的范数(长度)。

然后,我们从 v2 中减去投影,以得到第二个正交向量:u2 = v2 - projv1(v2)步骤4:计算第三个正交向量为了计算第三个正交向量,我们将向量 v3 投影到基 v1 和 v2 上,然后从 v3 中减去这两个投影。

首先,计算 v3 在 v1 上的投影:projv1(v3) = ( v3 • v1 / ||v1||^2 ) * v1然后,计算 v3 在 v2 上的投影:projv2(v3) = ( v3 • v2 / ||v2||^2 ) * v2最后,我们可以计算第三个正交向量:u3 = v3 - projv1(v3) - projv2(v3)步骤5:重复步骤4直到所有向量都被处理完对于具有 n 个向量的向量集,我们可以重复步骤4的过程 n - 1 次,直到我们得到所有的正交向量。

总结:总而言之,施密特正交化是一种将向量集转化为正交向量集的方法。

该方法的计算步骤包括:1. 给定一个向量集。

2. 计算第一个正交向量,将其作为正交基的第一个向量。

3. 计算每个向量在前面的正交向量(基)上的投影,并从原向量中减去这些投影,得到下一个正交向量。

施密特正交化GramSchmidt

施密特正交化GramSchmidt

施密特正交化GramSchmidt施密特正交化 GramSchmidt施密特正交化的原名是 Gram–Schmidt process,是由Gram和schmidt两个⼈⼀起发明的,但是后来因为施密特名⽓更⼤,所以该⽅法被简记为施密特正交化。

借⽤《线性代数》P117-例2 的例⼦来运⾏代码。

a1=(1,2,−1)T a2=(−1,3,1)T a3=(4,−1,0)T正交化后:a1=(1,2,−1)T a2=53(−1,1,1)T a3=2(1,0,1)T单位化后:a1=1√6(1,2,−1)T a2=1√3(−1,3,1)T a3=1√2(4,−1,0)T代码实现python3 的 sympy 包实现了 GramSchmidt ⽅法。

from sympy.matrices import Matrix, GramSchmidtl = [Matrix([1,2,-1]), Matrix([-1,3,1]), Matrix([4,1,0])]o = GramSchmidt(l)计算结果如下:[Matrix([[ 1],[ 2],[-1]]),Matrix([[-5/3],[ 5/3],[ 5/3]]),Matrix([[2],[0],[2]])]单位化也就是在调⽤函数的时候传⼊参数。

from sympy.matrices import Matrix, GramSchmidtl = [Matrix([1,2,-1]), Matrix([-1,3,1]), Matrix([4,1,0])]o = GramSchmidt(l, True)计算结果如下:[Matrix([[ sqrt(6)/6],[ sqrt(6)/3],[-sqrt(6)/6]]),Matrix([[-sqrt(3)/3],[ sqrt(3)/3],[ sqrt(3)/3]]),Matrix([[sqrt(2)/2],[ 0],[sqrt(2)/2]])]sympy.Matrix 与 Numpy 的互操作Matrix 转 Numpy.arrayimport numpy as npfrom sympy.matrices import Matrix, GramSchmidtl = [Matrix([1,2,-1]), Matrix([-1,3,1]), Matrix([4,1,0])]o = GramSchmidt(l, True)m = np.array(o)内积计算(m[0] * m[1]).sum() References Processing math: 100%。

Gram-Schmidt正交化方法

Gram-Schmidt正交化方法

Gram-Schmidt 正交化方法 正射影设欧式空间V 中向量s ααα ,,21线性无关,令;11αβ= 111122,,ββββααβ-=; (1)222231111333,,,,ββββαββββααβ--=;……111122221111,,,,,,--------=s s s s s s s s s ββββαββββαββββααβ .则s βββ,,,21 均非零向量,且两两正交.再令,1i ii ββγ= s i ,.2,1 =则},,,{21s γγγ 为规范正交组.将(1)重新写成i i i i i i t t βββα+++=--11,11, , s i ,,2,1 = 其中kk k i ik t βββα,,=,,,,2,1s i = .1,,2,1-=i k{},,,2,1,s j i ∈∀有∑∑-=-=++=1111,,j k jk jk i k i k ikji t tββββαα()⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛⎪⎪⎪⎪⎪⎭⎫⎝⎛=-001,000,000,0,,0,1,,,1112222111,21j j j i i i i t t t t t t ββββββ 令⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=---101001011,2,2,11,1,121s s s s s s t t t t t t T则TTssssssssssssss⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛-----ββββββββαααααααααααααααααααααααα,,,,,,,,,,,,,,,,112211/21121112221212111上式左端的实方阵是sααα,,,21的格兰母矩阵,记为:()sGααα,,,21,上式右端中间的对角阵是sβββ,,,21的Gram矩阵.即有:()()TGTGssβββααα,,,,,,21/21=因此()()ssssGGβββββββββααα,,,,,,det,,,det22112121==注意:对任意一个向量组,无论它是线性相关,还是线性无关,它总有Gram矩阵(或者事先给出定义).例1 设sααα,,,21欧式空间V中向量,则(1)()⇔≠0,,,det21sGαααsααα,,,21线性无关;(2)()⇔=0,,,det21sGαααsααα,,,21线性相关.证明:只证(2))⇐设sααα,,,21线性相关,则存在一个向量,不妨设为1α,可由其余向量线性表示:sskkααα++=221给s阶的行列式()sGααα,,,det21的第i行乘数()i k-加到第1行,si,,3,2=得()ssssssisiissiiisiiiskkkGααααααααααααααααααααααααααα,,,,,,,,,,,,,,,det2122212212221211121∑∑∑===---==)⇒法一:由上页证明推理过程立即得证。

施密特正交化推导过程

施密特正交化推导过程

施密特正交化推导过程
高斯-施密特正交化(Gram-Schmidt Orthogonalization)是一种向量正交化方法,是有效正交化基底(orthonormal basis)状态的一种方法。

它是定义在实数向量空间上且有限维的。

它的目标是对给定的v1,v2,…,vn基向量族生成一组正交和成比例的替换向量基向量w1,w2,…,wn,从而得到一个正交且比例的基底。

它的推导公式很简单,首先把原来的基向量定义为V1,…,Vn,然后将第一个基向量标准化为Wi,同时Wi是一个和V1正交的基向量,以此类推,后面的基向量Wi,为了使它和前面的基向量正交,通过把它们分别减去与Wi,Wi−1相关的实际上是该线性组合,最后获得Wi。

它的实现算法如下:
(1)第一步:计算Wi=V1/||V1||(| |表示V1的范德蒙范数);
(2)第二步:计算Wi+1=V2−(V2· Wi)Wi/ ||V2−(V2· Wi)Wi||;
(3)第三步:对于第n个基向量Vn,计算
Wn=Vn−(Vn· W1)W1−(Vn·W2)W2−…−(Vn · Wn−1)Wn−1/||Vn−(Vn·W1)W1−(Vn·W2 )W2−…−(Vn· Wn−1)Wn−1||
上述就是高斯-施密特正交化的推导过程,可以使任意多维向量空间的基向量被唯一的正交化。

它的算法比较简单,算法的复杂度只有O(n2),所以,在线性代数运算中很常用。

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

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

利用C程序编写格拉姆-施密特正交化的过程格拉姆-施密特正交化在线性代数中,如果内积空间上的一组向量能够组成一个子空间,那么这一组向量就称为这个子空间的一个基。

Gram-Schmidt正交化提供了一种方法,能够通过这一子空间上的一个基得出子空间的一个正交基,并可进一步求出对应的标准正交基。

这种正交化方法以Jørgen Pedersen Gram和Erhard Schmidt命名,然而比他们更早的拉普拉斯(Laplace)和柯西(Cauchy)已经发现了这一方法。

在李群分解中,这种方法被推广为岩泽分解(Iwasawa decomposition)。

在数值计算中,Gram-Schmidt正交化是数值不稳定的,计算中累积的舍入误差会使最终结果的正交性变得很差。

因此在实际应用中通常使用豪斯霍尔德变换或Givens旋转进行正交化。

记法•:维数为n的内积空间•:中的元素,可以是向量、函数,等等•:与的内积•:、……张成的子空间•:在上的投影基本思想Gram-Schmidt正交化的基本想法,是利用投影原理在已有正交基的基础上构造一个新的正交基。

设。

是上的维子空间,其标准正交基为,且不在上。

由投影原理知,与其在上的投影之差是正交于子空间的,亦即正交于的正交基。

因此只要将单位化,即那么就是在上扩展的子空间的标准正交基。

根据上述分析,对于向量组张成的空间 (),只要从其中一个向量(不妨设为)所张成的一维子空间开始(注意到就是的正交基),重复上述扩展构造正交基的过程,就能够得到的一组正交基。

这就是Gram-Schmidt正交化。

算法首先需要确定已有基底向量的顺序,不妨设为。

Gram-Schmidt正交化的过程如下:这样就得到上的一组正交基,以及相应的标准正交基。

例考察如下欧几里得空间R n中向量的集合,欧氏空间上内积的定义为<a, b> = b T a:下面作Gram-Schmidt正交化,以得到一组正交向量:下面验证向量与的正交性:将这些向量单位化:于是就是的一组标准正交基底。

Gram-Schmidt正交化方法

Gram-Schmidt正交化方法

Gram-Schmidt 正交化方法 正射影设欧式空间V 中向量s ααα ,,21线性无关,令;11αβ= 111122,,ββββααβ-=; (1)222231111333,,,,ββββαββββααβ--=;……111122221111,,,,,,--------=s s s s s s s s s ββββαββββαββββααβ .则s βββ,,,21 均非零向量,且两两正交.再令,1i ii ββγ= s i ,.2,1 =则},,,{21s γγγ 为规范正交组.将(1)重新写成i i i i i i t t βββα+++=--11,11, , s i ,,2,1 = 其中kk k i ik t βββα,,=,,,,2,1s i = .1,,2,1-=i k{},,,2,1,s j i ∈∀有∑∑-=-=++=1111,,j k jk jk i k i k ikji t tββββαα()⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛⎪⎪⎪⎪⎪⎭⎫⎝⎛=-001,000,000,0,,0,1,,,1112222111,21j j j i i i i t t t t t t ββββββ 令⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=---101001011,2,2,11,1,121s s s s s s t t t t t t T则TTssssssssssssss⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛-----ββββββββαααααααααααααααααααααααα,,,,,,,,,,,,,,,,112211/21121112221212111上式左端的实方阵是sααα,,,21的格兰母矩阵,记为:()sGααα,,,21,上式右端中间的对角阵是sβββ,,,21的Gram矩阵.即有:()()TGTGssβββααα,,,,,,21/21=因此()()ssssGGβββββββββααα,,,,,,det,,,det22112121==注意:对任意一个向量组,无论它是线性相关,还是线性无关,它总有Gram矩阵(或者事先给出定义).例1 设sααα,,,21欧式空间V中向量,则(1)()⇔≠0,,,det21sGαααsααα,,,21线性无关;(2)()⇔=0,,,det21sGαααsααα,,,21线性相关.证明:只证(2))⇐设sααα,,,21线性相关,则存在一个向量,不妨设为1α,可由其余向量线性表示:sskkααα++=221给s阶的行列式()sGααα,,,det21的第i行乘数()i k-加到第1行,si,,3,2=得()ssssssisiissiiisiiiskkkGααααααααααααααααααααααααααα,,,,,,,,,,,,,,,det2122212212221211121∑∑∑===---==)⇒法一:由上页证明推理过程立即得证。

施密特正交化的具体运算过程

施密特正交化的具体运算过程

施密特正交化的具体运算过程嘿,朋友!咱今天来聊聊施密特正交化这个听起来有点高大上的东西,其实啊,它没那么可怕,就像你学会骑自行车,一旦掌握窍门,那就是小菜一碟!施密特正交化到底是啥呢?简单说,就是把一组线性无关的向量,变成一组两两正交的向量。

这就好比把一堆乱麻似的线,一根根整理得规规矩矩、互不干扰。

咱先找一组线性无关的向量,比如说α1、α2、α3。

然后呢,咱先把β1设成α1,这就像是打下了第一块基石。

接下来,β2就等于α2减去α2在β1上的投影。

这就好像α2要避开β1的“势力范围”,找到属于自己的独特空间。

你想想,这是不是有点像两个人要保持一定的距离,不互相干扰?那这个投影咋算呢?别慌,就是(α2·β1)/(β1·β1)乘以β1。

再看β3,它等于α3减去α3在β1上的投影,再减去α3在β2上的投影。

这就像是α3要努力躲开β1和β2的“地盘”,给自己找个安身之所。

算完这些β向量,还没完呢!咱还得把它们单位化。

怎么单位化?就是用β向量除以它自己的模长。

这就好比把一根长短不一的棍子,变成长度都为 1 的标准小棒。

你说这过程复杂不?其实只要一步步来,就像走台阶,一步一个脚印,肯定能搞定!比如说,给你一组向量(1,1,0),(1,0,1),(0,1,1)。

咱就按照刚才说的步骤来施密特正交化。

先算β1,就是(1,1,0)。

然后算β2,α2在β1上的投影是((1,0,1)·(1,1,0))/((1,1,0)·(1,1,0))乘以(1,1,0),算出来是(1/2,1/2,0),那β2就是(1,0,1) - (1/2,1/2,0) = (1/2, - 1/2,1)。

再算β3,α3在β1上的投影是((0,1,1)·(1,1,0))/((1,1,0)·(1,1,0))乘以(1,1,0),算出来是(1/2,1/2,0),α3在β2上的投影是((0,1,1)·(1/2, - 1/2,1))/((1/2, -1/2,1)·(1/2, - 1/2,1))乘以(1/2, - 1/2,1),算出来是(1/2,- 1/2,1),那β3就是(0,1,1) - (1/2,1/2,0) - (1/2, - 1/2,1) = ( - 1/2,1/2,1/2)。

数值线性代数上机作业1

数值线性代数上机作业1
0 54.2196 34.8797 23.1669 25.2609 23.2963
0 0 32.4907 -8.9182 -11.2895 -7.9245
0 0 0 7.6283 -3.9114 7.4339
0 0 0 0 3.4197 6.8393
0 0 0 0 0 0.0000
魔方矩阵用matlab内置QR分解:
-0.0710 -0.6424 0.1373 0.4501 0.3329-0.5000
R =
-56.3471 -16.4693 -30.0459 -39.0969 -38.0321 -38.6710
0 -54.2196 -34.8797 -23.1669 -25.2609 -23.2963
0 0 32.4907 -8.9182 -11.2895 -7.9245
-0.0532 -0.5740 -0.4500 -0.2106 -0.64870.0000
-0.5502 0.0011 -0.4460 0.4537 0.20620.5000
-0.1420 -0.4733 0.3763 -0.5034 0.33290.5000
-0.5324 0.0695 0.6287 0.2096 -0.52200.0000
Q =
0.8189 -0.5397 0.1893 -0.0482 0.0090 -0.0011
0.4094 0.3320 -0.7024 0.4489 -0.16170.0332
0.2730 0.4219 -0.1529 -0.5723 0.5854-0.2321
0.2047 0.4067 0.2015 -0.3866 -0.46870.6189
0.2730 0.4219 -0.1529 -0.5723 0.5854-0.2320

施密特正交化证明过程

施密特正交化证明过程

施密特正交化证明过程嘿,朋友!咱们今天来聊聊施密特正交化这神奇的证明过程。

你想啊,这施密特正交化就像是搭积木,一块一块地把不整齐的积木堆整得规规矩矩。

先来说说为啥要有这施密特正交化呢?就好比在一个乱糟糟的房间里,东西乱丢乱放,我们得把它们整理得井井有条,这样找起来方便,用起来也顺手。

向量也是这样,原本可能杂乱无章,通过施密特正交化,就能让它们变得有规律、有秩序。

那这施密特正交化到底咋整呢?假设咱有一组线性无关的向量α1,α2,α3,……,αn。

第一步,先把β1设成α1。

这就好比找到了第一个基准,就像盖房子先打下第一根桩子。

接下来,β2就等于α2减去α2在β1上的投影。

这像啥?就像把α2这个“调皮鬼”拽到β1这个基准线上,让它老实点,只留下不在β1方向上的部分。

再然后呢,β3等于α3减去α3在β1和β2上的投影。

这是不是有点像让α3这个“小淘气”摆脱β1和β2的影响,只留下独属于自己的那部分。

如此这般,一直到βn。

你说这过程神奇不神奇?就这么一步步地,把原本没啥规律的向量变得相互正交。

这过程不就跟咱们做手工似的,一点点地雕琢,一点点地修正,最后出来一个精美的作品。

而且啊,施密特正交化在很多领域都大有用处。

比如在解决线性方程组的时候,它能让计算变得简单明了;在处理空间几何问题时,能让咱们更清楚地看到空间中的结构。

你想想,如果没有施密特正交化,那得多乱套啊!计算会变得复杂无比,就像在一团乱麻里找线头,简直让人头疼。

所以说,施密特正交化这个证明过程,那可真是数学世界里的一把神奇钥匙,能打开很多难题的大门,让我们在数学的海洋里畅游得更加顺畅!朋友,你是不是也觉得施密特正交化很有意思呢?。

C语言实现矩阵的LU分解、施密特正交化、Givens分解、Householder分解

C语言实现矩阵的LU分解、施密特正交化、Givens分解、Householder分解

C语言实现矩阵的LU分解、施密特正交化、Givens分解、Householder分解By Kim.Wang,UCAS#include<stdio.h>#include<math.h>#include<windows.h>#define HS 10#define LS 10int n, m;float a[HS][LS],bc[HS][LS];void givens(){float fm,sc,cos,sin,r[HS][LS],q[HS][LS],swap[HS][LS],p[HS][LS];int ih,jh,i, j,kh,iw;for (i = 0; i < m; i++)for (j = 0; j < n; j++)r[i][j]=a[i][j];for (i = 0; i < m; i++)for (j = 0; j < m; j++){if(i==j)q[i][j]=1;elseq[i][j]=0;}for(j=0;j<n;j++)for (i = j+1; i < m; i++){for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++){if(ih==jh)p[ih][jh]=1;elsep[ih][jh]=0;}fm=sqrt(r[i][j]*r[i][j]+r[j][j]*r[j][j]);cos=r[j][j]/fm;sin=r[i][j]/fm;p[i][i]=p[j][j]=cos;p[i][j]=-sin;p[j][i]=sin;for (ih = 0; ih < m; ih++)for (jh = 0; jh < n; jh++){sc=0;for (kh = 0; kh < m; kh++)sc=sc+p[ih][kh]*r[kh][jh];swap[ih][jh]=sc;}for (ih = 0; ih < m; ih++)for (jh = 0; jh < n; jh++)r[ih][jh]=swap[ih][jh];for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++){sc=0;for (kh = 0; kh < m; kh++)sc=sc+p[ih][kh]*q[kh][jh];swap[ih][jh]=sc;}for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++)q[ih][jh]=swap[ih][jh];}printf("\n Givens约减矩阵Q的结果如下:\n");for (j = 0; j < m; j++){for (i = 0; i < m; i++)printf("%0.5f ", q[i][j]);printf("\n");}printf("\n Givens约减矩阵R的结果如下:\n");for (i = 0; i < m; i++){for (j = 0; j < n; j++)printf("%0.5f ", r[i][j]);printf("\n");}}void householder(){int i, j, k, is,js,ks,iw, ie,je;float udm,sc,em,nj,q[HS][LS],r[HS][LS],u[LS],swap[HS][LS],dw[HS][LS],p[HS][LS];for (i = 0; i < m; i++)for (j = 0; j < n; j++)r[i][j]=a[i][j];for (i = 0; i < m; i++)for (j = 0; j < m; j++){if(i==j)dw[i][j]=q[i][j]=1;elsedw[i][j]=q[i][j]=0;}for(k=0;k<n;k++){for (i = 0; i < m; i++){if(i<k)u[i]=0;else if(i==k){em=0;for(iw=k;iw<m;iw++)em=em+r[iw][k]*r[iw][k];em=sqrt(em);u[i]=r[i][k]-em;}elseu[i]=r[i][k];}for (udm=0,ie = k; ie < m; ie++)udm=udm+u[ie]*u[ie];udm=sqrt(udm);if(udm<0.00001)break;for (ie = 0; ie < m; ie++)u[ie]=u[ie]/udm;for (ie = 0; ie < m; ie++)for (je = 0; je < m; je++)p[ie][je]=dw[ie][je]-2*u[ie]*u[je];for (is = 0; is < m; is++)for (js = 0; js < m; js++){sc=0;for (ks = 0; ks < m; ks++)sc=sc+p[is][ks]*q[ks][js];swap[is][js]=sc;}for (is = 0; is < m; is++)for (js = 0; js < m; js++)q[is][js]=swap[is][js];for (is = 0; is < m; is++)for (js = 0; js < m; js++){sc=0;for (ks = 0; ks < m; ks++)sc=sc+p[is][ks]*r[ks][js];swap[is][js]=sc;}for (is = 0; is < m; is++)for (js = 0; js < m; js++)r[is][js]=swap[is][js];}printf("\n Householder约减矩阵Q的结果如下:\n");for (j = 0; j < m; j++){for (i = 0; i < m; i++)printf("%0.5f ", q[i][j]);printf("\n");}printf("\n Householder矩阵R的结果如下:\n");for (i = 0; i < m; i++){for (j = 0; j < n; j++)printf("%0.5f ", r[i][j]);printf("\n");}}void schmidt(){int i, j, k, l, b, z;float em,nj, r[HS][LS],q[HS][LS];for (i = 0; i < m; i++)for (j = 0; j < n; j++)q[i][j]=a[i][j];for(k=0;k<n;k++){for(l=0;l<k;l++){nj=0;for(i=0;i<m;i++)nj=nj+q[i][l]*a[i][k];r[l][k]=nj;for(i=0;i<m;i++)q[i][k]=q[i][k]-r[l][k]*q[i][l];}em=0;for(i=0;i<m;i++)em=em+q[i][l]*q[i][l];em=sqrt(em);r[l][k]=em;for(i=0;i<m;i++)q[i][k]=q[i][k]/r[l][k];}for(i=0;i<m;i++)for(j=n;j<m;j++)q[i][j]=bc[i][j];printf("\n Schmidt正交化矩阵Q的结果如下:\n");for (i = 0; i < m; i++){for (j = 0; j < m; j++)printf("%0.5f ", q[i][j]);printf("\n");}printf("\n Schmidt正交化矩阵R的结果如下:\n");for (i = 0; i < m; i++){for (j = 0; j < n; j++){if(i>j) r[i][j]=0;printf("%0.5f ", r[i][j]);}printf("\n");}}void lufj(){int i, j, k,mm, z, o, p[HS][LS], w[HS];float x, y,alu[HS][LS], s[HS],l[HS][LS],u[HS][LS]; for (i = 0; i < n; i++)for (j = 0; j < n; j++){alu[i][j]=a[i][j];if (i == j)p[i][j] = 1;elsep[i][j] = 0;}for (j = 0; j < n; j++){i = j; x = alu[i][j]; k = i;for (; i < n - 1; i++){mm = i + 1;if (abs(x) < abs(alu[mm][j])){k = mm;x = alu[mm][j];}}if (k != j)for (o = 0,i = j; o < n; o++){s[o] = alu[i][o];alu[i][o] = alu[k][o];alu[k][o] = s[o];w[o] = p[i][o];p[i][o] = p[k][o];p[k][o] = w[o];}for (z = j + 1; z < n; z++){y = alu[z][j] / alu[j][j];alu[z][j] = y;for (o = j+1; o < n; o++)alu[z][o] = alu[z][o] - y*alu[j][o];}}for (i = 0; i < n; i++)for (j = 0; j < n; j++)if(i>j){l[i][j]=alu[i][j];u[i][j]=0;}else if(i<j){l[i][j]=0;u[i][j]=alu[i][j];}else{l[i][j]=1;u[i][j]=alu[i][j];}printf(" LU分解矩阵L的结果如下:\n");for (i = 0; i < n; i++){for (j = 0; j < n; j++)printf("%0.5f ", l[i][j]);printf("\n");}printf("\n LU分解矩阵U的结果如下:\n");for (i = 0; i < n; i++){for (j = 0; j < n; j++)printf("%0.5f ", u[i][j]);printf("\n");}printf("\n LU分解行交换矩阵P的结果如下:\n");for (i = 0; i < n; i++){for (j = 0; j < n; j++)printf("%d ", p[i][j]);printf("\n");}}int main(){int im,jm,b,z,zl;printf("请输入矩阵行数M(M需为大于1的整数):\n");scanf("%d",&m);printf("请输入矩阵列数N(N需为大于1的整数):\n");scanf("%d",&n);for (im = 0; im < m; im++)for (jm = 0; jm < n; jm++){b = im + 1;z = jm + 1;printf("请输入第%d行的第%d个数,以enter键结束输入:\n", b, z);scanf("%f", &a[im][jm]);}float fm,sc,cos,sin,jdz,r[HS][LS],q[HS][LS],swap[HS][LS],p[HS][LS];int ih,jh,i, j,kh,iw;for (i = 0; i < m; i++)for (j = 0; j < n; j++)r[i][j]=a[i][j];for (i = 0; i < m; i++)for (j = 0; j < m; j++){if(i==j)q[i][j]=1;elseq[i][j]=0;}for(j=0;j<n;j++)for (i = j+1; i < m; i++){for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++){if(ih==jh)p[ih][jh]=1;elsep[ih][jh]=0;}fm=sqrt(r[i][j]*r[i][j]+r[j][j]*r[j][j]);cos=r[j][j]/fm;sin=r[i][j]/fm;p[i][i]=p[j][j]=cos;p[i][j]=-sin;p[j][i]=sin;for (ih = 0; ih < m; ih++)for (jh = 0; jh < n; jh++)sc=0;for (kh = 0; kh < m; kh++)sc=sc+p[ih][kh]*r[kh][jh];swap[ih][jh]=sc;}for (ih = 0; ih < m; ih++)for (jh = 0; jh < n; jh++)r[ih][jh]=swap[ih][jh];for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++){sc=0;for (kh = 0; kh < m; kh++)sc=sc+p[ih][kh]*q[kh][jh];swap[ih][jh]=sc;}for (ih = 0; ih < m; ih++)for (jh = 0; jh < m; jh++)bc[jh][ih]=q[ih][jh]=swap[ih][jh];}if(r[n-1][n-1]<0)jdz=-r[n-1][n-1];elsejdz=r[n-1][n-1];if(m<n){printf("\n 该矩阵列向量线性相关,无法进行分解! \n");system("pause");}else if(jdz<0.0001){printf("\n 该矩阵列向量线性相关,无法进行分解! \n");system("pause");}else if(m==n){do{printf("\n");printf("该矩阵可进行四种分解,请输入选项前的数字选择!\n");printf("0:退出程序\n");printf("1:Gram-Schmidt正交化\n");printf("2:Householder分解\n");printf("3:Givens分解\n");printf("4:LU分解\n\n");scanf("%d", &zl);switch(zl){case 0:return 0; break;case 1:schmidt(); break;case 2:householder(); break;case 3:givens(); break;case 4:lufj(); break;}}while(zl!=0);}elsedo{printf("\n");printf("该矩阵可进行除LU分解外的三种分解,请输入选项前的数字选择!\n");printf("0:退出程序\n");printf("1:Gram-Schmidt正交化\n");printf("2:Householder分解\n");printf("3:Givens分解\n\n");scanf("%d", &zl);switch(zl){case 0:return 0; break;case 1:schmidt(); break;case 2:householder(); break;case 3:givens(); break;}}while(zl!=0);}。

电子测量莱特检验法,格拉布斯检验法C语言源程序

电子测量莱特检验法,格拉布斯检验法C语言源程序
if(v[max]*v[max]>g*g*sd*sd)
{
printf("根据格拉布斯检验法,本次剔除了第%d个数据%.13f(置信概率95%%)\n",max+1,x[max]);
for(i=max;i<n-1;i++)x[i]=x[i+1];
leap=1;
n=n-1;
case 3 : leap=Grubbs_2(a,n);break;
case 4 : leap=0;break;
default: printf("输入错误,请重新选择\n");break;
}
}
avg=AVRG(a,n);
sd=SD(a,n);
for(i=0;i<n;i++)
printf("平均值为%f,标准差为%f\n",avg,sd);
return 0;
}
double SUM(double x[],int n)
{
double s=0;
int i;
for(i=0;i<n;i++)s+=x[i];
return s;
}
double AVRG(double x[],int n)
{
u[i]=x[i]-aver;
ld+=u[i]*u[i];
}
sd=sqrt((ld)/(n-1));
return sd;
}
int PauTa(double x[],int n)
{
int i,max=0,min=0,j=0,leap;

施密特正交化Matrixs C程序代码

施密特正交化Matrixs C程序代码
G_S(p,m,n); /*正交化处理*/
int i,j;
printf("标准正交化的矩阵:\n"); /*输出*/
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
}
void G_S(float *ad,int dim,int num)
{
void Standlization(float *ad0,int dimபைடு நூலகம்);
void Adment(float *ad1,int dim1,int num1);
int i;
{
Norm=Norm+(*(ad0+j))*(*(ad0+j));
}
Norm=sqrt(Norm);
for(j=0;j<dim0;j++)
{
*(ad0+j)=*(ad0+j)/Norm;
}
}
int n=0,m=0;
printf("向量个数n,向量维数m:\n");
scanf("%d,%d",&n,&m);
float *p;
p=InputM(m,n); /*输入向量*/
{
printf("%f ",*(p+i*100+j));
}
printf("\n");
}
getch();
}
float * InputM(int dim,int num) //输入函数结构;
{

Schmidt正交法求向量组等价的标准正交向量组程序

Schmidt正交法求向量组等价的标准正交向量组程序

#include <iostream.h>#include <math.h>#define N 4float neiji(float a[],float b[]){float s=0,p;int i;for(i=1;i<=N;i++){ p=a[i]*b[i];s=p+s;}return s;}void dwh(float a[],float b[]){static int c=1;float s=0,p;int i;for(i=1;i<=N;i++){s=a[i]*a[i]+s;}p=sqrt(s);cout<<"那么单位化后b"<<c<<"的结果为:"<<endl;for(i=1;i<=N;i++){b[i]=a[i]/p;cout<<b[i]<<'\t';}c++;cout<<endl;}void print(float a[]){int i;for(i=1;i<=N;i++){ cout<<a[i]<<'\t';}cout<<endl;}void main(){cout<<"《Schmidt正交法求向量组等价的标准正交向量组程序》"<<endl;cout<<"请根据你的向量的维数更改N值,这里初始为N=4,为三个向量组"<<endl;cout<<"请输入你的向量组a1的各元素"<<endl;float a1[N],a2[N],a3[N],b1[N],b2[N],b3[N],p;int i;for(i=1;i<=N;i++){ cin>>a1[i];}cout<<"请输入你的向量组a2的各元素"<<endl;for(i=1;i<=N;i++){ cin>>a2[i];} cout<<"请输入你的向量组a3的各元素"<<endl;for(i=1;i<=N;i++){ cin>>a3[i];}for(i=1;i<=N;i++){ b1[i]=a1[i];}float s21;s21=neiji(a2,b1);float h1;h1=neiji(b1,b1);for(i=1;i<=N;i++){ b2[i]=a2[i]-s21/h1*b1[i];}float s32;for(i=1;i<=N;i++)s32=neiji(a3,b2);float h2;h2=neiji(b2,b2);float s31;s31=neiji(a3,b1);for(i=1;i<=N;i++){ b3[i]=a3[i]-s32/h2*b2[i]-s31/h1*b1[i];}cout<<"b1="<<'\t';print(b1);cout<<"b2="<<'\t';print(b2);cout<<"b3="<<'\t';print(b3);float r1[N];dwh(b1,r1);float r2[N];dwh(b2,r2);float r3[N];dwh(b3,r3);}。

用C语言实现格拉布斯实验

用C语言实现格拉布斯实验

#include <stdio.h>#include <math.h>double A; //A为平均值double x[20]={0}; //原始数据double y[20]={0}; //残差int n,t; //数据个数,和最大残差数的下标double mean() //求平均值函数{int i;double ave=0;for(i=0;i<n;i++){ave+=x[i];}return ave/n;}double qcc(){int i;double vmax=0;for(i=0;i<n;i++){y[i]=x[i]-A;y[i]=fabs(y[i]);}for(i=0;i<n;i++){if(vmax<y[i]){vmax=y[i];t=i;}}return vmax;}double qbzc(){double bzc=0;int i;for(i=0;i<n;i++){bzc+=pow(y[i],2);}bzc/=(n-1);bzc=sqrt(bzc);return bzc;}void main(){doubleG[2][18]={{1.15,1.46,1.67,1.82,1.94,2.03,2.11,2.18,2.23,2.29,2.33,2.37,2.41,2.44,2.47,2.50,2.53,2 .56},{1.15,1.49,1.75,1.94,2.10,2.22,2.32,2.41,2.48,2.55,2.61,2.66,2.70,2.74,2.78,2.82,2.85,2.85}}; double g;double p;double vmax1,bzc1;int i;printf("输入数据个数\n");scanf("%d",&n);printf("输入数据\n");for(i=0;i<n;i++){scanf("%lf,",&x[i]);}printf("设定置信概率为0.95或0.99\n");scanf("%lf",&p);A=mean();vmax1=qcc();bzc1=qbzc();printf("平均值=%.3lf,实验标准差=%.3lf\n",A,bzc1);if(p==0.95)g=G[0][n-3];if(p==0.99)g=G[1][n-3];while(vmax1>g*bzc1){printf("异常数据为:%.2lf\n",x[t]);for(i=t;i<n-1;i++){x[i]=x[i+1];}n--;A=mean();vmax1=qcc();bzc1=qbzc();if(p==0.95)g=G[0][n-3];if(p==0.99)g=G[1][n-3];printf("平均值=%.3lf,实验标准差=%.3lf\n",A,bzc1); }printf("经处理后数据为:");for(i=0;i<n;i++){printf("%.2lf,",x[i]);}}。

【免费下载】c解齐次方程组Cramer Gauss列主元 Gauss全主元 Doolittle算法

【免费下载】c解齐次方程组Cramer Gauss列主元 Gauss全主元 Doolittle算法

2. Gauss 列主元消去法";
3. Gauss 全主元消去法";
4. Doolittle 分解法";
5. 退出";
输入你的选择:";
void input() { int i,j; t;lenth; if(lenth>Number) {
cout<<"It is too big.\n"; return; } x=new char[lenth]; for(i=0;i<lenth;i++) x[i]='a'+i;
//Gauss 列主元消去法
//Gauss 全主元消去法
//根据 Gauss 消去法结果计算未知量的值
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根通保据过护生管高产线中工敷资艺设料高技试中术卷资,配料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高与中带资负料荷试下卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并3中试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内 纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

【免费下载】Gram Schmidt正交化方法

【免费下载】Gram Schmidt正交化方法
(1) det G1, 2 ,, s 0 1,2 ,,s 线性无关; (2) det G1, 2 ,, s 0 1,2 ,,s 线性相关.
证明:只证(2) ) 设1,2,,s 线性相关,则存在一个向量,不妨设为1 ,可由其余向量线 性表示:
i, j 1,2,, s, 有 i , j tik k i , t jk k j

ti1,
ti2
,t
i,i1,1,0,,0

1 t21 ts1,1 0 1 ts1,2
令T

0 0 1

j 1
k 1

s1 .
1 i
t j1
t j1

10
t j1

0
i ,


i 1,2., s
(1)
1,1
2,1



s1 ,1 s ,1
1 , 2 2 , 2
中向量


,,s
det
1
,且上式取等号
(欧),则
(ⅱ)设
det
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根通保据过护生管高产线中工敷资艺设料高技试中术卷资,配料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高与中带资负料荷试下卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并3中试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内 纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用C程序编写格拉姆-施密特正交化的过程
格拉姆-施密特正交化
在线性代数中,如果内积空间上的一组向量能够组成一个子空间,那么这一组向量就称为这个子空间的一个基。

Gram-Schmidt正交化提供了一种方法,能够通过这一子空间上的一个基得出子空间的一个正交基,并可进一步求出对应的标准正交基。

这种正交化方法以Jørgen Pedersen Gram和Erhard Schmidt命名,然而比他们更早的拉普拉斯(Laplace)和柯西(Cauchy)已经发现了这一方法。

在李群分解中,这种方法被推广为岩泽分解(Iwasawa decomposition)。

在数值计算中,Gram-Schmidt正交化是数值不稳定的,计算中累积的舍入误差会使最终结果的正交性变得很差。

因此在实际应用中通常使用豪斯霍尔德变换或Givens旋转进行正交化。

记法
•:维数为n的内积空间
•:中的元素,可以是向量、函数,等等
•:与的内积
•:、……张成的子空间
•:在上的投影
基本思想
Gram-Schmidt正交化的基本想法,是利用投影原理在已有正交基的基础上构造一个新的正交基。

设。

是上的维子空间,其标准正交基为,且不在上。

由投影原理知,与其在上的投影之差
是正交于子空间的,亦即正交于的正交基。

因此只要将单位化,即
那么就是在上扩展的子空间的标准正交基。

根据上述分析,对于向量组张成的空间 (),只要从其中一个向量(不妨设为)所张成的一维子空间开始(注意到就是的正交基),重复上述扩展构造正交基的过程,就能够得到的一组正交基。

这就是Gram-Schmidt正交化。

算法
首先需要确定已有基底向量的顺序,不妨设为。

Gram-Schmidt 正交化的过程如下:
这样就得到上的一组正交基,以及相应的标准正交基。


考察如下欧几里得空间R n中向量的集合,欧氏空间上内积的定义为<a, b> = b T 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;i<M;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;i<N;i++)
{ printf("请输入第%d个向量:\n",i+1);
for(j=0;j<M;j++)
scanf("%f",p[i]+j);}
for(i=0;i<N*M;i++)
b[0][i]=p[0][i];
//下面是正交化过程
for(i=1;i<N;i++) //i表示第i个向量
{ for(m=0;m<i;m++)
k[m]=zj(b[i],b[m])/zj(b[m],b[m]); //k[m]表示正交化过程中向量前的系数for(j=0;j<M;j++) //j表示每个向量中的坐标
for(m=0;m<i;m++)
b[i][j]-=k[m]*b[m][j];
}
printf("正交化结果为:\n");
for(i=0;i<N;i++)
{ printf("第%d个向量是:\n",i+1);
for(j=0;j<M;j++)
printf("%g ",b[i][j]);
putchar('\n');}
//下面是单位化过程
for(i=0;i<N;i++)
for(j=0;j<M;j++)
p[i][j]=b[i][j]/sqrt(zj(b[i],b[i]));
printf("\n单位化结果为:\n");
for(i=0;i<N;i++)
{ printf("第%d个向量是:\n",i+1);
for(j=0;j<M;j++)
printf("%g ",p[i][j]);
putchar('\n');}
}
实验结果如下:
实践课总结:
在这次实践课的课题讨论中,我所在的这个组个个都发挥自己得能动性。

都积极主动。

拿到课题后,我们马上讨论分工,针对自己所分到得板块去查阅资料,然后再次讨论总结,最后每个人都提出问题共同解决。

当然,在整个过程中遇到问题也是必然的。

例如,由于对C语言不熟练而导致在程序设计时遇到种种困难,多而杂得程序设计在排版上不能让读者一目了然,感觉有点凌乱,并且在第一次试讲过程中老师和细心得同学都提出了几个疑议。

下来后我们再次讨论。

针对那些问题并进行机上调试。

结果得出,我们得设计可能繁杂冗长了些,但没有错,因为输入书上得例子后可以得到正确答案。

这次实践课题讨论让我们知道每一个题在深论时才发觉永远没有底限,源源不断地牵扯出来的新知识还等待学习和探索。

此外就是一个团队的团结和作至关重要,只有大家和谐有序地进行每一次讨论,效果才能事半功倍。

相关文档
最新文档