Символьное дифференцирование с уравнением Эйлера-Лагранжа

Я пытаюсь вычислить уравнения Эйлера-Лагранжа для роботизированной структуры. Я буду использовать q указать вектор совместных переменных.

В моем коде я использую

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

заявить, что q1 а также q2 зависеть от времени t, После того, как я вычислю лагранжиан L (в данном случае это простая связь с ротоидным суставом)

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

Проблема в том, что когда я пытаюсь дифференцировать L уважение к q с помощью diff(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

Если вы хотите запустить полный код, вам нужно скачать все файлы.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;

РЕДАКТИРОВАТЬ

Благодаря ответу АВК я понял проблему.

Пример 1 (код АВК)

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 ожидает, по крайней мере, переменную дифференциации


РЕДАКТИРОВАТЬ 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;

2 ответа

Решение

Если вы хотите дифференцировать L по q, q должна быть переменной. Ты можешь использовать subs заменить его функцией и рассчитатьддтпотом:

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)

Я разработал библиотеку Эйлера-Лагранжа в MATLAB со списком иллюстративных примеров. вы можете скачать его по следующей ссылке:

https://www.mathworks.com/matlabcentral/fileexchange/86563-matlab-euler-lagrange-library

Другие вопросы по тегам