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

Sympy中nsimplify处理含符号表达式失效问题求助

Sympy中如何将有理系数表达式转换为含√2的形式

问题原因

当你用nsimplify处理带符号变量(比如x、y)的表达式时,它不会自动拆分系数和变量,而是把整个项当作一个整体进行简化尝试。因为变量的存在,Sympy无法确定是否应该对系数单独进行无理数近似简化,所以会保留原有的有理系数形式。而单独处理常数时,没有变量干扰,nsimplify可以顺利匹配到你指定的sqrt(2)形式。

解决方法

你需要手动遍历表达式的每一项,提取系数部分单独用nsimplify处理,再重新组合变量和处理后的系数。具体实现如下:

  1. 先定义符号和原表达式:
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
  1. 拆分表达式的每一项,逐个处理系数:
# 拆分表达式为独立项
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))
  1. 打印结果:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:05:25