矩阵求逆标准算法_第1页
矩阵求逆标准算法_第2页
矩阵求逆标准算法_第3页
矩阵求逆标准算法_第4页
矩阵求逆标准算法_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

矩阵求逆标准算法 VB 源码 2006 11 29 13 49 类别 默认 本程序依据矩阵初等变换的基本原理编写 算法较为繁琐 但易于 理解适合 VB 初学者 本程序适合任何 n n 的矩阵求逆 对于不可逆矩阵有提示信息 并结束程序 本程序在 XP VB6 0 下调试通过 本程序由本人原创 请慎用 如有疑问 或调试有误 请联系本人 QQ 30360126 本程序可在 VB6 0 内任何地方用 call jzqn qa na 语句调用 其中 qa 是输入的矩阵数组 调用此函数后 na 为返回的逆矩阵 数组 注意 调用本程序前不要声明 na 的维数 仅用 dim na 即可 请不要试图对一个病态矩阵求逆 否则计算结果未必是你想要的 病态矩阵是指行列式计算结果极其接近于零的矩阵 Public Sub jzqn qa na Dim a n UBound qa 1 ReDim na n n ReDim a n 2 n For i 1 To n For j 1 To n a i j qa i j Next j Next i For i 1 To n For j n 1 To 2 n If j i n Then a i j 1 Else a i j 0 End If Next j Next i For i 1 To n If a i i 0 Then For q i To n If a q i 0 Then For w i To 2 n zj a i w a i w a q w a q w zj Next w Exit For End If Next q If q n Then MsgBox 此矩阵不可逆 Exit Sub End If For k 2 n To i Step 1 a i k a i k a i i Next k For j i 1 To n If a j i 0 Then For k 2 n To i Step 1 a j k a j k a j i a i k Next k End If Next j Next i For i n To 1 Step 1 If a i i 0 Then For q i 1 To 1 Step 1 If a q i 0 Then For w i To 2 n zj a i w a i w a q w a q w zj Next w Exit For End If Next q End If For k 2 n To i Step 1 a i k a i k a i i Next k For j i 1 To 1 Step 1 If a j i 0 Then xxx a j i For k 2 n To 1 Step 1 a j k a j k xxx a i k Next k End If Next j Next i For i 1 To n For j 1 To n na i j a i j n Next j Next i End Sub 调用示例 下面代码随机产生一个 10 10 的矩阵 并求逆 打印于窗体 Private Sub Command1 Click Dim a 10 10 b Cls Randomize For i 1 To 10 For j 1 To 10 a i j Int Rnd 100 Print a i j Next j Print Next i Print Call jzqn a b For i 1 To 10 For j 1 To 10 Print Format b i j 0 000 Next j Print Next i End Sub 矩阵运算是数值运算中经常碰到的 砖头 抛出多天 尚未 引出玉来 我自己再来个补充吧 矩阵求逆上面给出的程序 虽然可以使用 但远不完善 更不精炼 下面将其修改一下 例如 使用 IIF 函数 简化判断分支语句 将 约化 过程合并 添加一个矩阵无逆的判断 但还是属于小打小闹的修修补 补 希望 诸位能挑出程序中的问题 缺陷 诸位版主和大侠们能从赐以高水平的程序代码 不胜感谢 修改后的矩阵求逆代码如下 源程序压缩文件如下 矩阵求逆程序代码 Dim a As Single Dim i j k am tt at bt Private Sub Command1 Click n InputBox 请输入方阵的阶数 N ReDim a n 2 n As Single For i 1 To n For j 1 To n a i j InputBox 请输入 a Next j Print Next i For k 1 To n 换列主元运算 在主元列找出绝对值最大的值作主元 at Abs a k k tt k For j k 1 To n bt Abs a j k If at bt Then at bt tt j End If Next j If tt k Then For j k To 2 n am a k j a k j a tt j a tt j am Next j End If If at 0 0001 Then Print 此矩阵不可逆 逆矩阵计算 am 1 a k k For j k To 2 n a k j a k j am Next j For i 1 To n If k i Then am a i k For j 1 To 2 n a i j a i j a k j am Next j End If Next i Next k Print 所求逆矩阵 For i 1 To n For j n 1 To 2 n Print a i j Next j Print Next i End Sub 矩阵运算 是数值计算中经常碰到的 这里献上的小程序 只能是学习参考 对于矩阵的阶数很大的 实际使用和对于病态 条件数较大 矩阵 如何计算 特别是如何求逆 显然这里的程序力不从心 所以 敬请版主大侠们献出爱心 两矩阵的加 减 很简单 就是现应元素的加 减 条件是两矩阵行 列数都相等 两矩阵的相乘 分为左乘和右乘 条件是右矩阵的行数等于左矩阵的列数 乘法规则麻烦点 请参看 有关参考材料 矩阵求逆 是矩阵运算中比较麻烦的 也是用出较多的 求助未得 只好自己来个粗糙的 这次给出 的程序是包括选主元的 一般满秩矩阵都可以求出其逆矩阵 但是效率有问题 对于病态矩阵求出的逆矩 阵精度欠佳 不一定满足需要 为了大家使用方便 将源程序传上 attachmentid 498 attachmentid 499 attachmentid 500 attachmentid 501 在网上收寻了行列式求值的 发现没有能用的 版主以前对最小二乘法多次曲线拟合算法解说里有行列试求 值的程序 我调试下了 没能成功 不知道到是不是那里出错了 现在献上一个比较精确的矩阵求逆算法 希望大家能研究出一种行列式求值的的程序 Sub JSJZNZA WS DA Dim DNZ As Double YS WS WS 1 2 ReDim DNZ YS For i 1 To WS DI i 1 WS i 2 For j i To WS k DI j DNZ k DA i j Next j Next i For i 1 To WS DI i 1 WS i 2 For j i To WS s DNZ DI j If i 1 Then GoTo 156 156 End If For k 1 To i 1 DK k 1 WS k 2 s s DNZ DK i DNZ DK j DNZ DK k Next k 156 If j i Then 156 DNZ DI j 1 s 0 0000001 GoTo 160 160 End If DNZ DI j s DNZ DI i 160 Next j 160 Next i For i 1 To WS 1 DI i 1 WS i 2 For j i 1 To WS s 1 DNZ DI j If i 1 j 1 Then GoTo 168 168 End If For k i 1 To j 1 DK k 1 WS k 2 s s DNZ DI k DNZ DK j Next k 168 DNZ DI j s 168 Next j Next i For i 1 To WS 1 DI i 1 WS i 2 For j i To WS DJ j 1 WS j 2 If j i Then s DNZ DI j GoTo 174 174 End If s DNZ DI j DNZ DJ j 174 If j WS Then 174 GoTo 178 178 End If For k j 1 To WS DK k 1 WS k 2 s s DNZ DI k DNZ DJ k DNZ DK k Next k 178 DNZ DI j s 178 Next j Next i For i 1 To WS DI i 1 WS i 2 For j 1 To WS DJ j 1 WS j 2 Let K1 DI j Let K2 DJ i If j i Then DA i j DNZ K1 End If Next j Next i ReDim DNZ 1 End Sub 最近想写一个求矩阵逆阵的函数 上网一搜 有一个叫作高斯约旦法求矩阵的方法 用 C 写的 我没看明白 网上大部分都是抄来抄去 全都一个样 所以我按照这个算法的思想 用 VB 写了一个这样的函数 代码如下 Option Explicit 先写一个函数用于交换两个数的函数 Private Sub swap byref a As Double byref b As Double Dim c As Double c a a b b c End Sub 下面是求矩阵逆阵的函数 Public Function Inv m As Double As Double Dim i As Integer Dim j As Integer Dim k As Integer Dim n As Integer Dim temp As Double 从第 k 行 第 k 列开始的右下角子阵中选取绝对值最大的元素 并记住次元素在的行号和 列号 在通过行交换和列交换将它交换到主元素位置上 这一步称为全选主元 n UBound m 1 Dim iw As Integer Dim jw As Integer Dim fMax As Double ReDim iw 0 To n jw 0 To n As Integer For k 0 To n fMax 0 For i k To n For j k To n If Abs m i j fMax Then fMax Abs m i j iw k i jw k j Next j Next i If iw k k Then For i 0 To n swap m k i m iw k i Next i End If If jw k k Then For i 0 To n swap m i k m i jw k Next i End If Next k 在 m 右边增加一个单位阵 构成一个 m 的增广矩阵 mm Dim mm As Double ReDim mm 0 To n 0 To 2 n 1 For i 0 To n For j 0 To n mm i j m i j Next j Next i For i 0 To n For j n 1 To 2 n 1 If i j n 1 Then mm i j 1 Else mm i j 0 End If Next j Next i 通过初等行变换 即高斯消去法 使原矩阵变为单位阵 则右边的单位阵即是原矩阵的逆阵 For k 0 To n 1 For i k 1 To n temp mm i k mm k k For j 0 To 2 n 1 mm i j mm i j mm k j temp Next j Next i Next k For k n To 1 Step 1 For i k 1 To 0 Step 1 temp mm i k mm k k For j 2 n 1 To 0 Step 1 mm i j mm i j mm k j temp Next j Next i Next k For i 0 To n Dim s As Double s mm i i For j 0 To 2 n 1 mm i j mm i j s Next j Next i 输出变换后的右边的矩阵 For i 0 To n For j 0 To n m i j mm i j n 1 Next j Next i 根据在全选主元过程中所记录的行 列交换的信息进行恢复 恢复的原则如下 在全选主元 过程中 先交换的行 列 后进行恢复 原来的行 列 交换用列 行 交换来恢复 For k n To 0 Step 1 If jw k k Then For i 0 To n swap m k i m jw k i Next i End If If iw k k Then For i 0 To n swap m i k m i iw k Next i End If Next k Inv m End Function 有必要在这里说明一下 为什么会有选主元这个过程呢 我开始也不理解 后来去图书馆 查线性代数相关资料 终于弄明白了 大意是这样的 对于有些矩阵 矩阵中某个元素的一个很小的变动 会引起最后计

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论