解线性方程组python实现消元法(高斯消元、列主元、高斯约旦)

1.高斯消元法

        高斯消元法是求解线性方程组的一种基本方法,它的主要思路是通过矩阵变换将原始的系数矩阵转化为一个上三角矩阵或者下三角矩阵,然后通过回代等方法求得线性方程组的解。

        具体来说,高斯消元法有以下步骤:

  1. 构造增广矩阵:将系数矩阵和常数向量合并成一个增广矩阵。

  2. 前向消元:通过一系列初等行变换将增广矩阵转化为上三角矩阵或下三角矩阵,过程中主要操作为加减消元,即利用第 ii 行的倍数加到第 jj 行(i<ji<j)上,消去第 jj 行的第 ii 个元素。

  3. 回代求解:从最后一行开始,依次求出未知数的值。

        需要注意的是,如果在前向消元的过程中出现了某一行的所有元素都为 00 的情况,则无法进行消元操作。此时需要进行行交换操作,使得该行不为 00。

        高斯消元法的优点是简单易懂,容易实现,而且能够处理一般的线性方程组。但是也存在一些问题,由于操作过程中会产生舍入误差和零元素的影响,因此对于病态矩阵或系数矩阵较大的线性方程组,可能出现计算结果不稳定的情况。

\left\{ \begin{array}{l} 9{x_1} - {x_2} - {x_3} = 7\\ - {x_1} + 8{x_2} = 7\\ - {x_1} + 9{x_3} = 8 \end{array} \right.

"""
@Time : 2023/10/19 0019 17:11
@Auth : yeqc
"""
import numpy as np


def gaussian_elimination(A, b):
    """
    高斯消元法解线性方程组 Ax = b

    参数:
    A: 系数矩阵,形状为 (n, n)
    b: 右侧常数向量,形状为 (n,)

    返回:
    x: 解向量,形状为 (n,)
    """
    n = len(b)

    # 将系数矩阵和右侧常数合并
    Ab = np.column_stack((A.astype(float), b.astype(float)))

    # 前向消元
    for i in range(n - 1):
        for j in range(i + 1, n):
            factor = Ab[j, i] / Ab[i, i]
            Ab[j, i:] -= factor * Ab[i, i:]

    # 回代求解
    x = np.zeros(n)
    for i in range(n - 1, -1, -1):
        x[i] = (Ab[i, n] - np.dot(Ab[i, i:n], x[i:n])) / Ab[i, i]

    return x


# 示例用法
A = np.array([[9,-1,-1],[-1,8,0],[-1,0,9]])

b = np.array([7,7,8])

x = gaussian_elimination(A, b)
print("解 x =", x)

2.列主元消元法

        列主元消元法(Column Principal Pivot Elimination Method),也称为列主消去法,是解线性方程组的一种方法。它是高斯-约旦消元法的改进版本,用于将增广矩阵变换为行最简形式。

        列主元消元法的基本思路是选择每一列的主元素(也称为列主元),并通过行交换操作将主元素放置在对应的列的顶部位置,然后通过一系列的行操作将其他元素消去。

具体步骤如下:

  1. 构造增广矩阵:将系数矩阵和常数向量合并成一个增广矩阵。

  2. 选取列主元:对于每一列,在当前剩余的行中选择该列中绝对值最大的元素作为主元素,并将其所在行与当前处理的行进行交换。

  3. 前向消元:通过一系列初等行变换将增广矩阵转化为行最简形式,即使主元素所在列的其他元素变为0。

  4. 回代求解:从最后一行开始,依次求出未知数的值。

        使用列主元消元法可以避免在高斯消元法中可能出现的数值不稳定性问题,而且可以得到更精确的解。然而,相比于高斯消元法,列主元消元法的计算量较大,因为需要在每一步中选择最大的主元素进行行交换,增加了计算的复杂性。但对于某些特殊的线性方程组,列主元消元法可能会更加有效。

"""
@Time : 2023/10/19 0019 17:11
@Auth : yeqc
"""
import numpy as np


def gaussian_elimination(A, b):
    n = len(A)

    # 将数组的数据类型转换为float64
    A = A.astype(np.float64)
    b = b.astype(np.float64)

    # 高斯消元
    for i in range(n - 1):
        max_idx = i

        # 选取列主元
        for j in range(i + 1, n):
            if abs(A[j][i]) > abs(A[max_idx][i]):
                max_idx = j

        # 交换行
        A[[i, max_idx]] = A[[max_idx, i]]
        b[[i, max_idx]] = b[[max_idx, i]]

        for j in range(i + 1, n):
            # 计算倍数
            multiplier = A[j][i] / A[i][i]

            # 更新矩阵
            A[j][i:] -= multiplier * A[i][i:]
            b[j] -= multiplier * b[i]

    # 回代求解
    x = np.zeros(n)
    for i in range(n - 1, -1, -1):
        x[i] = (b[i] - np.dot(A[i][i + 1:], x[i + 1:])) / A[i][i]

    return x


# 示例
A = np.array([[9, -1, -1], [-1, 8, 0], [-1, 0, 9]])

b = np.array([7, 7, 8])

x = gaussian_elimination(A, b)
print("解:", x)

3.高斯约旦消元法(Gauss-Jordan)

        高斯-约旦消元法(Gauss-Jordan Elimination Method)是解线性方程组的一种基本方法。它通过一系列初等行变换将增广矩阵转化为行最简形式,从而得到线性方程组的解。

具体步骤如下:

  1. 构造增广矩阵:将系数矩阵和常数向量合并成一个增广矩阵。

  2. 前向消元:通过一系列初等行变换将增广矩阵转化为上三角形式,即系数矩阵的左下角全部为0的形式。

  3. 反向消元:通过一系列初等行变换将增广矩阵进一步转化为对角线形式,即系数矩阵除了对角线以外的所有元素都为0的形式。过程中主要操作为再次利用加减消元,使每个未知量的系数为1,同时把其他行的系数消为0。

  4. 求解方程组:根据对角线形式的增广矩阵,可以很容易地求出线性方程组的解。

        需要注意的是,在转化为上三角形式的过程中,可能会存在主元素为0或较小的数值情况,导致算法出现数值不稳定的问题。因此,在高斯-约旦消元法中,需要加强对数值精度的控制,避免出现异常结果。

"""
@Time : 2023/10/19 0019 17:11
@Auth : yeqc
"""
import numpy as np


def gaussian_jordan_elimination(A, b):
    n = len(A)

    # 构造增广矩阵
    augmented_matrix = np.column_stack((A.astype(float), b.astype(float)))

    # 高斯约旦消元
    for i in range(n):
        pivot = augmented_matrix[i][i]

        # 将主元归一化为1
        augmented_matrix[i] /= pivot

        # 更新其他行
        for j in range(n):
            if j != i:
                multiplier = augmented_matrix[j][i]
                augmented_matrix[j] -= multiplier * augmented_matrix[i]

    # 提取解
    x = augmented_matrix[:, n]

    return x


# 示例
A = np.array([[9, -1, -1], [-1, 8, 0], [-1, 0, 9]])

b = np.array([7, 7, 8])

x = gaussian_jordan_elimination(A, b)
print("解:", x)

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
高斯列主元法是一种用于线性方程组的方法。它的基本原理是在高斯消去法的每一步中,选择一个绝对值最大的元素作为主元素。在进行行交换和元操作之前,找到第k步时,从第k列及以下的各元素中选出绝对值最大的元素,并将其通过行变换交换到主元素的位置上。然后使用这个主元素来去主对角线以下的其他元素,最终将线性方程组转化为上三角矩阵的形式。 通过使用列主元高斯消去法,可以有效地提高计算的精度。这种方法的基本思想是选择绝对值最大的元素作为主元素,从而减小计算误差的传播。这在实际应用中非常重要,特别是当矩阵A的某些元素非常接近或等于零时。 总结来说,高斯列主元线性方程组的原理是通过选择绝对值最大的元素作为主元素,并通过行交换和元操作将线性方程组转化为上三角矩阵的形式,从而得到精确的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [高斯列主元法求线性方程组.rar](https://download.csdn.net/download/qq_35660456/12029516)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [数值计算——列主元高斯消去法线性方程组(附代码)](https://blog.csdn.net/weixin_41788456/article/details/103222038)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安心不心安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值