矩阵逆元

@Pelom  October 29, 2021

矩阵逆元

一、定义

设$A$是一个$n$阶方阵,若存在另一个$n$阶方阵$B$,使得$AB=BA=E$,则称方阵$A$可逆,并称方阵$B$是$A$的逆矩阵,记作$A^{-1}$

二、求法

1.伴随矩阵求逆法

设$A=(a_{ij})_{n\times n}$,$A_{ij}$为$A$的元素$a_{ij}$的代数余子式,则矩阵

$$ \left[ \begin{matrix} A_{11} & A_{21} & \cdots & A_{n1} \\ A_{12} & A_{22} & \cdots & A_{n2} \\ \vdots & \vdots & & \vdots \\ A_{1n} & A_{2n} & \cdots & A_{nn} \\ \end{matrix} \right] $$

称为矩阵$A$的伴随矩阵,记作$A^*$

$$ \begin{aligned} AA^* &= \left[ \begin{matrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \\ \end{matrix} \right] \left[ \begin{matrix} A_{11} & A_{21} & \cdots & A_{n1} \\ A_{12} & A_{22} & \cdots & A_{n2} \\ \vdots & \vdots & & \vdots \\ A_{1n} & A_{2n} & \cdots & A_{nn} \\ \end{matrix} \right] \\ &= \left[ \begin{matrix} |A| & 0 & \cdots & 0 \\ 0 & |A| & \cdots & 0 \\ \vdots & \vdots & & \vdots \\ 0 & 0 & \cdots & |A| \\ \end{matrix} \right] \\ &=|A|E \end{aligned} $$

当$|A|\neq 0$时,存在$A^{-1}$,且
$$A^{-1}=\frac{1}{|A|}A^*$$
显然,利用伴随矩阵求矩阵逆元的计算相当复杂

2.初等变换求逆法

由单位矩阵$E$经过一次初等变换得到的矩阵称为初等矩阵
设$A$是一个$m\times n$矩阵,对$A$进行一次初等行变换,相当于在$A$左乘上相应的$m$阶初等矩阵
可逆矩阵$A$可表示为有限个初等矩阵的乘积

若$A$为$n$阶可逆矩阵,则$A^{-1}$可以表示为有限个初等矩阵的乘积,即$$A^{-1}=P_1P_2\cdots P_m$$由$A^{-1}A=E$,有$$P_1P_2\cdots P_mA=E$$又$$P_1P_2\cdots P_mE=A^{-1}$$将$A$与$E$放在一起,则有

$$ (P_1P_2\cdots P_m) \begin{array}{c:c}(A&E)\end{array} =\begin{array}{c:c}(E&A^{-1})\end{array} $$

即对$n\times 2n$矩阵$\begin{array}{c:c}(A&E)\end{array}$进行初等行变换,使$A$变换为$E$,此时$E$变换为$A^{-1}$

3.高斯-约旦消元法(Gauss-Jordan Elimination)

通过初等行变换将矩阵$A$变换为$E$需要用到高斯-约旦消元法

void GJ(){
    for(int i=1;i<=n;i++){
        int r=i;
        for(int j=i+1;j<=n;j++)
            if(fabs(a[j][i])>fabs(a[r][i]))
                r=j;
        if(i!=r)
            swap(i,r);
        if(fabs(a[i][i]<eps)){
            puts("No Solution");
            return;
        }
        for(int k=1;k<=n;k++){
            if(i==k)
                continue;
            double p=a[k][i]/a[i][i];
            for(int j=i;j<=n+n;j++)
                a[k][j]-=p*a[i][j];
        }
    }
    for(int i=1;i<=n;i++)
        a[i][i+n]/=a[i][i];
}

添加新评论