Professional Documents
Culture Documents
The goal of this project is to optimize a rocket to launch a payload into a given GEO based on various design
constraints. The rocket should be as small as possible at launch while delivering the largest possible payload.
The first step in calculating stage 1 and 2 is to determine the total ∆𝑉 needed to reach GTO insertion. As
permitted by the assumptions outlined in the problem, this is simply the sum of the orbital velocity at
insertion, the given drag approximation, and the initial rotational velocity of the earth
To calculate the velocity at GTO insertion, several more parameters must be determined
𝑟𝑎 𝐺𝑇𝑂 − 𝑟𝑝 𝐺𝑇𝑂
𝑒𝐺𝑇𝑂 = = 0.73414
𝑟𝑎 𝐺𝑇𝑂 + 𝑟𝑝 𝐺𝑇𝑂
𝑝𝐺𝑇𝑂 = 𝑎𝐺𝑇𝑂 (1 − 𝑒𝐺𝑇𝑂 2 ) = 11,210 𝑘𝑚
𝑝
𝑟𝜈0 = = 6558.6 𝑘𝑚
𝐺𝑇𝑂 1 + 𝑒𝐺𝑇𝑂 cos 𝜈0 𝐺𝑇𝑂
2𝜇𝐸 𝜇𝐸
𝑣𝜈0 𝐺𝑇𝑂 = √ − = 10.254 𝑘𝑚⁄𝑠
𝑟𝜈0 𝑎𝐺𝑇𝑂
𝐺𝑇𝑂
The initial velocity provided by the rotation of the earth needs to be calculated
𝑐𝑒 = 2𝜋𝑟𝑒 = 40074 𝑘𝑚
𝑐𝑒
𝑣𝑒 = = 0.46382 𝑘𝑚⁄𝑠
𝑡𝑑𝑎𝑦
𝑣𝑒 𝑙𝑎𝑡 = 𝑣𝑒 cos(𝑖𝐺𝐸𝑂 ) = 0.40761 𝑘𝑚⁄𝑠
The sum of the velocities gives the total for ∆𝑉1+2
∆𝑉1+2 = 𝑣𝜈0 𝐺𝑇𝑂 + ∆𝑉𝑔𝑖𝑣𝑒𝑛 − 𝑣𝑒 𝑙𝑎𝑡 = 11.4470 𝑘𝑚⁄𝑠
This represents the total ∆𝑉 that must be provided by stage 1 and 2.
The final step is also the most complex. Given the value for ∆𝑉1+2 and the design constraints for stage 1 and 2,
the lowest possible initial mass must be determined.
Finding the minimum value of 𝑚01 is extremely difficult through analytical means, as there are two unknowns
and only one equation. However, it can be solved numerically using the help of computer software. It is
possible to define a function for 𝑚0 2 in terms of ∆𝑉2 . Then, software can be used to create a large vector
containing a very large number of possible values for 𝑚0 2 within the range of stage 2 providing 0 ∆𝑉 to the
entire 11.4470 𝑘𝑚⁄𝑠 ∆𝑉 in the combined staging. Then, 𝑚01 can be solved in terms of 𝑚0 2 and ∆𝑉1 . Since
every value of ∆𝑉1 corresponds to a specific value of ∆𝑉2 , another vector can be made with a large number of
possible values for 𝑚01 and the computer software can then iterate through that vector to find the lowest
possible value for 𝑚01 .
Upon implementing this in MATLAB, it is revealed that there is a specific range of useful results for 𝑚01 .
Outside that range represents rocket configurations that are not physically possible. This is easily seen from
the initial graph of 𝑚01 and ∆𝑉2
The range of useful results is clearly visible in
figure 1. The values not in-between the two
asymptotes report a negative mass, indicating
that such a rocket configuration is actually not
possible. To make this graph more useful and to
have MATLAB determine the proper minima,
the data needs to be truncated to only show the
relevant region.
This is the output of the MATLAB script that displays all the finalized staging information from its calculations
--Stage 1--
Delta V: 4.4808 km/s
Total Mass: 89391.0968 kg
Structure Mass: 8397.3997 kg
Payload Mass: 13051.0993 kg
Fuel Mass: 80993.6971 kg
Payload Factor: 0.146
--Stage 2--
Delta V: 6.9662 km/s
Total Mass: 13051.0993 kg
Structure Mass: 1540.6429 kg
Payload Mass: 1200 kg
Fuel Mass: 11510.4564 kg
Payload Factor: 0.091946
--Stage 3--
Delta V: 1.8438 km/s
Total Mass: 1200 kg
Structure Mass: 103.5375 kg
Payload Mass: 509.7499 kg
Fuel Mass: 586.7126 kg
Payload Factor: 0.42479
The rest of this document is the code that was used to assist in this calculation and produce that output.
%define various known values
r_e = 6378; %radius of earth, km
mu_e = 3.986*10^5; %gravitional parameter, km^3/s^2
g0 = 0.00981; %gravitational acceleration, km/s^2
rotation = 24*60*60; %seconds per day in earths rotation
rot_vel = (pi*r_e*2)/rotation; %rotational speed at equator, km/s
%GTO orbital parameters and calculations
rp_gto = 86 + r_e; %periapsis of GTO, km
ra_gto = 35786 + r_e; %apoapsis of GTO, km
nu_i = 15; %true anomaly angle of GTO orbital insertion, degrees
drag = 1.6; %problem given drag approximation, km/s
i_gto = 28.5; %inclination angle for GTO, degrees
a_gto = (ra_gto + rp_gto)/2; %semi-major axis of gto, km
e_gto = (ra_gto-rp_gto)/(ra_gto+rp_gto); %eccentricity of gto, unitless
p_gto = a_gto*(1-e_gto^2); %p for gto, km
r15_gto = p_gto / (1+e_gto*cosd(nu_i)); %distance at 15 deg, km
v15_gto = ((2*mu_e)/r15_gto - mu_e/a_gto)^(1/2); %velocity of gto at 15deg,
km/s
va_gto = ((2*mu_e)/ra_gto - mu_e/a_gto)^(1/2); %velocity of gto at apoapsis,
km/s
dv_to_gto = v15_gto + drag - rot_vel*cosd(i_gto); %delta-v to reach GTO, km/s
%Rocket Stage properties
e1 = 0.11; %struc coeff for stage 1, unitless
e2 = 0.13; %struc coeff for stage 2, unitless
e3 = 0.15; %struc coeff for stage 3, unitless
Isp1 = 320; %specific impulse for stage 1, seconds
Isp2 = 455; %specific impulse for stage 2, seconds
Isp3 = 280; %specific impulse for stage 3, seconds
m0_3 = 1200; %mass of stage 3, kg
%GEO parameters and transfer calculations
r_geo = ra_gto; %radius of circular GEO, km
v_geo = (mu_e/r_geo)^(1/2); %velocity of GEO, km/s
dv_circ = (v_geo^2 + va_gto^2 -2*(v_geo)*(va_gto)*cosd(i_gto))^(1/2);
%combined burn d-v for circularization, km/s
%use equation from report to calculate payload factor
pf_3 = (exp((-dv_circ) / (Isp3*g0))-e3) / (1-e3);
mp_3=m0_3*pf_3; %mass of payload for stage 3, kg
ms_3=(m0_3-mp_3)*e3; %mass of structure for stage 3, kg
mf_3=m0_3-mp_3-ms_3; %mass of propellant for stage 3, kg
%optimization of stage 1 and 2
%this solution is essentially numeric, using a large vector to find the
%lowest value for the initial mass of stage 1.
%A more comprehensive explanation is available in the report
res = 10000; %the number of values in the array, more values = more accurate
%create a vector of a large amount of numbers within the delta-v range
range = [0:dv_to_gto/(res-1):dv_to_gto];
m2_range = zeros(1,res); %create empty array of proper size
%populate array with all possible values for m0_2
for i=1:res
m2_range(i) = ((1 - e2) * m0_3) / (exp(-1*(range(i))/(Isp2*g0)) - e2);
end
%populate array with possible values for m0_1
m1_range = zeros(1,res); %create empty array of proper size
for i=1:res
m1_range(i) = ((1 - e1) * m2_range(i)) / (exp(-1*(dv_to_gto-
range(i))/(Isp1*g0)) - e1);
end
%plot the first graph (fig 1 on report)
figure
plot(range,m1_range);
title("Optimization function (fig 1)")
xlabel("DV stage 2 (km/s)");
ylabel("Mass (kg)");
%find the local maxima and trunctuate irrelevant data
[m1_max,m1_ind] = findpeaks(m1_range);
m1_useful = m1_range(m1_ind(1):m1_ind(2));
range_useful = range(m1_ind(1):m1_ind(2));
%plot the second graph (fig 2 on report)
figure
plot(range_useful,m1_useful);
title("Optimization function (fig 2)");
xlabel("DV stage 2 (km/s)");
ylabel("Mass (kg)");
%plot the final, scaled graph (fig 3 on report)
figure
plot(range_useful,m1_useful,range_useful(min_index),m1_useful(min_index),'r*'
)
title("Optimization function (fig 3)");
xlabel("DV stage 2 (km/s)");
ylabel("Mass (kg)");
axis([range_useful(1) range_useful(length(range_useful)) 0 0.35*10^6]);
%use the truncuated data vector to find the minimum mass
[m0_1,min_index] = min(m1_useful);
m2_useful = m2_range(m1_ind(1):m1_ind(2)); %create trunctuated versions of
the other vectors to use the index
m0_2 = m2_useful(min_index); %pull mass of stage 2 from index corresponding
to mass of stage 1, kg
dv_1 = dv_to_gto - range_useful(min_index); %delta-v for stage 1, km/s
dv_2 = range_useful(min_index); %pull delta-v for stage 2 from corresponding
index, km/s
%calculate the rest of the rocket data
dv_3 = dv_circ; %delta v for stage 3, km/s
pf_1 = m0_2 / m0_1; %payload factor stage 1, unitless
pf_2 = m0_3 / m0_2; %payload factor stage 2, unitless
ms_1 = (m0_1-m0_2)*e1; %structure mass stage 1, kg
mf_1 = m0_1-ms_1; %fuel mass stage 1, kg
ms_2 = (m0_2-m0_3)*e2; %structure mass stage 2, kg
mf_2 = m0_2-ms_2; %fuel mass stage 2, kg
%output all relevant values
disp("--Stage 1--")
disp("Delta V: "+dv_1+" km/s")
disp("Total Mass: "+m0_1+" kg")
disp("Structure Mass: "+ms_1+" kg")
disp("Payload Mass: "+m0_2+" kg")
disp("Fuel Mass: "+mf_1+" kg")
disp("Payload Factor: "+pf_1)
disp("--Stage 2--")
disp("Delta V: "+dv_2+" km/s")
disp("Total Mass: "+m0_2+" kg")
disp("Structure Mass: "+ms_2+" kg")
disp("Payload Mass: "+m0_3+" kg")
disp("Fuel Mass: "+mf_2+" kg")
disp("Payload Factor: "+pf_2)
disp("--Stage 3--")
disp("Delta V: "+dv_3+" km/s")
disp("Total Mass: "+m0_3+" kg")
disp("Structure Mass: "+ms_3+" kg")
disp("Payload Mass: "+mp_3+" kg")
disp("Fuel Mass: "+mf_3+" kg")
disp("Payload Factor: "+pf_3)