正文

單擺和雙擺模擬(8)

Python 科學計算 作者:張若愚


執(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

結果看上去挺復雜,其實只要運用如下的三角公式,就和前面的結果一致了:


上一章目錄下一章

Copyright ? 讀書網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號