I am trying to obtain significant terms from a symbolic expression obtained using sympy. The expressions represent symbolic dynamics of a a manipulator arm. The expression has the numerical coefficient always in the zeroth argument. However, the coefficients can be both positive and negative as seen in the expression for M. I want to eliminate the trigonometric terms associated with the coefficients which are insignificant such as - 1.38777878078145e-17 or 0.00044 which will have little impact on my overall computation and just consider the terms which are associated with coeeficient above certain threshold say threshold > 1e-4.
Below, I have attached a portion of the code:
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
My progress:
I tried obtaining the significant terms using .as_coeff_mul() by considering the aruments of M as tuple, but it does not work.
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)
Can anyone please help me with this?
For this particular case, one possible way is to use replace:
threshold = 1e-12
M.replace(
lambda t: t.is_number, # select all numbers
lambda t: 0 if abs(t) < threshold else t
)