行列式的定义是什么(2)
行列式的定义是什么
行列式应用
求特征值:给定一个n阶矩阵A,n阶非零列向量x,令Ax=λx,则称λ为A的特征值,x为A的特征向量。通过变形得行列式[A-λE]=0值时,上式成立,而此行列式为零,即Σf(λ)=0即解一元n次方程,求出特征值。
多变元微积分的代换积分法(参见雅可比矩阵) 在 n个 n维实向量所组成的平行多面体的体积,是这些实向量的所组成的矩阵的行列式的绝对值。以此推广,若线性变换可用矩阵 A表示, S是 R的可测集,则 f( S)的体积是 S的体积的倍。朗斯基行列式
行列式的基本性质
n介行列式的性质:
性质1:行列式与他的转置行列式相等。
性质2:互换行列式的两行(列),行列式变号。
推论:若一个行列式中有两行的对应元素(指列标相同的元素)相同,则这个行列式为零。
性质3:行列式中某行的公共因子k,可以将k提到行列式外面来。
推论:行列式中有两行(列)元素对应成比例时,该行列式等于零。
性质4:行列式具有分行(列)相加性。
推论:如果将行列式某一行(列)的每个元素都写成m个数(m为大于2的整数)的和,则此行列式可以写成m个行列式的和。
性质5:行列式某一行(列)各元素乘以同一个数加到另一行(列)对应元素上,行列式不变。
性质6:将一行(列)的k倍加进另一行(列)里,行列式的值不变。 注意:一行(列)的k倍 加上另一行(列),行列式的值改变。
其它性质
若A是可逆矩阵, 设 A‘为 A的转置矩阵, (参见共轭) 若矩阵相似,其行列式相同。 行列式是所有特征值之积。这可由矩阵必和其Jordan标准形相似推导出。
行列式的展开
余因式(英译:cofactor)
又称“余子式”、“余因子”。参见主条目余因式对一个 n阶的行列式 M,去掉 M的第 i行第 j列后形成的 n-1阶的行列式叫做 M关于元素 mij的 子式。记作 M i j。
余因式为 Cij=(-1)^(i+j)*Mij
代数余子式
在n阶行列式中,把(i,j)元aij所在的第i行和第j列划去后,留下来的n-1阶行列式叫做(i,j)元aij的余子式,记作Mij:记
Aij=(-1)i+j Mij
Aij叫做(i,j)元aij的代数余子式
行和列的展开
一个 n阶的行列式 M可以写成一行(或一列)的元素与对应的代数余子式的乘积之和,叫作行列式按一行(或一列)的展开。
这个公式又称作拉普拉斯公式,把 n阶的行列式计算变为了 n个 n-1阶行列式的计算。
行列式函数
由拉普拉斯公式可以看出,矩阵 A的行列式是关于其系数的多项式。因此行列式函数具有良好的光滑性质。
单变量的行列式函数设为的函数,则也是的。其对 t的导数为
矩阵的行列式函数函数是连续的。由此,n阶一般线性群是一个开集,而特殊线性群则是一个闭集。
函数也是可微的,甚至是光滑的()。其在 A处的展开为
也就是说,在装备正则范数的矩阵空间Mn()中,伴随矩阵是行列式函数的梯度
特别当 A为单位矩阵时,
可逆矩阵的可微性说明一般线性群GLn()是一个李群。
行列式与线性方程组
行列式的一个主要应用是解线性方程组。当线性方程组的方程个数与未知数个数相等时,方程组不一定总是有唯一解。对一个有 n个方程和 n个未知数的线性方程组,我们研究未知数系数所对应的行列式。这个线性方程组有唯一解当且仅当它对应的行列式不为零。这也是行列式概念出现的根源。
当线性方程组对应的行列式不为零时,由克莱姆法则,可以直接以行列式的形式写出方程组的解。但用克莱姆法则求解计算量巨大,因此并没有实际应用价值,一般用于理论上的推导。
行列式在数学中,是一个函数,其定义域为的矩阵A,取值为一个标量,写作det(A)或 | A | 。行列式可以看做是有向面积或体积的概念在一般的欧几里得空间中的推广。或者说,在 n 维欧几里得空间中,行列式描述的是一个线性变换对“体积”所造成的影响。无论是在线性代数、多项式理论,还是在微积分学中(比如说换元积分法中),行列式作为基本的数学工具,都有着重要的应用。
高阶行列式的计算
本程序内容
]窗体代码如下b]
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
MsgB
ox "输入错误阶数必须大于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
Opt
ion 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次方的大数,恐怕计算机也无能为力,再则那样实际意义已经不是很大!当然,我们可以开发更好程序去计算,毕竟知识是无界的!
本代码版权保留,仅供技术交流,不得用于商业用途!
更优的算法
其实完全可以用二维数组完成如人的上三角算法,先判定aii是否为零,如是则交换至非零,再上减下直至上三角,再aii连乘即可,算法规模为n^3.至于更好的,可能还有。
看过"行列式的定义"的人还看了:
1.什么是旋转矩阵
3.什么是等价