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

如何在SymPy中去除符号方程中的非显著项?

从SymPy符号动力学表达式中提取显著项

我需要从SymPy生成的机械臂符号动力学表达式中筛选出系数显著的项,仅保留系数绝对值大于指定阈值(如1e-4)的项,剔除诸如-1.38777878078145e-17或0.00044这类小系数的三角函数项。已知表达式中每个项的数值系数始终位于参数的第0位(示例表达式M如下)。

示例代码

import sympy
from sympy import symbols, sin, cos, parse_expr
import spatialmath.base.symbolic as sym

# 定义关节角
q = sym.symbol('q_:7')

# 符号动力学表达式示例
M = - 0.105191*sin(q_2)**2*sin(q_3)**2*sin(q_4)**2 - 0.00044166666666667*sin(q_2)**2*sin(q_3)**2*sin(q_4)*sin(q_6)*cos(q_4)*cos(q_5)*cos(q_6) - 1.38777878078145e-17*sin(q_2)**2*sin(q_3)**2*sin(q_4)*cos(q_5) - 0.000441666666666671*sin(q_2)**2*sin(q_3)**2*sin(q_5)**2*sin(q_6)**2 - 0.170872*sin(q_2)**2*sin(q_3)**2*sin(q_5)**2 + 0.02756*sin(q_2)**2*sin(q_3)**2*sin(q_5)*cos(q_5) + 0.000220833333333334*sin(q_2)**2*sin(q_3)**2*sin(q_6)**2 + 0.085436*sin(q_2)**2*sin(q_3)**2

我的尝试

我曾尝试通过遍历M的参数,使用.as_coeff_mul()提取系数来筛选显著项,但未能成功:

signif_terms = [t for t in M.args if abs(t.as_coeff_mul()[0]) > 1e-4]

# 简化后的表达式(此处存在错误)
eqqn_simp = M_00.func(*signif_terms)

解决方案

问题出在两个关键点:一是引用了未定义的M_00变量,二是需要确保正确遍历并筛选每个项。以下是修正后的实现:

# 设置显著性阈值
threshold = 1e-4

# 遍历所有项,筛选系数绝对值大于阈值的项
significant_terms = []
for term in M.args:
    # 分离项的系数与符号因子
    coeff, _ = term.as_coeff_mul()
    if abs(coeff) > threshold:
        significant_terms.append(term)

# 利用原表达式的加法运算符重新组合显著项
simplified_M = M.func(*significant_terms)

# 输出简化后的表达式
print(simplified_M)

代码说明

  1. 系数提取:.as_coeff_mul()会将每个项拆分为(系数, 符号因子元组),无论项是正还是负,都能正确提取数值系数。
  2. 筛选逻辑:通过判断系数绝对值是否大于阈值,保留显著项。
  3. 重组表达式:M.func会获取原表达式的运算类型(此处为加法Add),将筛选后的项重新组合成新的符号表达式。

执行后,得到的简化表达式为:

-0.105191*sin(q_2)**2*sin(q_3)**2*sin(q_4)**2 - 0.170872*sin(q_2)**2*sin(q_3)**2*sin(q_5)**2 + 0.02756*sin(q_2)**2*sin(q_3)**2*sin(q_5)*cos(q_5) + 0.085436*sin(q_2)**2*sin(q_3)**2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:07:38