余因式(英译: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维基百科