解锁线性代数之门:用Python秒解任何线性方程组
在数学和计算机科学的世界中,解决线性方程组是一个基本而重要的任务。无论是在工程计算、数据分析还是科学研究中,线性方程组都扮演着不可或缺的角色。高斯消元法,以数学家卡尔·弗里德里希·高斯的名字命名,是解决这一问题的经典方法之一。它不仅在理论上具有重要意义,而且在实际应用中也极为高效。本文将带你深入探索高斯消元法的奥秘,从它的数学原理出发,一步步走向其Python实现。
要秒解任何线性方程组,我们首先要把一般形式的线性方程组转变成增广矩阵的形式,这样才方便用计算机程序运算。
一.把一般形式的线性方程组转变成增广矩阵
1.对于简单的线性方程组,最常见的方法是直接输入。比如说,我们看到题目如图,我们就看着这个图,在Python程序里面输入:
matrix=[[2,1,1,1],[6,2,1,-1],[-2,2,1,7]]
这样不就一下子把题目里的方程组变成标准的增广矩阵了吗?!
但是,如果我们要输入很多线性方程组,不仅自己看着眼花缭乱,还总是要去修改Python本体。
直接输入常量的程序维护性太差了!
2.我自己使用的方法是正则表达式。
正则表达式快速入门:https://www.zhengzeshi.com
我一开始这样应用正则表达式:
import re
# 示例字符串
s = "3a - 2b + 7c = 4"
# 正则表达式匹配位于任意英文字母前的数字,但结果不包含这些字母
pattern = r"-?\d*(?=[a-zA-Z])"
# 使用 re.findall 查找所有匹配项
matches = re.findall(pattern, s)
# 输出提取到的数字
print("提取到的数字包括:", numbers)
"""
提取到的数字包括: ['3', '2', '7']
"""
似乎这个程序是能够提取出来方程中的系数的。
但是,-?\d*(?=[a-zA-Z])这个正则表达式只能提取显式系数,而不适用于x+y+z=1这类包含隐式系数的方程,对于存在零系数的方程组,更是会忽略掉零系数!
那我们怎么解决隐式系数+1、-1和0的问题呢?
问一下AI怎么说~
这个Python程序先收集了方程组里一共有几个未知数变量,然后在方程组里面寻找各个变量,进行逻辑判断。
如果没有找到变量,则系数为0。
如果变量前面是空字符串,则系数为1。
如果变量前面是负号字符串,则系数为-1。
import numpy as np
import re
# 示例方程组
equations = ["x+y+z=1", "x+y=0"]
# 步骤1: 收集所有变量名
all_variables = set()
pattern = r"([a-zA-Z]+)"
for eq in equations:
variables = re.findall(pattern, eq.split('=')[0])
all_variables.update(variables)
all_variables = sorted(list(all_variables)) # 排序以保持一致性
# 步骤2: 构建方程系数矩阵
coeff_matrix = []
for eq in equations:
coeff = [0] * len(all_variables) # 初始化系数为0
for var in all_variables:
# 查找变量系数,如果没有找到,则系数为0
match = re.search(rf"(-?\d*){
var}", eq)
if match:
coeff_val = match.group(1)
coeff[all_variables.index(var)] = int(coeff_val) if coeff_val not in ['', '-'] else -1 if coeff_val == '-' else 1
coeff_matrix.append(coeff)
# 步骤3: 构建常数项向量
const_vector = [int(eq.split('=')[1]) for eq in equations]
# 输出结果
print("变量顺序:", all_variables)
print("系数矩阵:", coeff_matrix)
print("常数项向量:", const_vector)
"""
变量顺序: ['x', 'y', 'z']
系数矩阵: [[1, 1, 1], [1, 1, 0]]
常数项向量: [1, 0]
"""
3.对了,我还要给大家推荐一个很好用的专门的数学表达式解析库!——Sympy!
安装 SymPy: 如果您还没有安装 SymPy,可以通过 pip 来安装它:
pip install sympy
然后你就能用Sympy解析数学表达式并提取系数了:
from sympy import symbols, Eq, solve
# 定义符号
x = symbols('x')
# 定义方程 ax^2 + bx + c = 0
equation = Eq(2*x**2 + 3*