二阶和三阶行列式
定义1.1.1
设有4个可以进行加法和乘法运算的元素a,b,c,d排列成两行两列,引用符号:
∣∣∣acbd∣∣∣=ad−bc(1.1.3)
并称之为二阶行列式。简记为D.
解的表达
利用消元法求解二元线性方程组:
利用消元法可以得到方程组唯一的解:
x1=a22b1−a12b2a11a22−a12a21=D1Dx2=a11b2−a21b1a11a22−a12a21=D2D
其中:
D=∣∣∣a11a21a12a22∣∣∣=a11a22−a12a21D1=∣∣∣b1b2a12a22∣∣∣=b1a22−a12b2D2=∣∣∣a11a21b1b2∣∣∣=a11b2−a21b2
这就是二元线性方程组的克莱姆法则(cramer)。
n阶行列式的求法
Dn=∣∣∣∣∣∣a11a11⋮an1a12a12⋮a12............a1na1n⋮ann∣∣∣∣∣∣=a11A11+a12A12+...+a1nA1n
其中
Aij=(−1)i+jMij
其中Mij就是去掉了i行和第j列的行列式。
Mij=∣∣∣∣∣∣∣∣a11ai−1,1ai+1,1⋮an,1.........⋮...a1,j−1ai−1,2ai+1,2...an,2a1,j+1.........⋮...a1nai−1,nai+1,nan,n∣∣∣∣∣∣∣∣
M有个名字,叫余子式。
练练
求解如下行列式的值。
Dn=∣∣∣∣∣∣3200001210430511∣∣∣∣∣∣
Dn=∣∣∣∣∣∣3200001210430511∣∣∣∣∣∣=3(−1)1+1∣∣∣∣012043511∣∣∣∣+1∗(−1)1+3∣∣∣∣200012511∣∣∣∣=15(−1)1+3∣∣∣1243∣∣∣+2(−1)1+1∣∣∣1211∣∣∣+5(−1)1+3∣∣∣0012∣∣∣=−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是
问: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)