Sympy中nsimplify处理含符号表达式失效问题求助
Sympy中如何将有理系数表达式转换为含√2的形式
问题原因
当你用nsimplify处理带符号变量(比如x、y)的表达式时,它不会自动拆分系数和变量,而是把整个项当作一个整体进行简化尝试。因为变量的存在,Sympy无法确定是否应该对系数单独进行无理数近似简化,所以会保留原有的有理系数形式。而单独处理常数时,没有变量干扰,nsimplify可以顺利匹配到你指定的sqrt(2)形式。
解决方法
你需要手动遍历表达式的每一项,提取系数部分单独用nsimplify处理,再重新组合变量和处理后的系数。具体实现如下:
- 先定义符号和原表达式:
from sympy import symbols, sqrt, nsimplify, expand x, y = symbols('x y') expr = 70*x*y/33 + 35*x**2/33 - 70*y**2/33 + 35/99
- 拆分表达式的每一项,逐个处理系数:
# 拆分表达式为独立项 terms = expr.as_ordered_terms() new_terms = [] for term in terms: # 分离系数和变量部分 coeff, var_part = term.as_coeff_Mul() # 对系数执行nsimplify转换 simplified_coeff = nsimplify(coeff, [sqrt(2)], tolerance=10**-2) # 重新组合成新项 new_terms.append(simplified_coeff * var_part) # 合并新项得到目标表达式 simplified_expr = expand(sum(new_terms))
- 打印结果:
print(simplified_expr)
输出结果与预期一致:
(3*sqrt(2)/4)*x**2 + (3*sqrt(2)/2)*x*y - (3*sqrt(2)/2)*y**2 + sqrt(2)/4
如果想更简洁,也可以用列表推导式一步完成:
simplified_expr = expand(sum(nsimplify(t.as_coeff_Mul()[0], [sqrt(2)], 1e-2)*t.as_coeff_Mul()[1] for t in expr.as_ordered_terms()))
内容的提问来源于stack exchange,提问作者BlueRevel
相关产品推荐
相关产品推荐

