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

如何用SymPy将不等式中的浮点数系数转换为整数?

使用SymPy将不等式/等式中的浮点数系数转换为整数

要把带浮点数的表达式转换为全整数系数形式,核心思路是找到所有浮点数对应的分数分母的最小公倍数,然后将表达式两边同乘这个公倍数(乘正数不会改变不等式方向),用SymPy可以精准实现这个逻辑,避免浮点数精度问题。

实现步骤与代码示例

from sympy import symbols, Rational, lcm, expand
from sympy.core.relational import Relational
from sympy.core.add import Add

# 定义符号变量
x, y = symbols('x y')

# 原始表达式(用Rational直接定义浮点数,避免精度误差)
expr1 = x > Rational('4.5')
expr2 = 2*x + y == Rational('4.5')

def convert_to_integer_coeffs(expr):
    # 提取表达式两边的项
    lhs = expr.lhs
    rhs = expr.rhs

    # 递归提取所有项的系数分母
    def collect_denominators(term):
        denoms = []
        if isinstance(term, Add):
            for sub_term in term.args:
                denoms.extend(collect_denominators(sub_term))
        else:
            # 分离系数和变量部分
            coeff, _ = term.as_coeff_Mul()
            # 将系数转为有理数,获取分母
            rat_coeff = Rational(coeff)
            denoms.append(rat_coeff.q)
        return denoms

    # 收集两边所有分母
    lhs_denoms = collect_denominators(lhs)
    rhs_denoms = collect_denominators(rhs)
    all_denoms = lhs_denoms + rhs_denoms

    # 计算所有分母的最小公倍数
    common_multiplier = lcm(*all_denoms)

    # 两边同乘公倍数,展开并构造新的关系表达式
    new_lhs = expand(common_multiplier * lhs)
    new_rhs = expand(common_multiplier * rhs)
    return Relational(new_lhs, new_rhs, expr.rel_op)

# 转换并输出结果
print(convert_to_integer_coeffs(expr1))
print(convert_to_integer_coeffs(expr2))

代码解释

  1. 符号与表达式初始化:用symbols创建变量,Rational('4.5')将浮点数精准转为分数9/2,避免直接用浮点数带来的精度偏差。
  2. 分母收集:递归遍历表达式的每一项,提取系数对应的有理数分母,比如4.5的分母是2,整数系数的分母是1。
  3. 最小公倍数计算:用lcm函数计算所有分母的最小公倍数,这里两个表达式的分母都是2,所以公倍数为2。
  4. 表达式转换:将表达式两边同乘公倍数,用expand展开后保留原关系运算符(>、==),得到全整数系数的表达式。

运行结果

2*x > 9
4*x + 2*y == 9

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:15:18