背景:作为绩效分析的一部分,我必须创建一个程序来描述正在测试四分之一英里时间的汽车的运动。这涉及时间,距离,速度,加速度,力,扭矩和转速。
在最后一个for循环中,我得到以下错误,顶部的代码行(在本例中为引擎扭矩):
"尝试访问RPM(2);索引越界,因为numel(RPM)= 1。"
clear all
close all
clc
time(1) = 0; %[seconds]
dist(1) = 0;
vel(1) = 0;
accel(1) = 0;
RPMmin = 1200;
RPM(1) = RPMmin;
r = 19; %[inches]
wt = 3760; %[pounds]
Ng = [3.253, 2.233, 1.611, 1.243, 1, 0.629]; %{Gear Ratio}
Nd = [3.73]; %differential ratio
dt = 0.1; %time increment
for k = 1:1:6
xntt(k) = Ng(k) * Nd;
xmf(k) = 1 + (0.04 * xntt(k)) + (0.0025 * xntt(k)^2);
gst = 0.25; %gear shift time
end
for i = 1:1:1000
Te(i) = 18.154 + (.1571 * RPM(i)) - (0.0000147 * (RPM(i))^2);
fx(i) = Te(i) * xntt(k)/(r/12);
dV(i + 1) = (32.2/(wt * xmf(k)))*fx(i);
accel(i + 1) = dV(i)/dt;
vel(i + 1) = vel(i) + (dV(i) * dt);
dist(i + 1) = dist(i) + vel(i + 1)*dt;
time(i + 1) = time(i) + dt;
RPM(i) = (vel(i + 1)*60*xntt(k))/((2*pi*r)/12);
end
答案 0 :(得分:0)
这在for循环(第二次迭代)中i=2
时发生。根据{{1}},您基本上有两种选择:
RPM
依赖于Te(i)
,因此RPM(i-1)
将取决于Te(2)
,依此类推。但是,由于RPM(1)
,i=1
,而i=1
和Matlab仅允许正数索引,因此您需要进行i-1=0
检查,因此会在if
时抛出错误在循环中。RPM
增长就像Te
一样,所以如果你在i
上进行迭代Te(i+1)
,那么也可以写在RPM(i+1)
上。这两种方法都会导致代码没有错误(即语法正确)但是你必须根据你的问题选择正确的方法以及这些向量如何“链接”在一起(即你的代码必须是在语义上也是正确的。)