2016-06-10 37 views
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-的Python Sympy替代符号矩阵(成)符号

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') 

但这两种工作。当我评估以下:

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

我得到:

0.5*omega_vec*q_vec 

代替它在我所规定的符号矩阵中的符号变量的值胶层(然后得到一个实际米=数值结果)。

+0

这问题,完成后,将对你有用https://github.com/sympy/sympy/issues/10163 – asmeurer

回答

0

您在subs调用中有一个错字。它应该是

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.subs([(q_vec, sym.Matrix([q1, q2, q3]), \ 
           (omega_vec, sym.Matrix([w1, w2, w3]).T))]) 

(注意括号中的位置)

使此修复程序后,它为我工作在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. ]])