二阶和三阶行列式
定义1.1.1
设有4个可以进行加法和乘法运算的元素
a,b,c,d
排列成两行两列,引用符号:
并称之为二阶行列式。简记为 D .
解的表达
利用消元法求解二元线性方程组:
利用消元法可以得到方程组唯一的解:
其中:
这就是二元线性方程组的克莱姆法则(cramer)。
n阶行列式的求法
其中
其中 Mij 就是去掉了i行和第j列的行列式。
M有个名字,叫余子式。
练练
求解如下行列式的值。
弄个程序练练
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
是
问: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 = 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合同,记作
A≈B
。
正定矩阵
判定定理1:对称阵A为正定的充分必要条件是:A的特征值全为正。
判定定理2:对称阵A为正定的充分必要条件是:A的各阶顺序主子式都为正。
判定定理3:任意阵A为正定的充分必要条件是:A合同于单位阵。
即:对任意非零列向量,
xT∗A∗x>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)