线性代数笔记:行列式和矩阵;以及具体实战

二阶和三阶行列式

定义1.1.1

设有4个可以进行加法和乘法运算的元素 a,b,c,d 排列成两行两列,引用符号:

acbd=adbc(1.1.3)

并称之为二阶行列式。简记为 D .

解的表达

利用消元法求解二元线性方程组:

{a11x1+a12x2=b1a12x2+a22x2=b2

利用消元法可以得到方程组唯一的解:
x1=a22b1a12b2a11a22a12a21=D1Dx2=a11b2a21b1a11a22a12a21=D2D

其中:
D=a11a21a12a22=a11a22a12a21D1=b1b2a12a22=b1a22a12b2D2=a11a21b1b2=a11b2a21b2

这就是二元线性方程组的克莱姆法则(cramer)。

n阶行列式的求法

Dn=a11a11an1a12a12a12............a1na1nann=a11A11+a12A12+...+a1nA1n

其中
Aij=(1)i+jMij

其中 Mij 就是去掉了i行和第j列的行列式。
Mij=a11ai1,1ai+1,1an,1............a1,j1ai1,2ai+1,2...an,2a1,j+1............a1nai1,nai+1,nan,n

M有个名字,叫余子式。

练练

求解如下行列式的值。

Dn=3200001210430511

Dn=3200001210430511=3(1)1+1012043511+1(1)1+3200012511=15(1)1+31243+2(1)1+11211+5(1)1+30012=75+(2)=77

弄个程序练练


public class Hanglie {
    public static void main(String args[])
    {
        int[][]m={{3,0,1,0},
        {2,0,0,5},
        {0,1,4,1},
        {0,2,3,1}
        };
        int[][]m2={{1,2},
                {2,0}
                };
        System.out.println(hlvalue(m));
    }
    public static int hlvalue(int[][]matrix)
    {

        int sum = 0;    
        if(matrix[0].length==2)
        {
            return matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
        }
        else
        {
        for(int j=0;j<matrix[0].length;j++)
        {


            if(matrix[0][j]==0)continue;
            //1-size,不要j列
            int modlength = matrix[0].length-1;
            int modmatrix[][]=new int[modlength][modlength];
            for(int m1=0;m1<modlength;m1++)
            {
                for(int m2=0;m2<modlength;m2++)
                {
                    modmatrix[m1][m2]=matrix[m1+1][m2>=j?m2+1:m2];
                }
            }

            for(int m1=0;m1<modlength;m1++)
            {
                for(int m2=0;m2<modlength;m2++)
                {
                    System.out.print(modmatrix[m1][m2]+",");
                }
                System.out.println();
            }
            int sign = ((j+2)%2==0?1:-1);
            System.out.println(matrix[0][j]+"===="+sign);
            sum+=matrix[0][j]*sign*hlvalue(modmatrix);
        }
        return sum;
        }//else
    }

}

python

import numpy as np
matrix =[[3,0,1,0],[2,0,0,5],[0,1,4,1],[0,2,3,1]]
print(matrix)
det = np.linalg.det(matrix)
print(det)

输出:

[[3, 0, 1, 0], [2, 0, 0, 5], [0, 1, 4, 1], [0, 2, 3, 1]]
-77.0

依赖numpy包。下面会介绍矩阵的一些基础。

逆矩阵

如果 A n阶方阵,如果存在矩阵 B ,使得AB=E,那么 B 就是A的逆矩阵。

问:A有没有逆矩阵呢?
答:存在逆矩阵的充分必要条件是 |A|0 , 也称A为满秩矩阵,为非奇异矩阵; 否则 |A|=0 , 则A为奇异矩阵,或降秩矩阵。
继续上例子:

matrix =[[3,0,1,0],[2,0,0,5],[0,1,4,1],[0,2,3,1]]
m = np.mat(matrix)
invm = np.linalg.inv(m)
invm=[[ 0.32467532  0.01298701 -0.12987013  0.06493506]
 [ 0.02597403 -0.03896104 -0.61038961  0.80519481]
 [ 0.02597403 -0.03896104  0.38961039 -0.19480519]
 [-0.12987013  0.19480519  0.05194805 -0.02597403]]

我们来验证一下:

prin(invm*matrix)
[[  1.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   1.00000000e+00  -5.55111512e-17   2.77555756e-17]
 [  0.00000000e+00   0.00000000e+00   1.00000000e+00   1.04083409e-17]
 [  0.00000000e+00   0.00000000e+00  -2.08166817e-17   1.00000000e+00]] 

求解线性方程组

求解线性方程组 AX=B

A = np.mat("1 -2 1;0 2 -8;-4 5 9")
B = np.array([0,8,-9])
X = np.linalg.solve(A,B)
print(X)
print(np.dot(A,X))
>>
[ 29.  16.   3.]
[[ 0.  8. -9.]]

特征值和特征向量

如果 Aξ=λξ ,其中 λ 是标量, ξ 是向量; A 为方阵, 那么称非零向量ξ为矩阵A的对应于特征值 λ 的特征向量。

a = np.matrix("3 -2;1 0")
lambda0 = np.linalg.eigvals(a)
print(lambda0) #存在两个特征值,也就对应两个特征向量
lamda,vec = np.linalg.eig(a)
# 验证
print(lamda,vec)
print(np.dot(a,vec[:,0]))# av 
print(lamda[0]*vec[:,0]) # lv

print(np.dot(a,vec[:,1]))
print(lamda[1]*vec[:,1])

貌似svd有点复杂。后续再更。

合同矩阵

设A,B是两个n阶方阵,若存在可逆矩阵C,使得
CTAC=B
则称方阵A与B合同,记作 AB

正定矩阵

 判定定理1:对称阵A为正定的充分必要条件是:A的特征值全为正。
 判定定理2:对称阵A为正定的充分必要条件是:A的各阶顺序主子式都为正。  
 判定定理3:任意阵A为正定的充分必要条件是:A合同于单位阵。
 即:对任意非零列向量, xTAx>0 则A是正定矩阵。A必须是对称的(前提条件)。

怎么判定呢?

import numpy as np
def is_pos_def(x):
 eigvals =  np.linalg.eigvals(x)
 print eigvals
 return np.all(eigvals > 0)
if __name__ == "__main__":
    R = [
        [1, 2, 3, 4],
        [2, 0, 0, 1],
        [3, 0, 0, 5],
        [4, 1, 5, 4]
    ]  ##(5,4,), k=2
    print is_pos_def(R)
    C = np.linalg.cholesky(R2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值