简体   繁体   English

MATLAB - position 2 中的索引超出数组边界(不得超过 1)

[英]MATLAB - Index in position 2 exceeds array bounds (must not exceed 1)

Please do not mind long lines because most of them are constants and loops.请不要介意长线,因为它们中的大多数是常量和循环。 This code tries to solve 6 ODEs with 6 state variables [horizontal position (x1 and x2), altitude (x3), the true airspeed (x4), the heading angle (x5) and the mass of the aircraft (x6)] and 3 control inputs [engine thrust (u1), the bank angle (u2) and the flight path angle (u3)] by using Euler's Method.此代码尝试使用 6 个 state 变量 [水平 position (x1 和 x2)、高度 (x3)、真实空速 (x4)、航向角 (x5) 和飞机质量 (x6)] 和 3 求解 6 个 ODE控制输入 [发动机推力 (u1)、坡度角 (u2) 和飞行路径角 (u3)] 通过使用欧拉方法。 Different flight maneuvers are performed for the specified time intervals.在指定的时间间隔内执行不同的飞行机动。 Velocities.m, Cruise_Vel.m, Des_Vel.m, Thr_cl.m, Thr_cr.m, Thr_des.m, fuel_cl.m, fuel_cr.m, fuel_des.m,den.m,den_cr.m,den_des.m,drag.m,drag_cr.m,drag_des.m,lift.m,lift_cr.m,lift_des.m are functions in seperate tabs. Velocities.m、Cruise_Vel.m、Des_Vel.m、Thr_cl.m、Thr_cr.m、Thr_des.m、fuel_cl.m、fuel_cr.m、fuel_des.m、den.m、den_cr.m、den_des.m、阻力。 m,drag_cr.m,drag_des.m,lift.m,lift_cr.m,lift_des.m 是单独选项卡中的函数。 Main code is:主要代码是:

% Climb from h1=1100 [m] to h2=1600 [m] with α=5 flight path angle.
% Perform cruise flight for t=60 minutes.
% Turn with β=30 bank angle until heading is changed by η=270◦.
% Descent from h2=1600 [m] to h1=1100 [m] with ζ=4◦ flight path angle.
% Complete a 360◦ turn (loiter) at level flight.
% Descent to h3=800 [m] with κ=4.5◦ flight path angle.
% Aircraft Properties
W = .44225E+06;                             % .44225E+03 tons = .44225E+06 kg 
S = .51097E+03;                             % Surface Area [m^2]
g0 = 9.80665;                               % Gravitational acceleration [m/s2]
% solving 1st order ODE using numerical methods 
t0=0;           
tend=3960;
h=0.05; 
N=(tend-t0)/h;
t=t0:h:tend; 
% Preallocations
x = zeros(6,length(t));
x1 = zeros(1,length(t));
x2 = zeros(1,length(t));
x3 = zeros(1,length(t));
x4 = zeros(1,length(t));
x5 = zeros(1,length(t));
x6 = zeros(1,length(t));
u1 = zeros(1,length(t));
u2 = zeros(1,length(t));
u3 = zeros(1,length(t));
C_D= zeros(1,length(t));
p = zeros(1,length(t));
Cl = zeros(1,length(t));
f = zeros(1,length(t));
dx1dt = zeros(1,length(t));
dx2dt = zeros(1,length(t));
dx3dt = zeros(1,length(t));
dx4dt = zeros(1,length(t));
dx5dt = zeros(1,length(t));
dx6dt = zeros(1,length(t));
% Initial conditions
x(:,1)=[0;0;3608.92;1.0e+02 * 1.161544478045788;0;W];
for i=2:length(t)
      
if and (t(1,i-1) >= 0,t(1,i-1)<60)         % Climb from h1=1100 [m] to h2=1600 [m] with α=5 flight path angle.
   x3 = linspace(3608.92,5249.3,79201);
   x4 = Velocities(x3);                   % Changing speed [m/s]
   x5 = 0;                                           % Changing head angle [deg]
   f = fuel_cl(x3);                       % Changing fuel flow [kg/min] 
   
   u1 = Thr_cl(x3);                       % Changing thrust [N]
   u2 = 0;                                           % Changing bank angle [deg]
   u3 = 5;                                           % Changing flight path angle [deg]
   V_ver = x4*sin(u3);                               % Changing vertical speed [m/s]
   C_D = drag(x3,x4);                     % Changing drag coefficient
   Cl = lift(x3,x4);                      % Changing lift coefficient
   p = den(x3);                           % Changing density [kg/m3]                              
elseif and (t(1,i-1) >= 60,t(1,i-1)<3660) % Perform cruise flight for t=60 minutes.
   
   x3 = 5249.3;
   x4 = Cruise_Vel(x3);                          % Changing speed [m/s]
   x5 = 0;                                           % Changing head angle [deg]
   f = fuel_cr(x3);                              % Changing fuel flow [kg/min] 
   
   u1 = Thr_cr(x3);                              % Changing thrust [N]
   u2 = 0;                                           % Changing bank angle [deg]
   u3 = 0;                                           % Changing flight path angle [deg]
   V_ver = x4*sin(u3);                               % Changing vertical speed [m/s]
   C_D = drag_cr(x3,x4);                         % Changing drag coefficient
   Cl = lift_cr(x3,x4);                          % Changing lift coefficient
   p = den_cr(x3);                               % Changing density [kg/m3]
   
   elseif and (t(1,i-1) >= 3660,t(1,i-1)<3720) % Turn with β=30 bank angle until heading is changed by η=270◦.
   x3 = 5249.3;
   x4 = Cruise_Vel(x3);                          % Changing speed [m/s]
   x5 = 0:30:270;                                    % Changing head angle [deg]
   f = fuel_cr(x3);                              % Changing fuel flow [kg/min] 
   
   u1 = Thr_cr(x3);                              % Changing thrust [N]
   u2 = 30;                                          % Changing bank angle [deg]
   u3 = 0;                                           % Changing flight path angle [deg]
   V_ver = x4*sin(u3);                               % Changing vertical speed [m/s]
   C_D = drag_cr(x3,x4);                         % Changing drag coefficient
   Cl = lift_cr(x3,x4);                          % Changing lift coefficient
   p = den_cr(x3);                               % Changing density [kg/m3]
   
elseif and (t(1,i-1) >= 3720,t(1,i-1)<3780) % Descent from h2=1600 [m] to h1=1100 [m] with ζ=4◦ flight path angle.
   
   x3 = linspace(5249.3,3608.92,79201);
   x4 = Des_Vel(x3);                      % Changing speed [m/s]
   x5 = 270;                                         % Changing head angle [deg]
   f = fuel_des(x3);                      % Changing fuel flow [kg/min] 
   
   u1 = Thr_des(x3);                      % Changing thrust [N]
   u2 = 0;                                           % Changing bank angle [deg]
   u3 = 4;                                           % Changing flight path angle [deg]
   V_ver = x4*sin(u3);                               % Changing vertical speed [m/s]
   C_D = drag_des(x3,x4);                 % Changing drag coefficient
   Cl = lift_des(x3,x4);                  % Changing lift coefficient
   p = den_des(x3);                       % Changing density [kg/m3]
elseif and (t(1,i-1) >= 3780,t(1,i-1)<3900)      % Complete a 360◦ turn (loiter) at level flight.
   
   x3 = 3608.9;
   x4 = Cruise_Vel(x3);                          % Changing speed [m/s]
   lon = [270 300 360 60 120 180 240 270];
   x5 = wrapTo360(lon);                              % Changing head angle [deg]
   f = fuel_cr(x3);                              % Changing fuel flow [kg/min] 
   
   u1 = Thr_cr(x3);                              % Changing thrust [N] 
   u2 = 0;                                           % Changing bank angle [deg]
   u3 = 0;                                           % Changing flight path angle [deg]
   V_ver = x4*sin(u3);                               % Changing vertical speed [m/s]
   C_D = drag_cr(x3,x4);                         % Changing drag coefficient
   Cl = lift_cr(x3,x4);                          % Changing lift coefficient
   p = den_cr(x3);                               % Changing density [kg/m3]
elseif and (t(1,i-1) >= 3900,t(1,i-1)<3960)  % Descent to h3=800 [m] with κ=4.5◦ flight path angle.
  x3 = linspace(3608.92,2624.67,79201);
   
   x4 = Des_Vel(x3);                     % Changing speed [m/s] 
   x5 = 270;                                         % Changing head angle [deg]
   f = fuel_des(x3);                     % Changing fuel flow [kg/min] 
   
   u1 = Thr_des(x3);                     % Changing thrust [N] 
   u2 = 0;                                           % Changing bank angle [deg]
   u3 = 4.5;                                         % Changing flight path angle [deg]
   V_ver = x4*sin(u3);                               % Changing vertical speed [m/s]
   C_D = drag_des(x3,x4);                % Changing drag coefficient
   Cl = lift_des(x3,x4);                 % Changing lift coefficient
   p = den_des(x3);                      % Changing density [kg/m3]
else
    fprintf("A problem occured.");
end
dx1dt = x4 .* cos(x5) .* cos(u3);       
dx2dt = x4 .* sin(x5) .* cos(u3);       
dx3dt = x4 .* sin(u3);               
dx4dt = -C_D.*S.*p.*(x4.^2)./(2.*x6)-g0.*sin(u3)+u1./x6; 
dx5dt = -Cl.*S.*p.*x4./(2.*x6).*sin(u2);
dx6dt = -f;
x(1,i)= x(1,i-1) + h * dx1dt(1,i-1);     %%%%%%%%% line 138 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                 
x(2,i)= x(2,i-1) + h * dx2dt(1,i-1);
x(3,i)= x(3,i-1) + h * dx3dt(1,i-1);
x(4,i)= x(4,i-1) + h * dx4dt(1,i-1);
x(5,i)= x(5,i-1) + h * dx5dt(1,i-1);
x(6,i)= x(6,i-1) + h * dx6dt(1,i-1);
end
tot=cell2mat(f);                % Total fuel consumption during mission [kg/min]
Tot_fuel=sum(tot);
figure(1)
plot3(x1(:),x2(:),x3(:));       % 3D position graph
figure(2)
plot(t,x4(:));                  % Vtas − Time graph
figure(3)
plot(t,V_ver(:));               % V_vertical − Time graph
figure(4)
plot(t,x5(:));                  % Heading − Time graph
figure(5)
plot(t,x6(:));                  % Mass − Time graph
figure(6)
plot(t,u1(:));                  % Thrust − Time graph
figure(7)
plot(t,u2(:));                  % Bank Angle − Time graph
figure(8)
plot(t,u3(:));                  % Flight Path Angle − Time graph
fprintf('Total fuel consumption during mission is %.2f [kg]',Tot_fuel*tend/60);

The reason why I used 79201 sized array is length(t) = 79201. And when I run:我使用 79201 大小的数组的原因是长度(t)= 79201。当我运行时:

Index in position 2 exceeds array bounds (must not exceed 1).
Error in forum (line 138)
x(1,i)= x(1,i-1) + h * dx1dt(1,i-1);

What should I do?我应该怎么办? Thanks.谢谢。
One of the functions in seperate tabs is below, rest is similar:单独选项卡中的功能之一如下,rest 类似:

function [Vtas_cl] = Velocities(x3)
%%%%%%%%%%%%%%%%%%%% Constants %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Vcl_1 = 335;             % Standard calibrated airspeed [kt]
Vcl_2 = 172.3;           % Standard calibrated airspeed [kt] -> [m/s] (To find the  Mach transition altitude)
Vcl_2_in_knots = 335;    % Standard calibrated airspeed [kt] (To find the result in knots, if altitude is between 10,000 ft and Mach transition altitude)
M_cl  = 0.86;            % Standard calibrated airspeed [kt]
K = 1.4;                 % Adiabatic index of air
R = 287.05287;           % Real gas constant for air [m2/(K·s2)]
Bt = - 0.0065;           % ISA temperature gradient with altitude below the tropopause [K/m]
T0 = 288.15;             % Standard atmospheric temperature at MSL [K]
g0 = 9.80665;            % Gravitational acceleration [m/s2]
a0= 340.294;             % Speed of Sound [m/s]
Vd_CL1 = 5;              % Climb speed increment below 1500 ft (jet)
Vd_CL2 = 10;             % Climb speed increment below 3000 ft (jet)
Vd_CL3 = 30;             % Climb speed increment below 4000 ft (jet)
Vd_CL4 = 60;             % Climb speed increment below 5000 ft (jet)
Vd_CL5 = 80;             % Climb speed increment below 6000 ft (jet)
CV_min = 1.3;            % Minimum speed coefficient 
Vstall_TO = .14200E+03;  % Stall speed at take-off [KCAS]
CAS_climb  = Vcl_2;   
Mach_climb = M_cl;
delta_trans = (((1+((K-1)/2)*(CAS_climb/a0)^2)^(K/(K-1)))-1)/(((1+(K-1)/2*Mach_climb^2)^(K/(K-1)))-1);    % Pressure ratio at the transition altitude
teta_trans = delta_trans ^ (-Bt*R/g0);      % Temperature ratio at the transition altitude
H_p_trans_climb = (1000/0.348/6.5)*(T0*(1-teta_trans));   %  Transition altitude for climb [ft]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% End of constants
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
H_climb = x3; %%%%%% Input %%%%%%%%%%%%%%%%%%%
Vnom_climb_jet = zeros(1, length(H_climb));
for k1 = 1:length(H_climb)
    
    if (0<=H_climb(k1)&&H_climb(k1)<1500)
Vnom_climb_jet(k1) = CV_min * Vstall_TO + Vd_CL1;
elseif (1500<=H_climb(k1)&&H_climb(k1)<3000)
        Vnom_climb_jet(k1) = CV_min * Vstall_TO + Vd_CL2;
        
elseif (3000<=H_climb(k1)&&H_climb(k1)<4000)
        Vnom_climb_jet (k1)= CV_min * Vstall_TO + Vd_CL3; 
        
elseif (4000<=H_climb(k1)&&H_climb(k1)<5000)
        Vnom_climb_jet (k1)= CV_min * Vstall_TO + Vd_CL4;
        
elseif (5000<=H_climb(k1)&&H_climb(k1)<6000)
        Vnom_climb_jet(k1) = CV_min * Vstall_TO + Vd_CL5;
        
elseif (6000<=H_climb(k1)&&H_climb(k1)<10000)
        Vnom_climb_jet (k1)= min(Vcl_1,250);
        
elseif (10000<=H_climb(k1)&&H_climb(k1)<=H_p_trans_climb)
        Vnom_climb_jet(k1) = Vcl_2_in_knots;
        
elseif (H_p_trans_climb<H_climb(k1))
        Vnom_climb_jet(k1) = M_cl;
    end
Vcas_cl(k1) = Vnom_climb_jet(k1)* 0.514;   % [kn] -> [m/s]
H_climb (k1)= H_climb(k1) * 0.3048;         % [feet] -> [m]
K = 1.4;                                    % Adiabatic index of air
R = 287.05287;                              % Real gas constant for air [m2/(K·s2)]
Bt = - 0.0065;                              % ISA temperature gradient with altitude below the tropopause [K/m]
deltaT = 0;                                 % Value of the real temperature T in ISA conditions [K]
T0 = 288.15;                                % Standard atmospheric temperature at MSL [K]
P0 = 101325;                                % Standard atmospheric pressure at MSL [Pa]
g0 = 9.80665;                               % Gravitational acceleration [m/s2]
p0 = 1.225;                                 % Standard atmospheric density at MSL [kg/m3]
visc = (K-1)./K;
T(k1) = T0 + deltaT + Bt * H_climb(k1);         % Temperature [K]
P (k1)= P0*((T(k1)-deltaT)/T0).^((-g0)/(Bt*R));     % Pressure [Pa]
p (k1)= P(k1) ./ (R*T(k1));                             % Density [kg/m^3]
Vtas_cl(k1) = (2*P(k1)/visc/p(k1)*((1 + P0/P(k1)*((1 + visc*p0*Vcas_cl(k1)*Vcas_cl(k1)/2/P0).^(1/visc)-1)).^(visc)-1)).^(1/2); % True Air Speed [m/s]
end
% Output
end

Index in position 2 exceeds array bounds (must not exceed 1). position 2 中的索引超出数组边界(不得超过 1)。 This is an error that occurs when you are trying to access and element that does not exist.这是当您尝试访问不存在的元素时发生的错误。 For instance, if I initialize a variable of x to be sized (3,1) , then try to extract a value from index (4,4) , it will throw this error.例如,如果我将x的变量初始化为(3,1)的大小,然后尝试从索引(4,4)中提取一个值,它将引发此错误。

x = zeros(3,1)
y = x(4,4)+1; % ERROR

There is an issue with your indexing of the variable dx1dt at line 138. It is trying to access element (1,2) which does not exist when i=3 .您在第 138 行对变量dx1dt的索引存在问题。它试图访问i=3时不存在的元素(1,2)

At the beginning of your code, you have initialized the size of dx1dt to a size of (1, 79201) :在代码的开头,您已将dx1dt的大小初始化为(1, 79201)的大小:

dx1dt = zeros(1,length(t));

However, when you compute each value, you overwrite the size of this array to (1,1) :但是,当您计算每个值时,您会将此数组的大小覆盖为(1,1)

dx1dt = x4 .* cos(x5) .* cos(u3);

So when i=3 , the following indexes are called, and dx1dt does not have any value placed in the (1,2) location.因此,当i=3时,将调用以下索引,并且dx1dt没有任何值放置在(1,2)位置。 This will throw you an error that the index exceeds the bounds.这将引发索引超出范围的错误。

x(1,i)= x(1,i-1) + h * dx1dt(1,i-1);
x(1,3)= x(1,2) + h * dx1dt(1,2);

The question is: Is the variable of dx1dt supposed to be an array of size (1,79201) or simply a double?问题是: dx1dt的变量应该是一个大小为(1,79201)的数组还是只是一个双精度数组?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM