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