1
q_vec, omega_vec, q1, q2, q3, w1, w2, w3 = \
        sym.symbols('q_vec, omega_vec, q1, q2, q3, w1, w2, w3')

q_0_dot_str = '.5 * dot(q_vec, omega_vec)'
q_0_dot_symp = sym.sympify(q_0_dot_str)
q_0_dot_symp = q_0_dot_symp.subs([(q_vec, sym.Matrix([q1, q2, q3]), \
                               (omega_vec, sym.Matrix([w1, w2, w3]).T))])
q_0_dot_fcn = lambdify((q1, q2, q3, w1, w2, w3), q_0_dot_symp, 'numpy')

-OR-

q_0_dot_str = '.5 * dot(q_vec, omega_vec)'
q_0_dot_symp = sym.sympify(q_0_dot_str)
q_0_dot_symp = q_0_dot_symp.subs([(q_vec, sym.Matrix([q1, q2, q3]), \
                               (omega_vec, sym.Matrix([w1, w2, w3]).T))])
q_0_dot_symp = q_0_dot_symp.xreplace([{q_vec: sym.Matrix([q1, q2, q3])},\
                                   {omega_vec: sym.Matrix([w1, w2, w3]).T}])
q_0_dot_fcn = lambdify((q1, q2, q3, w1, w2, w3), q_0_dot_symp, 'numpy')

But neither of these work. When I evaluate the following:

q_0_dot_fcn(1,2,3,4,5,6)

I get:

0.5*omega_vec*q_vec

Instead of it subbing in the values I provided for the symbolic variables within the symbolic matrices (and then getting an actual m=numerical result).

asmeurer
  • 86,894
  • 26
  • 169
  • 240

1 Answers1

0

You have a typo in the subs call. It should be

q_0_dot_symp = q_0_dot_symp.subs([(q_vec, sym.Matrix([q1, q2, q3])), \
                               (omega_vec, sym.Matrix([w1, w2, w3]).T)])

instead of

q_0_dot_symp = q_0_dot_symp.subs([(q_vec, sym.Matrix([q1, q2, q3]), \
                               (omega_vec, sym.Matrix([w1, w2, w3]).T))])

(note the placement of the parentheses)

After making this fix, it works for me in SymPy 1.0

In [1]: import sympy as sym

In [2]: q_vec, omega_vec, q1, q2, q3, w1, w2, w3 = \
   ...:         sym.symbols('q_vec, omega_vec, q1, q2, q3, w1, w2, w3')

In [3]: q_0_dot_str = '.5 * dot(q_vec, omega_vec)'

In [4]: q_0_dot_symp = sym.sympify(q_0_dot_str)

In [5]: q_0_dot_symp = q_0_dot_symp.subs([(q_vec, sym.Matrix([q1, q2, q3])), \
                               (omega_vec, sym.Matrix([w1, w2, w3]).T)])

In [6]: q_0_dot_fcn = lambdify((q1, q2, q3, w1, w2, w3), q_0_dot_symp, 'numpy')

In [7]: q_0_dot_fcn(1,2,3,4,5,6)
Out[7]:
array([[ 2. ,  2.5,  3. ],
       [ 4. ,  5. ,  6. ],
       [ 6. ,  7.5,  9. ]])
asmeurer
  • 86,894
  • 26
  • 169
  • 240