选列主元素消元法:在高斯消去法的消元过程中第k步要求除以akk,为了防止除数为零或除数太小造成的误差过大的问题,在消元开始是先将该列最大元(绝对值)所在行移到消元第一行在除akk,然后消元。
列主元消去法虽然和高斯消去法原理一样,但是列主元消去法可以减小舍入误差,精度比较高,是解决小型稠密矩阵的一个较好的算法。而高斯消去法虽然编程简单,但是计算量大,而且对于两个相近的解时由于舍入误差的存在,使得结果误差很大。
引起其他元素
的数量级及舍人误差急剧增大,导致最终计算结果不可靠。为了避免在高斯消去法应用中可能出现的这类问题,就发展形成了列主元、全主元等多种消去法。
这些方法的基本点在于对高斯消去法的过程作某些技术性修改,全面或局部地选取绝对值最大的元素为主元素,从而构成了相应的主元(素)消去法。列主元(素)消去法以处理简单、相对计算量小的特点,在各类主元消去法中得到最为广泛的应用。
高斯消元法(或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方程组求解。但其算法十分复杂,不常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵。不过,如果有过百万条等式时,这个算法会十分省时。
一些极大的方程组通常会用迭代法以及花式消元来解决。当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。
高斯消元法可以用在电脑中来解决数千条等式及未知数。亦有一些方法特地用来解决一些有特别排列的系数的方程组。
功能: 使用全选主元高斯消去法求解线性方程组' 参数n - Integer型变量,线性方程组的阶数
' dblA - Double型 n x n 二维数组,线性方程组的系数矩阵
' dblB - Double型长度为 n 的一维数组,线性方程组的常数向量,返回方程组的解向量
' 返回值:Boolean型,求解成功为True,无解或求解失败为False
'====函数代码如下====
Public Function LEGauss(n As Integer, dblA() As Double, dblB() As Double) As Boolean
' 局部变量
Dim i As Integer, j As Integer, k As Integer
Dim nIs As Integer
ReDim nJs(n) As Integer
Dim d As Double, t As Double
' 开始求解
For k = 1 To n - 1
d = 0#
' 归一
For i = k To n
For j = k To n
t = Abs(dblA(i, j))
If t >d Then
d = t
nJs(k) = j
nIs = i
End If
Next j
Next i
' 无解,返回
If d + 1# = 1# Then
LEGauss = False
Exit Function
End If
' 消元
If nJs(k) <>k Then
For i = 1 To n
t = dblA(i, k)
dblA(i, k) = dblA(i, nJs(k))
dblA(i, nJs(k)) = t
Next i
End If
If nIs <>k Then
For j = k To n
t = dblA(k, j)
dblA(k, j) = dblA(nIs, j)
dblA(nIs, j) = t
Next j
t = dblB(k)
dblB(k) = dblB(nIs)
dblB(nIs) = t
End If
d = dblA(k, k)
For j = k + 1 To n
dblA(k, j) = dblA(k, j) / d
Next j
dblB(k) = dblB(k) / d
For i = k + 1 To n
For j = k + 1 To n
dblA(i, j) = dblA(i, j) - dblA(i, k) * dblA(k, j)
Next j
dblB(i) = dblB(i) - dblA(i, k) * dblB(k)
Next i
Next k
d = dblA(n, n)
' 无解,返回
If Abs(d) + 1# = 1# Then
LEGauss = False
Exit Function
End If
' 回代
dblB(n) = dblB(n) / d
For i = n - 1 To 1 Step -1
t = 0#
For j = i + 1 To n
t = t + dblA(i, j) * dblB(j)
Next j
dblB(i) = dblB(i) - t
Next i
' 调整解的次序
nJs(n) = n
For k = n To 1 Step -1
If nJs(k) <>k Then
t = dblB(k)
dblB(k) = dblB(nJs(k))
dblB(nJs(k)) = t
End If
Next k
' 求解成功
LEGauss = True
End Function
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)