Unable to perform assignment because the indices on the left side are not compatible with the size of the right side.
1 次查看(过去 30 天)
显示 更早的评论
Hi. First of all sorry for asking the same question again and again but I am really close to the solution (probably).
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 RK4.
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.
File for equations:
function dydt = f_1(t,x,p,Cl,C_D,f,u1,u2,u3)
dydt = zeros(6,length(t));
% 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]
% Initial conditions
dydt(:,1)=[0;0;3608.92;1.0e+02 * 1.161544478045788;0;W];
dydt(1) = x(4) * cos(x(5)) * cos(u3);
dydt(2) = x(4) * sin(x(5)) * cos(u3);
dydt(3) = x(4) * sin(u3);
dydt(4) = -C_D*S*p*(x(4)^2)/(2*x(6))-g0*sin(u3)+u1/x(6);
dydt(5) = -Cl*S*p*x(4)./(2*x(6))*sin(u2);
dydt(6) = -f;
end
Code in the main.m is:
function main
W = .44225E+06; % .44225E+03 tons = .44225E+06 kg
% Climb from h1=1100 [m] to h2=1600 [m] with α=5 flight path angle.
T = 0:60;
C =[0;0;3608.92;1.0e+02 * 1.161544478045788;0;W];
x(4) = Velocities(3608.9,5249.3); % Changing speed [m/s] line 10 %%%%%%%%%%%%%%%%%%%%
x(5) = 0; % Changing head angle [deg]
f = fuel_cl(3608.9,5249.3); % Changing fuel flow [kg/min]
u1 = Thr_cl(3608.9,5249.3); % 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(3608.9,5249.3,x(4)); % Changing drag coefficient
Cl = lift(3608.9,5249.3,x(4)); % Changing lift coefficient
p = den(3608.9,5249.3); % Changing density [kg/m3]
[t1,x1] = ode45(@(t,x)f_1(t,x,p,Cl,C_D,u1,u2,u3),T,C);
% Perform cruise flight for t=60 minutes.
T = 60:3660;
C = x1(end,:);
x(4) = Cruise_Vel(5249.3); % Changing speed [m/s]
x(5) = 0; % Changing head angle [deg]
f = fuel_cr(5249.3); % Changing fuel flow [kg/min]
u1 = Thr_cr(5249.3); % 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(5249.3,x(4)); % Changing drag coefficient
Cl = lift_cr(5249.3,x(4)); % Changing lift coefficient
p = den_cr(5249.3); % Changing density [kg/m3]
[t2,x2] = ode45(@(t,x)f_1(t,x,p,Cl,C_D,u1,u2,u3),T,C);
% Turn with β=30 bank angle until heading is changed by η=270◦.
T =3660:3720;
C = x2(end,:);
x(4) = Cruise_Vel(5249.3); % Changing speed [m/s]
x(5) = 0:30:270; % Changing head angle [deg]
f = fuel_cr(5249.3); % Changing fuel flow [kg/min]
u1 = Thr_cr(5249.3); % 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(5249.3,x(4)); % Changing drag coefficient
Cl = lift_cr(5249.3,x(4)); % Changing lift coefficient
p = den_cr(5249.3); % Changing density [kg/m3]
[t3,x3] = ode45(@(t,x)f_1(t,x,p,Cl,C_D,u1,u2,u3),T,C);
% Descent from h2=1600 [m] to h1=1100 [m] with ζ=4◦ flight path angle.
T = 3720:3780;
C = x3(end,:);
x(4) = Des_Vel(5249.3,3608.9); % Changing speed [m/s]
x(5) = 270; % Changing head angle [deg]
f = fuel_des(5249.3,3608.9); % Changing fuel flow [kg/min]
u1 = Thr_des(5249.3,3608.9); % Changing thrust [N]
u2 = 0; % Changing bank angle [deg]
u3 = 4; % Changing flight path angle [deg]
V_ver = x(4)*sin(u3); % Changing vertical speed [m/s]
C_D = drag_des(5249.3,3608.9,x(4)); % Changing drag coefficient
Cl = lift_des(5249.3,3608.9,x(4)); % Changing lift coefficient
p = den_des(5249.3,3608.9); % Changing density [kg/m3]
[t4,x4] = ode45(@(t,x)f_1(t,x,p,Cl,C_D,u1,u2,u3),T,C);
% Complete a 360◦ turn (loiter) at level flight.
T = 3780:3840;
C = x4(end,:);
x(4) = Cruise_Vel(3608.9); % Changing speed [m/s]
lon = [270 300 360 60 120 180 240 270];
x(5) = wrapTo360(lon); % Changing head angle [deg]
f = fuel_cr(3608.9); % Changing fuel flow [kg/min]
u1 = Thr_cr(3608.9); % 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(3608.9,x(4)); % Changing drag coefficient
Cl = lift_cr(3608.9,x(4)); % Changing lift coefficient
p = den_cr(3608.9); % Changing density [kg/m3]
[t5,x5] = ode45(@(t,x)f_1(t,x,p,Cl,C_D,u1,u2,u3),T,C);
% Descent to h3=800 [m] with κ=4.5◦ flight path angle.
T = 3840:3900;
C = x5(end,:);
x(4) = Des_Vel(3608.9,2624.67); % Changing speed [m/s]
x(5) = 270; % Changing head angle [deg]
f = fuel_des(3608.9,2624.67); % Changing fuel flow [kg/min]
u1 = Thr_des(3608.9,2624.67); % 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(3608.9,2624.67,x(4)); % Changing drag coefficient
Cl = lift_des(3608.9,2624.67,x(4)); % Changing lift coefficient
p = den_des(3608.9,2624.67); % Changing density [kg/m3]
[t6,x6] = ode45(@(t,x)f_1(t,x,p,Cl,C_D,u1,u2,u3),T,C);
t = [t1;t2;t3;t4;t5;t6];
x = [x1;x2;x3;x4;x5;x6];
tot=cell2mat(f); % Total fuel consumption during mission [kg/min]
Tot_fuel=sum(tot);
figure(1)
plot3(x(1),x(2),x(3)); % 3D position graph
figure(2)
plot(t,x(4)); % Vtas − Time graph
figure(3)
plot(t,V_ver(:)); % V_vertical − Time graph
figure(4)
plot(t,x(5)); % Heading − Time graph
figure(5)
plot(t,x(6)); % 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);
end
And when I run:
Unable to perform assignment because the indices on the left side are not compatible with the size of the right side.
Error in main (line 10)
x(4) = Velocities(3608.9,5249.3); % Changing speed [m/s]
The problem is, functions I use output multiple values and I try to store them in x(4), x(5), f, u1, C_D,Cl,p by using arrays. It is mandatory to update x(4), x(5), f, u1, C_D,Cl,p with changing altitude ( for example 3608.9 feet to 5249.3 feet )
The question is, how can I feed x(4), x(5), f, u1, C_D,Cl,p with these updating values without using arrays, so I won't face with size problems?
Thanks.
For example:
x(4) = Velocities(3608.9,5249.3); % Changing speed [m/s] line 10 %%%%%%%%%%%%%%%%%%%%
C_D = drag(3608.9,5249.3,x(4)); % Changing drag coefficient
and Velocities.m is:
function [Vtas_cl] = Velocities(H1,H2)
%%%%%%%%%%%%%%% 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 = H1:H2; %%%%%%%%%%% 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]
% Using above values:
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]
% Output
end
end
0 个评论
回答(1 个)
Alan Stevens
2022-1-4
Try replacing
x(4) = Velocities(3608.9,5249.3);
by
x(4,:) = Velocities(3608.9,5249.3);
Same for x(5).
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Aerospace Applications 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!