You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)

关键问题修复说明

  1. 列系数提取错误修复

    • 新增var_col_map映射表,明确变量与矩阵列的对应关系,避免系数错位;
    • 提取SymPy表达式系数后,通过Fraction(str(coeff)).limit_denominator()将整数/分数系数统一转换为精确分数格式,同时严格将B列位置设为None。
  2. 计算逻辑问题修复

    • 遍历单元格时先判断val1和val2是否均不为None,仅对有效单元格执行减法;
    • 用Fraction处理差值,彻底避免浮点数精度丢失,也可根据需求替换为sp.sympify(val1 - val2).simplify()实现符号化简化。

内容的提问来源于stack exchange,提问作者Elektvocal95

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 20:22:44