2017-02-24 62 views
2

我正在嘗試計算機器人結構的歐拉 - 拉格朗日方程。 我將使用q來表示聯合變量的向量。歐拉 - 拉格朗日方程的符號差異

在我的代碼,我用

syms t; 
q1 = sym('q1(t)'); 
q2 = sym('q2(t)'); 
q = [q1, q2]; 

來聲明q1q2依賴於時間t。 後,我計算拉格朗日L(在這種情況下,它是一個rotoidal聯合一個簡單的鏈接)

L = (I1z*diff(q1(t), t)^2)/2 + (L1^2*M1*diff(q1(t), t)^2)/8 

的問題是,當我嘗試使用diff(L, q)分化L對於q,我得到這個錯誤

使用sym/diff(第69行)的錯誤
第二個參數必須是一個變量或一個非負整數,用於指定差異數。

我怎麼能區分L對於q有歐拉 - 拉格朗日方程的第一項?


我也試着寫q簡稱爲

syms q1 q2 
q = [q1 q2] 

沒有時間關係,但分化將無法正常工作,即會明顯給我[0, 0]


這就是我(I1z是鏈接對z軸的慣性,M1是鏈接的質量,L1是鏈接的長度)

q = [q1(t), q2(t)] 
diff(q, t) = [diff(q1(t), t), diff(q2(t), t)] 
L = (I1z*diff(q1(t), t)^2)/2 + (L1^2*M1*diff(q1(t), t)^2)/8 

如果你想運行完整的代碼,你必須下載從here所有的.m文件,然後使用

[t, q, L, M, I] = initiate(); 
L = lagrangian(odof(q, L), q, M, I, t, 1) 

否則下面的代碼應該是一樣的。

syms t I1z L1 M1 
q1 = sym('q1(t)'); 
q2 = sym('q2(t)'); 
q = [q1, q2]; 
qp = diff(q, t); 
L = (I1z*qp(1)^2)/2 + (L1^2*M1*qp(1)^2)/8; 

編輯

感謝AVK's answer我意識到這個問題。

實施例1(AVK的代碼)

syms t q1 q2 q1t q2t I1z L1 M1  % variables 
L = (I1z*q1t^2)/2 + (L1^2*M1*q1t^2)/8 
dLdqt = [diff(L,q1t), diff(L,q2t)] 

這將工作,並將其結果將是

dLdqt = [(M1*q1t*L1^2)/4 + I1z*q1t, 0]

實施例2(錯誤)

syms t q1 q2 q1t q2t I1z L1 M1 
L = (I1z*q1t^2)/2 + (L1^2*M1*q1t^2)/8; 
qt = [q1t q2t]; 
dLdqt = diff(L, qt) 

這將工作,因爲diff預計分化的可變

實施例3(右側)

syms t q1 q2 q1t q2t I1z L1 M1 
L = (I1z*q1t^2)/2 + (L1^2*M1*q1t^2)/8; 
qt = [q1t q2t]; 
dLdqt = jacobian(L, qt) 

的工作,因爲jacobian預計至少分化的可變


EDIT 2

似乎MATLAB的Symbolit Toolbox無法處理關於q(t)的區別,所以您必須使用變量q

因此,使用這些作爲功能

q = [q1(t), q2(t), q3(t), q4(t), q5(t), q6(t)] 
qp = [diff(q1(t), t), diff(q2(t), t), diff(q3(t), t), diff(q4(t), t), diff(q5(t), t), diff(q6(t), t)] 

這些爲變量

qv = [q1, q2, q3, q4, q5, q6]; 
qvp = [q1p, q2p, q3p, q4p, q5p, q6p]; 

解決了這個問題。

整個代碼看起來是這樣的

syms q1 q2 q3 q4 q5 q6; 
syms q1p q2p q3p q4p q5p q6p; 
qv = [q1, q2, q3, q4, q5, q6]; 
qvp = [q1p, q2p, q3p, q4p, q5p, q6p]; 

Lagv = subs(Lag, [q, qp], [qv, qvp]); 
dLdq = jacobian(Lagv, qv); 
dLdqp = jacobian(Lagv, qvp); 

dLdq = subs(dLdq, [qv, qvp], [q, qp]); 
dLdqp = subs(dLdqp, [qv, qvp], [q, qp]); 

m_eq = diff(dLdqp, t) - dLdq; 
+0

'I1z'等是不確定的。請張貼我們可以運行的代碼 –

+0

請注意,拉格朗日方程中有兩種類型的導數:部分和全部。每種類型都應該以自己的方式進行計算,這就是爲什麼我用函數替換變量的原因。符號數學工具箱不能區分'q(t)',所以'q'必須是一個變量;但後來,當我們需要計算總導數時,它必須是「t」的函數。 – AVK

+0

是的,問題在於它不能區分'q(t)'。使用'q1'和'q1p'作爲變量,然後使用'subs'解決了這個問題。 – igng

回答

1

如果你想與所述Q區分L,Q必須是一個變量。您可以使用subs用一個函數來替換它,並計算 ddt 後來:

syms t q1 q2 q1t q2t I1z L1 M1  % variables 
L = (I1z*q1t^2)/2 + (L1^2*M1*q1t^2)/8 
dLdqt= [diff(L,q1t), diff(L,q2t)] 
dLdq = [diff(L,q1), diff(L,q2)] 
syms q1_f(t) q2_f(t) % functions 
q1t_f(t)= diff(q1_f,t) 
q2t_f(t)= diff(q2_f,t) 
    % replace the variables with the functions 
dLdq_f= subs(dLdq,{q1 q2 q1t q2t},{q1_f q2_f q1t_f q2t_f}) 
dLdqt_f= subs(dLdqt,{q1 q2 q1t q2t},{q1_f q2_f q1t_f q2t_f}) 
    % now we can solve the equation 
dsolve(diff(dLdqt_f,t)-dLdq_f==0)