文章目录
tip:一些废话实在不想看就直接跳转到 代码实现
前言
以下内容主要关于求逆的两种方法:
初等行列变换法
伴随矩阵法
当矩阵数值足够“变态”时,将初等行列变换法和伴随矩阵法求出的值分别与matlab的inv求出的值进行比较,发现初等行列变换法更接近matlab求出的值(当然不排除我写的伴随矩阵法求逆有错误缘故)。
姑且片面的认为:初等行列变换法相比伴随矩阵法算出的结果更接近matlab求逆算出的结果
一、矩阵求逆
tip:先搬运一段百度百科上的内容
百度百科
矩阵求逆,即求矩阵的逆矩阵。矩阵是线性代数的主要内容,很多实际问题用矩阵的思想去解既简单又快捷。逆矩阵又是矩阵理论的很重要的内容,逆矩阵的求法自然也就成为线性代数研究的主要内容之一。
设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩B,使得: AB=BA=E。 则我们称B是A的逆矩阵,而A则被称为可逆矩阵。其中,E为单位矩阵。
典型的矩阵求逆方法有:利用定义求逆矩阵、初等变换法、伴随阵法、恒等变形法等。
二、初等行列变换法
1、基本公式
tip:请忽视为啥不是虚线,因为不会弄
2、相关性质和定理
性质1:
把行列式的某一行(列)的倍数加到另一方(列)上,行列式的值不变
定理 1:
n阶矩阵A可逆当且仅当A的标准型是In
定理2:
可逆矩阵总可以经过一系列初等变换化成单位矩阵
3、算法逻辑
文字太麻烦了,所以就放了个流程图…还看不懂?再加上一个简单的示例应该能懂了吧,如果还不懂,请原谅我爱莫能助了。
以下图 可逆矩阵 为例 (例题缺少aii=0的情况)
初始化成初等行变换矩阵的形式
第一次循环,第一列左边恰好是 1,X,X 因此这一次循环不会产生变化
注:
假设一个n×n阶可逆矩阵
第一次循环的结果是1,X,X,...
第二次循环最后的结果应该是0,1,X, ...
第三次循环最后的结果应该是0,0,1, ...
每次循环都需要把该列的其他行变换为0
以此类推,第n次循环,第n列第n行为1,其余为0;
第二次循环 (红色表示产生变化的部分)
R2×0.5:
观察上图,a12的值是-1,是a22的-1倍
R1-(-1)×R2:
第三次循环
同理,a13是a33的3倍,a23是a33的2倍
R1-3×R3
R2-2×R3
求逆结果:
4、代码实现
/// <summary>
/// 初等变化法求逆
/// </summary>
/// <param name="matrix"></param>
public static double[,] Inverse(double[,] matrix)
{
//可逆矩阵行列相等
int n = matrix.GetLength(0);
//初始化变换矩阵
double[,] temp = new double[n, 2 * n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
temp[i, j] = matrix[i, j];
if (i == j)
{
temp[i, n + j] = 1.0;
}
else
{
temp[i, n + j] = 0.0;
}
}
}
//按列循环进行
for (int i = 0