Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 欧拉-拉格朗日方程的符号微分_Matlab_Symbolic Math_Differentiation - Fatal编程技术网

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)