欧拉 - 拉格朗日方程的符号微分

时间:2017-02-24 10:35:40

标签: matlab symbolic-math differentiation

我正在尝试计算机器人结构的欧拉 - 拉格朗日方程。 我将使用q来指示关节变量的向量。

在我的代码中,我使用

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

声明q1q2取决于时间t。 在我计算拉格朗日L之后(在这种情况下,它是一个带有旋转关节的简单链接)

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

问题在于,当我尝试使用Lq方面区分为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

如果要运行完整代码,则必须从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期望至少是差异化的变量

编辑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;

1 个答案:

答案 0 :(得分:1)

如果要区分L相对于q,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)