我试图从使用 sympy 获得的符号表达式中获取重要术语。 这些表达式表示机械臂的符号动力学。该表达式的数值系数始终位于第零个参数中。但是,系数可以是正数,也可以是负数,如 M 的表达式所示。我想消除与微不足道的系数相关的三角项,例如 - 1.38777878078145e-17 或 0.00044,这对我的整体计算影响不大只需考虑与高于特定阈值的系数相关的项,例如阈值 > 1e-4。
下面,我附上了部分代码:
import sympy
from sympy import symbols, sin, cos, parse_expr
import spatialmath.base.symbolic as sym
# Define the joint angles:
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]
# Simplified Equation:
eqn_simp = M_00.func(*signif_terms)
有人可以帮我吗?
对于这种特殊情况,一种可能的方法是使用替换:
threshold = 1e-12
M.replace(
lambda t: t.is_number, # select all numbers
lambda t: 0 if abs(t) < threshold else t
)