2017-02-24 13 views
2

私は、ロボット構造のオイラー・ラグランジュ方程式を計算しようとしています。 を使用して、ジョイン変数のベクトルを示します。私のコードでオイラー・ラグランジュの式による記号の微分方程式

、私はq1q2は時間tに依存することを宣言する

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

を使用しています。 私が計算した後、ラグランジュL

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

問題は、私はdiff(L, q)を使用してqL敬意を区別しようとすると、私はこのエラーを取得することである(この場合には、それはrotoidal共同でシンプルなリンクです)

sym/diff(行69)を使用しているエラー
第2引数は、差異の数を指定する変数または非負整数でなければなりません。私はオイラー・ラグランジュ方程式の最初の項を持っているqL敬意を区別することができますどのように


私も時間依存せずに、単に

syms q1 q2 
q = [q1 q2] 

としてqを書き込もうとしましたが、分化は動作しません、つまりは明らかに私に[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) 

を使用する必要がありそうでない場合は、次のコードは、同じである必要があります。 AVK's answer

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; 

EDIT

おかげで、私はこの問題を実現しました。

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

このなりますありませんのための作業は期待分化の単一可変

実施例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を使用する必要があります。 変数

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

ようにこれらを使用して

として機能

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

及びこれらの問題を解決しました。

コード全体の意志があなたをqに対するLを区別したい場合は、qは変数でなければなりません。この

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

ラグランジュ方程式には、部分和と総和の2種類の導関数があることにも注意してください。それぞれの型はそれ自身の方法で計算する必要があります。それが変数を関数に置き換えた理由です。シンボリック数学ツールボックスは 'q(t)'に関して区別できないので、 'q'は変数でなければなりません。しかし、後で、総導関数を計算する必要があるとき、それは「t」の関数でなければならない。 – AVK

+0

はい、問題はそれが 'q(t)'に関して区別できないということでした。変数として 'q1'と' q1p'を使い、 'subs'を使うと問題が解決しました。 – igng

答えて

1

のように見えます。あなたが機能でそれを置き換えるために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) 
関連する問題