列主元高斯消去法是什么?

列主元高斯消去法是什么?,第1张

选列主元素消元法:在高斯消去的消元过程中第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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11090925.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存