MATLAB 和力学(主要是物理学)[第二部分]
MATLAB and mechanics (physics mostly) [part II]
简历表格
代表系统的基本方案:
我们假设两个轴的耦合是通过离合器完成的
方程式:
• J1*dw1/dt + Td(w12)+Ts(phi12) = T1;
• J2*dw2/dt - Td(w12) -Ts(phi12) = T2;
where w1 = dphi1/dt,
w2 = dphi2/dt,
phi12 = phi1 - phi2
w12 = w1 - w2
Td(w12) = c12 * w12
Ts(phi12) = ks * phi12
c12 and ks are some coefficients
• dphi12/dt = w12
• dw12/dt = T1/J1 - T2/J2 - Td(w12)/Jeq - Ts(phi12)/Jeq
ccr = 2*Jeq*wn
wn = sqrt(ks/Jeq)
Jeq = (J1*J2)/(J1+J2)
T1(t) = T0*1(t), T0 = 1 T2(t) = 0
J1+J2 = 10 wn = 100 rad/s c12 = 0 Ts(phi12) = ks*phi12
我的第二个任务是绘制非线性离合器如何影响转动惯量。
给定:
T1(t) = T0*1(t), T0 = 1, T2(t) = 0,
J1 = J2 = 5, c12 = 0, wn = 100,
Ts(phi12) = k1*phi12 + k2*(phi12)^3
k20 = 10e14, k2 = [10e-6 10e-5 10e-4 10e-3 10e-2 10e-1 10e0 10e1 10e2 10e3 10e4]
我需要绘制 Tsmax/T0 = f(log(k2/k20))
;
目前我的进度是:
MATLAB 代码
T2 = 0;
J1 = 5;
J2 = J1;
wn = 100;
Jz = J1.*J2/(J1+J2);
ckr = 2.*Jz*wn;
ks = (wn^2)*Jz;
c12 = 0;
k20 = 10e14;
k2 = [10e-6 10e-5 10e-4 10e-3 10e-2 10e-1 10e0 10e1 10e2 10e3 10e4];
Tsmax = zeros(size(k2));
k2a = 0;
plpl = zeros(size(k2));
k1 = 1;
sim ('model_2');
for ii=1:length(k2)
k2a = k2(ii);
sim ('model_2');
Tsmax(ii) = max(Ts);
plpl(ii) = log(k2a/k20);
end
figure()
plot(plpl,Tsmax)
grid on
产生
和 Simulink 模型:
好吧,我有点确定我的情节不是它应该的样子。
一些points/suggestions:
- 你似乎用
K2a
参数化了你的 Simulink 模型(除非我从屏幕截图中看不太清楚),但它没有在任何地方定义。您在代码中定义 k2a
,但 MATLAB 区分大小写,因此它与 K2a
. 不同
- 你的
Fcn1
块没有做任何事情,你可以去掉它。
除此之外,我真的看不出你所做的有什么不妥,我们也不知道你的情节应该是什么样子,所以我们真的帮不了你了,我害怕。
编辑:
我认为你的情节应该是这样的。我在 Octave 中尝试了它,只是使用 MATLAB 代码和带有 logspace
的 ode 求解器(没有 Simulink),这样我在 10^(-6)
和 10^4
之间有 50 个对数数据点 space,得到了非常相似的东西。
我认为您遇到了 k2
较大值的数值刚度问题,因此我建议使用 ode15s
和 1e-4
的最大步长。这可能需要更长的时间才能 运行,但当系统在数值上僵硬时,您可能会避免数值问题。
简历表格
代表系统的基本方案:
我们假设两个轴的耦合是通过离合器完成的
方程式:
• J1*dw1/dt + Td(w12)+Ts(phi12) = T1;
• J2*dw2/dt - Td(w12) -Ts(phi12) = T2;
where w1 = dphi1/dt,
w2 = dphi2/dt,
phi12 = phi1 - phi2
w12 = w1 - w2
Td(w12) = c12 * w12
Ts(phi12) = ks * phi12
c12 and ks are some coefficients
• dphi12/dt = w12
• dw12/dt = T1/J1 - T2/J2 - Td(w12)/Jeq - Ts(phi12)/Jeq
ccr = 2*Jeq*wn
wn = sqrt(ks/Jeq)
Jeq = (J1*J2)/(J1+J2)
T1(t) = T0*1(t), T0 = 1 T2(t) = 0
J1+J2 = 10 wn = 100 rad/s c12 = 0 Ts(phi12) = ks*phi12
我的第二个任务是绘制非线性离合器如何影响转动惯量。
给定:
T1(t) = T0*1(t), T0 = 1, T2(t) = 0,
J1 = J2 = 5, c12 = 0, wn = 100,
Ts(phi12) = k1*phi12 + k2*(phi12)^3
k20 = 10e14, k2 = [10e-6 10e-5 10e-4 10e-3 10e-2 10e-1 10e0 10e1 10e2 10e3 10e4]
我需要绘制 Tsmax/T0 = f(log(k2/k20))
;
目前我的进度是:
MATLAB 代码
T2 = 0;
J1 = 5;
J2 = J1;
wn = 100;
Jz = J1.*J2/(J1+J2);
ckr = 2.*Jz*wn;
ks = (wn^2)*Jz;
c12 = 0;
k20 = 10e14;
k2 = [10e-6 10e-5 10e-4 10e-3 10e-2 10e-1 10e0 10e1 10e2 10e3 10e4];
Tsmax = zeros(size(k2));
k2a = 0;
plpl = zeros(size(k2));
k1 = 1;
sim ('model_2');
for ii=1:length(k2)
k2a = k2(ii);
sim ('model_2');
Tsmax(ii) = max(Ts);
plpl(ii) = log(k2a/k20);
end
figure()
plot(plpl,Tsmax)
grid on
产生
和 Simulink 模型:
好吧,我有点确定我的情节不是它应该的样子。
一些points/suggestions:
- 你似乎用
K2a
参数化了你的 Simulink 模型(除非我从屏幕截图中看不太清楚),但它没有在任何地方定义。您在代码中定义k2a
,但 MATLAB 区分大小写,因此它与K2a
. 不同
- 你的
Fcn1
块没有做任何事情,你可以去掉它。
除此之外,我真的看不出你所做的有什么不妥,我们也不知道你的情节应该是什么样子,所以我们真的帮不了你了,我害怕。
编辑:
我认为你的情节应该是这样的。我在 Octave 中尝试了它,只是使用 MATLAB 代码和带有 logspace
的 ode 求解器(没有 Simulink),这样我在 10^(-6)
和 10^4
之间有 50 个对数数据点 space,得到了非常相似的东西。
我认为您遇到了 k2
较大值的数值刚度问题,因此我建议使用 ode15s
和 1e-4
的最大步长。这可能需要更长的时间才能 运行,但当系统在数值上僵硬时,您可能会避免数值问题。