MATLAB循环索引问题

时间:2016-04-03 21:04:18

标签: arrays matlab loops for-loop indexing

背景:作为绩效分析的一部分,我必须创建一个程序来描述正在测试四分之一英里时间的汽车的运动。这涉及时间,距离,速度,加速度,力,扭矩和转速。

在最后一个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

1 个答案:

答案 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)上。

这两种方法都会导致代码没有错误(即语法正确)但是你必须根据你的问题选择正确的方法以及这些向量如何“链接”在一起(即你的代码必须是在语义上也是正确的。)