资源描述:
《矩阵求逆标准算法.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、矩阵求逆标准算法(VB)源码2006-11-2913:49类别:默认 本程序依据矩阵初等变换的基本原理编写,算法较为繁琐,但易于理解适合VB初学者。 本程序适合任何(n*n)的矩阵求逆,对于不可逆矩阵有提示信息,并结束程序 本程序在XP,VB6.0下调试通过 本程序由本人原创,请慎用。如有疑问,或调试有误,请联系本人QQ 本程序可在VB6.0内任何地方用calljzqn(qa(),na()))语句调用 其中qa()是输入的矩阵数组,调用此函数后na()为返回的逆矩阵数组 注意:调用本程序前不要声明na()的维数,仅用dimna()即可。 请不要试图对一个病态矩阵求逆
2、、否则计算结果未必是你想要的 病态矩阵是指行列式计算结果极其接近于零的矩阵PublicSubjzqn(qa(),na())Dima()n=UBound(qa,1)ReDimna(n,n)ReDima(n,2*n) Fori=1Ton Forj=1Ton a(i,j)=qa(i,j) Nextj NextiFori=1Ton Forj=n+1To2*n Ifj-i=nThen a(i,j)=1 Else a(i,j)=0 EndIf Nextj Nexti Fori=1Ton Ifa(i,i)=0Then Forq=iTon Ifa(q,i)<>0Then
3、 Forw=iTo2*n zj=a(i,w) a(i,w)=a(q,w) a(q,w)=zj Nextw ExitFor EndIf Nextq Ifq>nThenMsgBox"此矩阵不可逆":ExitSub EndIf Fork=2*nToiStep-1 a(i,k)=a(i,k)/a(i,i) Nextk Forj=i+1Ton Ifa(j,i)<>0Then Fork=2*nToiStep-1 a(j,k)=a(j,k)/a(j,i)-a(i,k) Nextk EndIf Ne
4、xtjNextiFori=nTo1Step-1 Ifa(i,i)=0Then Forq=i-1To1Step-1 Ifa(q,i)<>0Then Forw=iTo2*n zj=a(i,w) a(i,w)=a(q,w) a(q,w)=zj Nextw ExitFor EndIf Nextq EndIf Fork=2*nToiStep-1 a(i,k)=a(i,k)/a(i,i) Nextk Forj=i-1To1Step-1 Ifa(j,i)<>0Then xxx=a(j,i) Fork=2*nT
5、o1Step-1 a(j,k)=a(j,k)/xxx-a(i,k) Nextk EndIf NextjNextiFori=1Ton Forj=1Ton na(i,j)=a(i,j+n)NextjNextiEndSub 调用示例:下面代码随机产生一个10*10的矩阵,并求逆,打印于窗体PrivateSubCommand1_Click()Dima(10,10),b()ClsRandomizeFori=1To10 Forj=1To10 a(i,j)=Int(Rnd*100) Printa(i,j); Nextj PrintNextiPrintCalljzq
6、n(a(),b())Fori=1To10 Forj=1To10 PrintFormat(b(i,j),"0.000"), Nextj PrintNextiEndSub矩阵运算是数值运算中经常碰到的,“砖头”抛出多天,尚未“引出玉来”,我自己再来个补充吧!矩阵求逆上面给出的程序,虽然可以使用,但远不完善,更不精炼。下面将其修改一下,例如:使用IIF()函数简化判断分支语句,将“约化”过程合并,添加一个矩阵无逆的判断,……。但还是属于小打小闹的修修补补,希望诸位能挑出程序中的问题、缺陷,诸位版主和大侠们能从赐以高水平的程序代码,不胜感谢!修改后的矩阵求逆代码如下:源程序压缩文件如下
7、:矩阵求逆程序代码Dima()AsSingleDimi%,j%,k%,am!,tt%,at!,bt!PrivateSubCommand1_Click()n=InputBox("请输入方阵的阶数N")ReDima(n,2*n)AsSingleFori=1TonForj=1Tona(i,j)=InputBox("请输入a("&i&","&j&")的值")a(i,j+n)=IIf(i=j,1,0)‘使用IIf()函数,简化此判断结构Nextj,iPrint"原矩阵的增广矩阵