教案:二元一次方程组求解器

教案基本信息

课程名称:Python编程第十三课 二元一次方程组求解器
授课对象:有一定Python基础的学生(已掌握基础Turtle绘图、循环)
课时安排:90分钟
教学形式:理论讲解 + 算法推导 + 编程实践

一、教学目标

知识与技能

  1. 理解二元一次方程组的数学原理
  2. 掌握克莱姆法则(Cramer’s Rule)求解方法
  3. 能够用Python实现方程组求解程序
  4. 学会处理数值计算中的异常情况

过程与方法

  1. 从数学公式到代码实现的转化过程
  2. 调试和验证程序正确性的方法

情感态度与价值观

  1. 培养数学思维与编程结合的能力
  2. 增强解决实际问题的信心

二、教学重点与难点

重点

  1. 克莱姆法则的理解与应用
  2. Python程序的逻辑结构

难点

  1. 行列式的计算概念
  2. 除零异常的处理

三、教学准备

  1. Python编程环境
  2. 投影设备展示代码
  3. 示例方程组练习题
  4. 计算器(用于验证结果)

四、教学过程

  • 课程导入(5分钟)

情景创设
“同学们,在数学课上我们经常遇到这样的问题:解二元一次方程组。今天我们要用Python编写一个智能求解器,让它帮我们快速解决这类问题!”

实际问题引导

python

# 实际问题示例

# 小明买苹果和梨:3x + 2y = 18, 2x + y = 11

# 求苹果(x)和梨(y)的单价各是多少?

  • 数学原理讲解(10分钟)

1. 二元一次方程组的一般形式

text

方程组:

a₁x + b₁y = c₁

a₂x + b₂y = c₂

其中:a₁, b₁, c₁, a₂, b₂, c₂ 为已知系数

2. 克莱姆法则求解公式

python

# 系数行列式

D = a₁ * b₂ – a₂ * b₁

# x的解

Dx = c₁ * b₂ – c₂ * b₁

x = Dx / D

# y的解 

Dy = a₁ * c₂ – a₂ * c₁

y = Dy / D

3. 解的三种情况

有唯一解:当 D ≠ 0 时

无解:当 D = 0 但 Dx ≠ 0 或 Dy ≠ 0 时

无穷多解:当 D = 0 且 Dx = 0 且 Dy = 0 时

  • 程序设计与实现(30分钟)

1. 基础版本:直接公式求解

python

def solve_linear_equation(a1, b1, c1, a2, b2, c2):

    “””

    解二元一次方程组

    a1*x + b1*y = c1

    a2*x + b2*y = c2

    “””

    # 计算行列式

    D = a1 * b2 – a2 * b1

    Dx = c1 * b2 – c2 * b1

    Dy = a1 * c2 – a2 * c1

    # 判断解的情况

    if D != 0:

        x = Dx / D

        y = Dy / D

        return f”方程组有唯一解:x = {x:.2f}, y = {y:.2f}”

    elif Dx != 0 or Dy != 0:

        return “方程组无解”

    else:

        return “方程组有无穷多解”

# 测试示例

print(solve_linear_equation(3, 2, 18, 2, 1, 11))

2. 完整版本:用户交互式程序

python

def binary_equation_solver():

    “””二元一次方程组求解器”””

    print(“=== 二元一次方程组求解器 ===”)

    print(“请输入方程组系数:”)

    print(“方程1: a1*x + b1*y = c1”)

    try:

        # 输入系数

        a1 = float(input(“请输入a1: “))

        b1 = float(input(“请输入b1: “))

        c1 = float(input(“请输入c1: “))

        print(“\n方程2: a2*x + b2*y = c2”)

        a2 = float(input(“请输入a2: “))

        b2 = float(input(“请输入b2: “))

        c2 = float(input(“请输入c2: “))

        # 显示输入的方程组

        print(f”\n输入的方程组为:”)

        print(f”{a1}x + {b1}y = {c1}”)

        print(f”{a2}x + {b2}y = {c2}”)

        # 计算行列式

        D = a1 * b2 – a2 * b1

        Dx = c1 * b2 – c2 * b1

        Dy = a1 * c2 – a2 * c1

        # 判断解的情况

        if abs(D) > 1e-10:  # 避免浮点数精度问题

            x = Dx / D

            y = Dy / D

            print(f”\n✅ 方程组有唯一解:”)

            print(f”x = {x:.4f}”)

            print(f”y = {y:.4f}”)

            # 验证解

            print(f”\n🔍 验证结果:”)

            print(f”方程1: {a1}*{x:.4f} + {b1}*{y:.4f} = {a1*x + b1*y:.4f} (应为{c1})”)

            print(f”方程2: {a2}*{x:.4f} + {b2}*{y:.4f} = {a2*x + b2*y:.4f} (应为{c2})”)

        elif abs(Dx) > 1e-10 or abs(Dy) > 1e-10:

            print(“\n❌ 方程组无解”)

        else:

            print(“\n⚠️ 方程组有无穷多解”)

    except ValueError:

        print(“❌ 输入错误,请确保输入的是数字!”)

    except ZeroDivisionError:

        print(“❌ 计算错误,除数不能为零!”)

# 运行求解器

if __name__ == “__main__”:

    binary_equation_solver()

3. 增强版本:支持批量求解

python

def advanced_equation_solver():

    “””增强版方程组求解器”””

    print(“=== 高级二元一次方程组求解器 ===\n”)

    while True:

        print(“1. 求解单个方程组”)

        print(“2. 批量求解方程组”)

        print(“3. 退出程序”)

        choice = input(“\n请选择功能(1-3): “)

        if choice == ‘1’:

            solve_single_equation()

        elif choice == ‘2’:

            solve_multiple_equations()

        elif choice == ‘3’:

            print(“感谢使用,再见!”)

            break

        else:

            print(“无效选择,请重新输入!”)

def solve_single_equation():

    “””求解单个方程组”””

    # …(同上一个函数的实现)

def solve_multiple_equations():

    “””批量求解方程组”””

    print(“\n— 批量求解模式 —“)

    equations = []

    # 输入多个方程组

    while True:

        print(f”\n请输入第{len(equations)+1}个方程组的系数:”)

        try:

            a1 = float(input(“a1: “))

            b1 = float(input(“b1: “))

            c1 = float(input(“c1: “))

            a2 = float(input(“a2: “))

            b2 = float(input(“b2: “))

            c2 = float(input(“c2: “))

            equations.append((a1, b1, c1, a2, b2, c2))

            cont = input(“是否继续输入?(y/n): “)

            if cont.lower() != ‘y’:

                break

        except ValueError:

            print(“输入错误,请重新输入!”)

    # 批量求解

    print(f”\n开始求解{len(equations)}个方程组…”)

    for i, eq in enumerate(equations, 1):

        a1, b1, c1, a2, b2, c2 = eq

        print(f”\n第{i}个方程组:”)

        print(f”{a1}x + {b1}y = {c1}”)

        print(f”{a2}x + {b2}y = {c2}”)

        D = a1 * b2 – a2 * b1

        if abs(D) > 1e-10:

            x = (c1 * b2 – c2 * b1) / D

            y = (a1 * c2 – a2 * c1) / D

            print(f”解:x = {x:.4f}, y = {y:.4f}”)

        else:

            print(“无唯一解”)

  • 实践练习(10分钟)

练习1:基础求解

python

# 测试用例1:有唯一解

# 2x + 3y = 7

# 4x – y = 3

# 解:x = 1, y = 1

# 测试用例2:无解

# 2x + 3y = 7

# 4x + 6y = 10

# 测试用例3:无穷多解 

# 2x + 3y = 6

# 4x + 6y = 12

练习2:实际问题应用

python

# 实际问题:购物问题

def shopping_problem():

    “””购物问题求解”””

    print(“购物问题:”)

    print(“小明买3个苹果和2个梨共花18元”)

    print(“小红买2个苹果和1个梨共花11元”)

    print(“求苹果和梨的单价各是多少?”)

    # 设苹果单价x,梨单价y

    # 3x + 2y = 18

    # 2x + y = 11

    result = solve_linear_equation(3, 2, 18, 2, 1, 11)

    print(result)

shopping_problem()

  • 错误处理与优化(3分钟)

1. 浮点数精度处理

python

# 使用绝对值判断,避免浮点数精度问题

if abs(D) > 1e-10:  # 而不是 D != 0

    x = Dx / D

    y = Dy / D

2. 输入验证增强

python

def get_float_input(prompt):

    “””安全的浮点数输入函数”””

    while True:

        try:

            value = float(input(prompt))

            return value

        except ValueError:

            print(“输入错误,请重新输入数字!”)

五、课程总结(2分钟)

知识回顾

二元一次方程组的数学原理

克莱姆法则求解方法

Python程序实现技巧

编程要点

输入验证和错误处理的重要性

浮点数精度的处理方法

代码的可读性和可维护性

课后作业

基础题

  1. 完善程序,增加对分数输入的支持
  2. 添加图形界面版本(可选)

提高题

  1. 扩展程序支持三元一次方程组求解
  2. 添加将解保存到文件的功能

教学反思

成功之处

将数学知识与编程实践紧密结合

程序功能完整,实用性强

待改进

对数学基础薄弱的学生需要更多铺垫

可以增加更多实际应用案例

附录:数学公式详解

克莱姆法则证明思路

text

对于方程组:

a₁x + b₁y = c₁

a₂x + b₂y = c₂

用消元法可得:

x = (c₁b₂ – c₂b₁) / (a₁b₂ – a₂b₁)

y = (a₁c₂ – a₂c₁) / (a₁b₂ – a₂b₁)

您可能还喜欢...