如何用SymPy和Fraction为矩阵添加系数行并计算行差值?
正确实现基于SymPy和fractions库的矩阵操作方案
核心需求实现代码
import sympy as sp from fractions import Fraction # 示例初始矩阵(行代表不同项,列对应A、B、C列) initial_matrix = [ [Fraction(2, 1), Fraction(3, 1), Fraction(4, 1)], [Fraction(1, 2), Fraction(5, 2), Fraction(6, 2)] ] # 示例z_function表达式 z_expr = sp.sympify("3*x + 5*y + 7*z") # -------------------------- # 任务1:添加z_function系数行(B列设为None) # -------------------------- # 建立变量与矩阵列的映射关系(A→x,B→y,C→z) var_col_map = {'x': 0, 'y': 1, 'z': 2} z_coeff_row = [None] * len(initial_matrix[0]) for var, col_idx in var_col_map.items(): # 提取对应变量的系数 coeff = z_expr.coeff(sp.symbols(var)) # B列(索引1)保持None,其余列转换为Fraction格式 if col_idx != 1: z_coeff_row[col_idx] = Fraction(str(coeff)).limit_denominator() # 将系数行添加到原矩阵 initial_matrix.append(z_coeff_row) # -------------------------- # 任务2:计算第1行与第2行的差值生成新行(仅非None单元格运算) # -------------------------- diff_row = [] row1, row2 = initial_matrix[0], initial_matrix[1] for val1, val2 in zip(row1, row2): # 仅当两个单元格都不为None时计算差值 if val1 is not None and val2 is not None: # 用Fraction保证分数精度,也可替换为sp.sympify(val1 - val2).simplify() diff = Fraction(str(val1 - val2)).limit_denominator() diff_row.append(diff) else: diff_row.append(None) # 将差值行添加到原矩阵 initial_matrix.append(diff_row) # 输出验证 print("最终矩阵:") for row in initial_matrix: print(row)
关键问题修复说明
列系数提取错误修复
- 新增
var_col_map映射表,明确变量与矩阵列的对应关系,避免系数错位; - 提取SymPy表达式系数后,通过
Fraction(str(coeff)).limit_denominator()将整数/分数系数统一转换为精确分数格式,同时严格将B列位置设为None。
- 新增
计算逻辑问题修复
- 遍历单元格时先判断
val1和val2是否均不为None,仅对有效单元格执行减法; - 用
Fraction处理差值,彻底避免浮点数精度丢失,也可根据需求替换为sp.sympify(val1 - val2).simplify()实现符号化简化。
- 遍历单元格时先判断
内容的提问来源于stack exchange,提问作者Elektvocal95
相关产品推荐
相关产品推荐

