行列式
简介在线性代数,行列式是一个函数,其定义域为的矩阵A,值域为一个标量,写作det(A)。在本质上,行列式描述的是在n维空间中,一个线性变换所形成的“平行多面体”的“体积”。行列式无论是在微积分学中(比如说换元积分法中),还是在线性代数中都有重要应用。
行列式概念的最初引进是在解线性方程组的过程中。行列式被用来确定线性方程组解的个数,以及形式。随后,行列式在许多领域都逐渐显现出重要的意义和作用。于是有了线性自同态和向量组的行列式的定义。
行列式的特性可以被概括为一个n次交替线性形式,这反映了行列式作为一个描述“体积”的函数的本质。
若干数字组成的一个类似于矩阵的方阵,与矩阵不同的是,矩阵的表示是用中括号,而行列式则用线段。行列式的值是按下述方式可能求得的所有不同的积的代数和,既是一个实数:求每一个积时依次从每一行取一个元因子,而这每一个元因子又需取自不同的列,作为乘数,积的符号是正是负决定于要使各个乘数的列的指标顺序恢复到自然顺序所需的换位次数是偶数还是奇数。也可以这样解释:行列式是矩阵的所有不同行且不同列的元素之积的代数和,和式中每一项的符号由积的各元素的行指标与列指标的逆序数之和决定:若逆序数之和为偶数,则该项为正;若逆序数之和为奇数,则该项为负。
垂直线记法矩阵A的行列式有时也记作 |A|。绝对值和矩阵范数也使用这个记法,有可能和行列式的记法混淆。不过矩阵范数通常以双垂直线来表示(如:),且可以使用下标。此外,矩阵的绝对值是没有定义的。因此,行列式经常使用垂直线记法(例如:克莱姆法则和子式)。例如,一个矩阵:
行列式 det(A) 也写作 |A| 或明确的写作:
即矩阵的方括号以细长的垂直线取代。
定义一个矩阵A的行列式有一个乍看之下很奇怪的定义:
其中sgn(σ)是排列σ的符号差。
对于比较小的矩阵,比如说二阶和三阶的矩阵,行列式表达如下,有些像是主对角线(左上至右下)元素的乘积减去副对角线(右上至左下)元素的乘积(见图中红线和蓝线)。
2阶: 3阶:。 但对于阶数较大的矩阵,行列式有n!项,并不是这样的形式。
二维向量组的行列式
行列式是向量形成的平行四边形的面积
设P是一个二维的有向欧几里得空间,即一个所谓的欧几里得平面。两个向量X和X’的行列式是:
经计算可知,行列式表示的是向量X和X ’形成的平行四边形的有向面积。并有如下性质:
行列式为零当且仅当两个向量共线(线性相关),这时平行四边形退化成一条直线。 如果以逆时针方向为正向的话,有向面积的意义是:平行四边形面积为正当且仅当向量X和X’逆时针排列(如图)。 行列式是一个双线性映射。也就是说, , 并且 。
三维向量组的行列式
设E是一个三维的有向欧几里得空间。三个三维向量的行列式是:
这时的行列式表示X、X’和X’’三个向量形成的平行六面体的有向体积,也叫做这三个向量的混合积。同样的,可以观察到如下性质:
行列式为零当且仅当三个向量共线或者共面(三者线性相关),这时平行六面体退化为平面图形,体积为零。 这时行列式是一个“三线性映射”,也就是说,对第一个向量有 ,对第二、第三个向量也是如此。基的选择
在以上的行列式中,我们不加选择地将向量在所谓的正交基下分解,实际上在不同的基之下,行列式的值并不相同。这并不是说平行六面体的体积不唯一。恰恰相反,基的变换可以看作线性映射对基的作用,而不同基下的行列式代表了基变换对“体积”的影响。可以证明,对于所有同定向的标准正交基,向量组的行列式的值是一样的。也就是说,如果我们选择的基都是“单位长度”,并且两两正交,那么在这样的基之下,平行六面体的体积是唯一的。
线性变换
经线性映射后的正方体
设E是一个一般的n维的有向欧几里得空间。一个线性变换把一个向量线性地变为另一个向量。比如说,在三维空间中,向量(x,y,z)被射到向量(x’,y’,z’):
其中a、b、c等是系数。如右图,正方体(可以看作原来的一组基形成的)经线性变换后可以变成一个普通的平行六面体,或变成一个平行四边形(没有体积)。这两种情况表示了两种不同的线性变换,行列式可以将其很好地分辨出来(为零或不为零)。
更详细地说,行列式表示的是线性变换前后平行六面体的体积的变化系数。如果设左边的正方体体积是一,那么中间的平行六面体的(有向)体积就是线性变换的行列式的值,右边的平行四边形体积为零,因为线性变换的行列式为零。这里我们混淆了线性变换的行列式和向量组的行列式,但两者是一样的,因为我们在对一组基作变换。
严格的定义由二维及三维的例子,我们可以看到一般的行列式应该具有怎样的性质。为了描述一个n维空间中的“平行多面体”的“体积”,行列式首先需要是线性的,这可以由面积的性质得到。这里的线性是对于每一个向量来说的,因为当一个向量变为原来的a倍时,“平行多面体”的“体积”也变为原来的a倍。其次,当一个向量在其它向量组成的“超平面”上时,“平行多面体”的“体积”是零(可以想象三维空间的例子)。也就是说,当向量线性相关时,行列式为零。于是可以得出行列式的定义:
向量组的行列式
行列式是E到K上的交替多线性形式。
具体来说,设E是一个内积空间,一个从E到K上的交替多线性形式是指函数:
(多线性) 或者说,当ai=aj的时候 (交替性) 所有E到K上的交替多线性形式的集合记作An(E)。
定理:An(E)的维度是1,也就是说,设是E的一组基,那么,所有的交替多线性形式都可以写成
其中是在基B下的展开。 定理的证明是对任一个多线性形式,考虑将D依照多线性性质展开,
这时,由交替性,当且仅当 是的一个排列,所以有
这里, 。
向量组的行列式设是E的一组基,基B的行列式就是唯一的(由定理可知)交替多线性形式 使得:
detB(e1,...,en) = 1 于是向量组 的行列式就是
其中是在基B下的展开。 这个公式有时被称作莱布尼兹公式。
基变更公式设B与B’是向量空间中的两组基,则将上式中的detB改为detB’就得到向量组在两组基下的行列式之间的关系:
矩阵的行列式
设Mn(K)为所有定义在K上的矩阵的集合。将矩阵A的元素为A=(aij)。将矩阵M的 n 行写成,aj可以看作是上的向量。于是可以定义矩阵A的行列式为向量组的行列式,这里的向量都在的正交基上展开,因此矩阵的行列式不依赖于基的选择。
这样定义的矩阵A的行列式与向量组的行列式有同样的性质。单位矩阵的行列式为1,若矩阵的两行线性相关,则行列式为零。
由莱布尼兹公式,可以证明矩阵行列式的一个重要性质:一个矩阵的行列式等于它的转置矩阵的行列式。
也就是说矩阵的行列式既可以看作 n 个行向量的行列式,也可以看作 n 个列向量的行列式。
证明:矩阵A的转置矩阵的行列式是:
令j= σ(i),由于每个排列都是双射,所以上式变成:
令τ = σ ,当 σ 取遍所有排列时,τ 也取遍所有排列,而且 σ 的符号差等于 τ 的符号差。所以
线性映射的行列式
设f是n维线性空间E到自身的线性变换(线性自同态),f在E的任意一组基下的变换矩阵的行列式都是相等的。设B是E的一组基。那么f的行列式就是f在B下的变换矩阵的行列式:
之前对正方体做变换时,x1, ..., xn是原来的基,,因此可以混淆向量组的行列式和线性变换的行列式。
考虑映射df,B使得x1, ..., xn被映射到
df,B是一个交替n线性形式,因此由前面证的定理,df,B和detB只相差一个系数。
令x1, ..., xn等于B,则得到
λ =df,B(B) 所以有
也就是说
对于另外一组基B',运用基变更公式,可以得到du, B(B)等于du, B ' (B ' )。于是df,B(B) 是一个不依赖于基,只依赖于f的数。这正是 detf的定义。
特别地,行列式为 1 的线性变换保持向量组的行列式,它们构成一般线性群GL(E)的一个子群SL(E),称作特殊线性群。可以证明,SL(E)是由所有的错切生成的,即所有具有如下形式的矩阵代表的线性变换:
也就是说,错切变换保持向量组形成的“平行多面体”的体积。同样,可以证明两个相似矩阵有相等的行列式。
应用求特征值:若多项式p(x) = det(xI−A),矩阵A的特征值就是多项式的解。 多变元微积分的代换积分法(参见雅可比矩阵) 在n个n维实向量所组成的平行多面体的体积,是这些实向量的所组成的矩阵的行列式的绝对值。以此推广,若线性变换可用矩阵A表示,S是R的可测集,则f(S)的体积是S的体积的倍。 朗斯基行列式
行列式的基本性质在行列式中,一行(列)元素全为0,则此行列式的值为0。 在行列式中,某一行(列)有公因子k,则可以提出k。 在行列式中,某一行(列)的每个元素是两数之和,则此行列式可拆分为两个相加的行列式。 行列式中的两行(列)互换,改变行列式正负符号。 在行列式中,有两行(列)对应成比例或相同,则此行列式的值为0。 将一行(列)的k倍加进另一行(列)里,行列式的值不变。 注意:一行(列)的k倍加上另一行(列),行列式的值改变。 将行列式的行列互换,行列式的值不变。其中,行列互换相当于转置,记作D=D。 例如
其它性质
若A是可逆矩阵, 设A为A的转置矩阵, (参见共轭) 若矩阵相似,其行列式相同。 行列式是所有特征值之积。这可由矩阵必和其Jordan标准形相似推导出。
行列式的展开余因式(英译:cofactor)
又称“余子式”、“余因子”。参见主条目余因式对一个n阶的行列式M,去掉M的第i行第j列后形成的n-1阶的行列式叫做M关于元素mij的子试。记作Mij。
余因式为 Cij=(-1)^(ij)*Mij
代数余子式
M关于元素mij的代数余子式记作Cij。。
行列式关于行和列的展开
一个n阶的行列式M可以写成一行(或一列)的元素与对应的代数余子式的乘积之和,叫作行列式按一行(或一列)的展开。
这个公式又称作拉普拉斯公式,把n阶的行列式计算变为了n个n-1阶行列式的计算。
行列式函数
由拉普拉斯公式可以看出,矩阵A的行列式是关于其系数的多项式。因此行列式函数具有良好的光滑性质。
单变量的行列式函数设为的函数,则也是的。其对t的导数为
矩阵的行列式函数函数是连续的。由此,n阶一般线性群是一个开集,而特殊线性群则是一个闭集。
函数也是可微的,甚至是光滑的()。其在A处的展开为
也就是说,在装备正则范数的矩阵空间Mn()中,伴随矩阵是行列式函数的梯度
特别当A为单位矩阵时,
可逆矩阵的可微性说明一般线性群GLn()是一个李群。
应用行列式与线性方程组
行列式的一个主要应用是解线性方程组。当线性方程组的方程个数与未知数个数相等时,方程组不一定总是有唯一解。对一个有n个方程和n个未知数的线性方程组,我们研究未知数系数所对应的行列式。这个线性方程组有唯一解当且仅当它对应的行列式不为零。这也是行列式概念出现的根源。
当线性方程组对应的行列式不为零时,由克莱姆法则,可以直接以行列式的形式写出方程组的解。但用克莱姆法则求解计算量巨大,因此并没有实际应用价值,一般用于理论上的推导。
高阶行列式的计算 vb源码本程序包括三个模块和一个窗体
窗体代码如下
Option Explicit
Option Base 1
Private Sub Form_Load()
Dim i As Long
n = Val(InputBox("请输入行列式的阶数!", "输入框"))
If n < 2 Then
MsgBox "输入错误阶数必须大于1!" & vbCrLf & "请单击重试重新输入!", vbCritical, "系统提示"
Exit Sub
Command2.TabIndex = 1
End If
If n > 9 Then
MsgBox "输入错误本程序只能计算10阶一下的行列式!" & "请单击重试重新输入!", vbCritical, "系统提示"
Exit Sub
Command2.TabIndex = 1
End If
str2 = "1"
For i = 2 To n
str2 = str2 & i '组成1到n组成的字符串123456.....n
Next i
s = n
MsgBox "请在文本框里按行排列输入行列式" & vbCrLf & "注意用一个空格隔开!", vbOKOnly, "信息提示"
Text1.TabIndex = 1
Text1.Text = ""
End Sub
Private Sub Command1_Click()
Dim i As Long, j As Long, k As Long, m As Long, sum As Long, w As Long
Dim strb As String, sz1() As String, sz2() As Long, sz3() As Long
Dim str1 As String, str3 As String, st() As String
ReDim sa(n) As Long, sz2(n) As Long
'//st() 为输入行列式的字符串数组
'//sz3()为二维行列式数组
'//str2为1到n组成的字符串123456.....n 为全局变量
'//str3为str2的全排列所组成的字符串每种排列以“,”隔开
str1 = Text1.Text
If Len(str1) < 2 * n ^ 2 - 1 Then
MsgBox "输入错误!" & vbCrLf & n & "阶行列式中元素个数应为" & n ^ 2 & "!" & vbCrLf & "请查看是否个元素之间都用空格隔开及个数是否正确!" & vbCrLf & "请点击重试重新输入!", vbCritical, "系统提示"
Text1.Text = ""
Exit Sub
End If
st() = Split(str1) '取得行列式的数据
ReDim sz3(n, s) As Long
For i = 1 To n
For j = 1 To s
k = (i - 1) * s + j '按行排列行列式中第k个数,k与i,j的关系
sz3(i, j) = Val(st(k - 1)) '把原数组按行排列存入一个二维数组
Next j
Next i
Permutation "", str2, str3
sz1() = Split(str3, ",") '取n!个全排列存入 数组 sz1()
For j = 1 To JC(n)
m = 1 '每次都降m初始为1
strb = sz1(j) '每次取出一种排列存入strb
For i = 1 To n
sz2(i) = Val(Mid(strb, i, 1)) '顺序取每个全排列中的数字存入数组sz2()
Next i
For i = 1 To n
m = m * sz3(sz2(i), i) '求元素之积
Next i
sum = sum + arr(sz2(), n) * m 'n!个积相加并相应冠上正负号
Next j
Text2.Text = sum
End Sub
Private Sub Command2_Click()
Dim i As Long
n = Val(InputBox("请输入行列式的阶数!", "输入框"))
If n < 2 Then
MsgBox "输入错误阶数必须大于1!" & vbCrLf & "请单击重试重新输入!", vbCritical, "系统提示"
Exit Sub
Command2.TabIndex = 1
End If
If n > 9 Then
MsgBox "输入错误本程序只能计算10阶一下的行列式!" & "请单击重试重新输入!", vbCritical, "系统提示"
Exit Sub
Command2.TabIndex = 1
End If
str2 = "1"
For i = 2 To n
str2 = str2 & i '组成1到n组成的字符串123456.....n
Next i
s = n
MsgBox "请在文本框里按行排列输入行列式" & vbCrLf & "注意用一个空格隔开!", vbOKOnly, "信息提示"
Text1.Text = ""
End Sub
模块1
递归法求全排列
Option Explicit
Option Base 1
'递归求全排列并返回全排列所组成的字符串
'算法描述:
'以8位为例,求8位数的全排列,其实是8位中任取一位
'在后加上其余7位的全排列
'7 位:任取一位,其后跟剩下6位的全排列
'……
'这样就有两部分,一部分为前面的已经取出来的串,另一部分为后面即将进行的全排列的串
'参数pre即为前面已经取出来的串
'参数s即为将要进行排列的串
'参数str即为返回全排列所组成的字符串,每种排列以“,”隔开
Public Sub Permutation(pre As String, s As String, str As String)
Dim i As Long
'// 如果要排列的串长度为1,则返回
If Len(s) = 1 Then
'//将排列数以“,”隔开存入一个字符串
str = str & "," & pre & s
Exit Sub
End If
'// for循环即是取出待排列的串的任一位
For i = 1 To Len(s)
'// 递归,将取出的字符并入已经取出的串
'// 那么剩下的串即为待排列的串
Permutation pre & Mid$(s, i, 1), Left$(s, i - 1) & Mid$(s, i + 1), str
Next i
End Sub
模块2
求逆序数
Option Explicit
Option Base 1
Public n As Long, s As Long, str2 As String
'//求存入a()数组排列为奇排列还偶排列如果为奇排列返回-1,偶排列返回1
Public Function arr(a() As Long, ByVal n As Long) As Integer
Dim i As Long, j As Long, k As Long, m As Long
For i = 1 To n - 1
m = i
For j = m + 1 To n
If a(i) > a(j) Then k = k + 1
Next
Next
arr = (-1) ^ k
End Function
模块3
递归法求阶乘
Option Explicit
'//递归法求阶乘
Public Function JC(n As Long) As Double
If n < 2 Then JC = 1: Exit Function
JC = n * JC(n - 1)
End Function
基本控件如图
command1为计算command2为重试推广到高阶行列式
以上代码只适用10阶一下行列式的计算,原因是限于模块1代码递归法求全排列只能对123....89求全排列但大于9就出现了两位数,不能再 返回其所要的全排列,但不是不能避免的,我们可以用单个字符来代替多位数,在返回全排列存入所需数组后再用ASCII 一一对应返回其数值,再进行计算,也许有人会说当我们用完所有字符怎么办呢,但100行列式我们要计算10000个数的全排列的逆序等,其计算量已是赫然10的160次方的大数,恐怕计算机也无能为力,再则那样实际意义已经不是很大!当然,我们可以开发更好程序去计算,毕竟知识是无界的!
本代码版权保留,仅供技术交流,不得用于商业用途!
行列式的历史
行列式的概念最早是在17世纪由日本数学家关孝和提出来的,他在1683年写了一部名为解伏题之法的著作,意思是“解行列式问题的方法”,书中对行列式的概念和它的展开已经有了清楚的叙述。欧洲第一个提出行列式概念的是德国数学家,微积分学奠基人之一莱布尼茨。
些参考资料(英文) Michael Artin, Algebra; Henri Cartan,Cours de calcul différentiel, Paris, Hermann, 1977 ; Pierre Gabriel, Matrices, géométrie, algèbre linéaire维基百科