2017-02-24 5 views
2

Ich versuche Euler-Lagrange-Gleichungen für eine Roboterstruktur zu berechnen. Ich verwende q, um den Vektor der Gelenkvariablen anzugeben.Symbolische Differenzierung mit Euler-Lagrange-Gleichung

In meinem Code verwende ich

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

dass tq1 und q2 ist abhängig von Zeit zu erklären. Nachdem ich berechnen die Lagrange L (in diesem Fall ist es eine einfache Verbindung mit einem rotoidalen Gelenke)

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

Das Problem ist, dass wenn ich versuche, L Bezug auf q mit diff(L, q) zu unterscheiden, ich diesen Fehler

Fehler bei Verwendung von sym/diff (Zeile 69)
Das zweite Argument muss eine Variable oder eine nicht negative Ganzzahl sein, die die Anzahl der Differenzierungen angibt.

Wie kann ich unterscheiden L Bezug auf q den ersten Term der Euler-Lagrange-Gleichung haben?


Ich habe auch versucht q einfach als

syms q1 q2 
q = [q1 q2] 

ohne die Zeitabhängigkeit zu schreiben, aber die Differenzierung wird nicht funktionieren, also wird mich offensichtlich [0, 0] geben


Das ist, was ich Im Arbeitsbereich angekommen (I1z ist die Trägheit der Verbindung bezüglich der z-Achse, M1 ist die Masse der Verbindung, L1 ist die Länge der Verbindung)

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 

Wenn Sie den vollständigen Code ausführen möchten, müssen Sie alle .m-Dateien von here herunterladen und verwenden Sie dann

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

sonst der folgende Code sollte gleich sein.

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

Dank AVK's answer erkannte ich das Problem.

Beispiel 1 (AVK Code)

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

Dies funktioniert und das Ergebnis wird

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

Beispiel 2 (falsch)

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) 

Dies wird nicht arbeiten, weil diff erwartet eine einzigen variable Differenzierungs

Beispiel 3 (rechts)

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) 

Diese wird Arbeit, denn jacobian erwartet mindestens eine variable Differenzierungs


EDIT 2

Scheint, dass die Symbolit Toolbox von MATLAB die Unterscheidung in Bezug auf q(t) nicht handhaben kann. Sie müssen also die Variableq verwenden.

So diese als Funktionen

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

und diese als Variablen

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

das Problem gelöst werden.

Der gesamte Code wird wie folgt

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' etc sind nicht definiert. Bitte geben Sie den Code an, den wir ausführen können –

+0

Bitte beachten Sie auch, dass es in den Lagrange-Gleichungen zwei Arten von Ableitungen gibt: partiell und total. Jeder Typ sollte auf seine Art berechnet werden, deshalb habe ich die Variablen durch die Funktionen ersetzt. Die symbolische Math-Toolbox kann nicht in Bezug auf "q (t)" unterscheiden, also muss "q" eine Variable sein; aber später, wenn wir die gesamte Ableitung berechnen müssen, muss es eine Funktion von "t" sein. – AVK

+0

Ja, das Problem war, dass es nicht in Bezug auf 'q (t)' unterscheiden kann. Die Verwendung von 'q1' und' q1p' als Variablen und die Verwendung von 'subs' lösten das Problem. – igng

Antwort

1

sieht Wenn Sie L in Bezug auf q zu differenzieren wollen, müssen q eine Variable sein. Sie können subs verwenden Sie es mit einer Funktion zu ersetzen und ddt später berechnen:

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)