用 Python实战案例: 解二元一次方程组

需求:求下列方程组,结果保留两位小数

解决的源代码:

import numpy as np

def format_number(num):
    """如果num为整数,则返回整数格式,否则返回保留两位小数的字符串"""
    if num % 1 == 0:
        return f"{int(num)}"
    else:
        return f"{num:.2f}"

def solve_and_print(example_no, equations, A, b):
    """解线性方程组,并打印结果"""
    print(f"\n例子 {example_no}:")
    print("方程组:")
    for eq in equations:
        print(eq)
    try:
        solution = np.linalg.solve(A, b)
        x, y = solution[0], solution[1]
        print(f"解: x = {format_number(x)}, y = {format_number(y)}")
    except np.linalg.LinAlgError:
        print("无解或有无穷多解")

# 存储所有方程组的信息
systems = [
    {
        "example_no": 1,
        "equations": ["{ 2x + 3y = 8", "  4x - y = 6"],
        "A": np.array([[2, 3], [4, -1]]),
        "b": np.array([8, 6])
    },
    {
        "example_no": 2,
        "equations": ["{ x + 2y = 5", "  3x + 6y = 15"],
        "A": np.array([[1, 2], [3, 6]]),
        "b": np.array([5, 15])
    },
    {
        "example_no": 3,
        "equations": ["{ 3x - 2y = 7", "  2x + y = 4"],
        "A": np.array([[3, -2], [2, 1]]),
        "b": np.array([7, 4])
    },
    {
        "example_no": 4,
        "equations": ["{ 4x + 5y = 14", "  2x - 3y = -2"],
        "A": np.array([[4, 5], [2, -3]]),
        "b": np.array([14, -2])
    },
    {
        "example_no": 5,
        "equations": ["{ x - y = 1", "  2x + 3y = 12"],
        "A": np.array([[1, -1], [2, 3]]),
        "b": np.array([1, 12])
    }
]

# 遍历各个方程组
for system in systems:
    solve_and_print(system["example_no"], system["equations"], system["A"], system["b"])

代码解析

1. 数字格式化函数

def format_number(num):
    """如果num为整数,则返回整数格式,否则保留两位小数"""
    if num % 1 == 0:
        return f"{int(num)}"
    else:
        return f"{num:.2f}"
  • 功能:自动判断数值是否为整数,返回不同格式的字符串。

  • 示例format_number(3.0) → "3"format_number(2.5) → "2.50"

2. 解方程组与输出函数

import numpy as np

def solve_and_print(example_no, equations, A, b):
    """解线性方程组,并打印结果"""
    print(f"\n例子 {example_no}:")
    print("方程组:")
    for eq in equations:
        print(eq)
    try:
        solution = np.linalg.solve(A, b)
        x, y = solution[0], solution[1]
        print(f"解: x = {format_number(x)}, y = {format_number(y)}")
    except np.linalg.LinAlgError:
        print("无解或有无穷多解")
  • 工作流程

    1. 打印方程组信息

    2. 使用np.linalg.solve求解

    3. 格式化输出解或捕获异常(矩阵不可逆时)

实例演示

方程组定义

systems = [
    {
        "example_no": 1,
        "equations": ["2x + 3y = 8", "4x - y = 6"],
        "A": np.array([[2, 3], [4, -1]]),
        "b": np.array([8, 6])
    },
    # 其他例子类似结构...
]

运行结果分析

例子1:唯一解
方程组:
2x + 3y = 8
4x - y = 6
解: x = 2, y = 2
  • 数学验证

    • 行列式 |A| = 2*(-1) - 3*4 = -14 ≠ 0

    • 解为 x=2y=2

例子2:无穷多解
方程组:
x + 2y = 5
3x + 6y = 15
无解或有无穷多解
  • 数学分析

    • 第二个方程是第一个的3倍,方程组线性相关

    • 解空间为 x = 5 - 2y,y为任意实数

例子3:唯一解(浮点数)
方程组:
3x - 2y = 7
2x + y = 4
解: x = 1.80, y = 0.40
  • 计算细节

    • 行列式 |A| = 3*1 - (-2)*2 = 7

    • 解通过克莱姆法则计算得 x=1.8y=0.4

关键知识点

  1. 矩阵可逆性

    • np.linalg.solve要求系数矩阵A必须是方阵且行列式非零

    • 不可逆时抛出LinAlgError

  2. 数值稳定性

    • 浮点运算可能产生舍入误差

    • 大矩阵需注意条件数(np.linalg.cond(A)

  3. 扩展应用

    • 可扩展至n元方程组

    • 结合scipy.linalg处理更复杂问题

最终输出结果:

原文文章:用 Python实战案例: 解二元一次方程组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值