執(zhí)行此程序之后,eq1對應于的拉格朗日方程,eq2對應于的拉格朗日方程。
由于SymPy只能對符號變量求導數(shù),即只能計算D(L, t),而不能計算D(f, v(t))。 ?因此在求偏導數(shù)之前,將偏導數(shù)變量置換為一個tmp變量,然后對tmp變量求導數(shù),例如下面的程序?qū)(v(t), t)求偏導數(shù),即計算:
L.subs(D(v(t), t), tmp).diff(tmp).subs(tmp, D(v(t), t))
而在計算時,需要將v(t)替換為v之后再進行微分計算。由于將v(t)替換為v的同時,會將D(v(t), t)中的也進行替換,這不是我們希望的結果,因此先將D(v(t), t)替換為tmp,微分計算完畢之后再替換回去:
L.subs(D(v(t), t), tmp).subs(v(t), v).diff(v).subs(v, v(t)).subs(tmp, D(v(t), t))
最后得到eq1和eq2的值為:
>>> eq1
ddth1*(m1*l1**2 + m2*l1**2) +
ddth2*(l1*l2*m2*cos(th1)*cos(th2) + l1*l2*m2*sin(th1)*sin(th2)) +
dth2**2*(l1*l2*m2*cos(th2)*sin(th1) - l1*l2*m2*cos(th1)*sin(th2)) +
g*l1*m1*sin(th1) + g*l1*m2*sin(th1)
>>> eq2
ddth1*(l1*l2*m2*cos(th1)*cos(th2) + l1*l2*m2*sin(th1)*sin(th2)) +
dth1**2*(l1*l2*m2*cos(th1)*sin(th2) - l1*l2*m2*cos(th2)*sin(th1)) +
g*l2*m2*sin(th2) + ddth2*m2*l2**2
結果看上去挺復雜,其實只要運用如下的三角公式,就和前面的結果一致了: