2016-06-10 38 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. ]])