Matlab 欧拉-拉格朗日方程的符号微分
我想计算机器人结构的欧拉-拉格朗日方程。 我将使用Matlab 欧拉-拉格朗日方程的符号微分,matlab,symbolic-math,differentiation,Matlab,Symbolic Math,Differentiation,我想计算机器人结构的欧拉-拉格朗日方程。 我将使用q来表示关节变量的向量 在我的代码中,我使用 syms t; q1 = sym('q1(t)'); q2 = sym('q2(t)'); q = [q1, q2]; 声明q1和q2取决于时间t。 在我计算拉格朗日L之后(在这种情况下,它是一个带有旋转接头的简单连杆) 问题是,当我尝试使用diff(L,q)来区分L与q时,我得到了这个错误 使用sym/diff(第69行)时出错 第二个参数必须是指定微分数的变量或非负整数 我如何区分L与q之间的关
q
来表示关节变量的向量
在我的代码中,我使用
syms t;
q1 = sym('q1(t)');
q2 = sym('q2(t)');
q = [q1, q2];
声明q1
和q2
取决于时间t
。
在我计算拉格朗日L
之后(在这种情况下,它是一个带有旋转接头的简单连杆)
问题是,当我尝试使用diff(L,q)
来区分L
与q
时,我得到了这个错误
使用sym/diff(第69行)时出错第二个参数必须是指定微分数的变量或非负整数 我如何区分
L
与q
之间的关系,以获得Euler-Lagrange方程的第一项?
我也试着简单地写
q
syms q1 q2
q = [q1 q2]
没有时间依赖性,但差异化将不起作用,也就是说,将明显地给我[0,0]
这就是我在工作空间中得到的(I1z是连杆相对于z轴的惯性,M1是连杆的质量,L1是连杆的长度)
如果要运行完整的代码,必须从下载所有的.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(AVK代码) 这将起作用,其结果将是
dLdqt=[(M1*q1t*L1^2)/4+I1z*q1t,0]
例2(错误)
这将不起作用,因为diff
需要一个单一的差异变量
例3(右)
这个将起作用,因为jacobian
期望至少一个微分变量
编辑2 似乎MATLAB的Symbolat工具箱无法处理与
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];
这些都是变量
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;
如果你想区分L和q,q必须是一个变量。您可以使用
subs
将其替换为函数并计算
后来:
I1z
etc未定义。请发布我们可以运行的代码。请注意,拉格朗日方程中有两种类型的导数:偏导数和全导数。每种类型都应该以自己的方式进行计算,这就是我用函数替换变量的原因。符号数学工具箱无法区分q(t)
,因此q
必须是一个变量;但是后来,当我们需要计算总导数时,它必须是t
的函数。是的,问题是它不能区分q(t)
。使用q1
和q1p
作为变量,然后使用subs
解决了问题。
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;
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)