Empty Weight#
This section describes the code used for computing the empty weight fraction for a given MTOW and fuel weight, using various aircraft parameters. This module uses refined weight estimation relations described in weight and balance section. Below code defines a set of functions for computing weight of individual components:
import numpy as np
import nbimporter
from parameters import AircraftParameters
from fuel import compute_fuel_weight
def compute_wing_weight(parameters:AircraftParameters, MTOW):
A = parameters.A
Wfw = parameters.fuel_weight
Sw = parameters.S
sweep = np.radians(parameters.sweep_qc)
taper_ratio = parameters.taper_ratio_wing
Nz = parameters.Nz
tc = parameters.tc_avg
q = 0.5 * parameters.rho_cruise * parameters.cruise_speed**2
wing_weight = 0.036*Sw**0.758 * Wfw**0.0035 * (A/np.cos(sweep)**2)**0.6 * q**0.006 * taper_ratio**0.04 \
* (100*tc/np.cos(sweep))**-0.3 * (Nz*MTOW)**0.49
return wing_weight
def compute_fuselage_weight(parameters: AircraftParameters, Wdg: float):
Sf = parameters.Sf
D = parameters.D
Lf = parameters.Lf
Lt = parameters.Lt
Nz = parameters.Nz
q = 0.5 * parameters.rho_cruise * parameters.cruise_speed**2
fuselage_weight = 0.052 * Sf**1.086 * (Nz * Wdg)**0.177 * Lt**(-0.051) * (Lf / D)**(-0.072) * q**0.241
return fuselage_weight
def compute_horizontal_tail_weight(parameters: AircraftParameters, Wdg: float):
Aht = parameters.Aht
Sht = parameters.Sht
taper_ratio_ht = parameters.taper_ratio_ht
sweep_ht = np.radians(parameters.sweep_qc_ht)
tc_ht = parameters.tc_ht
Nz = parameters.Nz
q = 0.5 * parameters.rho_cruise * parameters.cruise_speed**2
ht_weight = 0.016 * (Nz*Wdg)**0.414 * q**0.168 * Sht**0.896 \
* ( (100 * tc_ht / np.cos(sweep_ht))**-0.12 ) * (Aht / np.cos(sweep_ht)**2)**0.043 * taper_ratio_ht**-0.02
return ht_weight
def compute_vertical_tail_weight(parameters: AircraftParameters, Wdg: float):
Avt = parameters.Avt
Svt = parameters.Svt
taper_ratio_vt = parameters.taper_ratio_vt
sweep_vt = np.radians(parameters.sweep_qc_vt)
tc_vt = parameters.tc_vt
tail_factor = parameters.vtail_factor
Nz = parameters.Nz
q = 0.5 * parameters.rho_cruise * parameters.cruise_speed**2
vt_weight = 0.073 * (1+0.2*tail_factor) * (Nz*Wdg)**0.376 * q**0.122 * Svt**0.873 \
* (100*tc_vt/np.cos(sweep_vt))**-0.49 * (Avt/np.cos(sweep_vt)**2)**0.357 \
* taper_ratio_vt**0.039
return vt_weight
def compute_landing_gear_weight(parameters: AircraftParameters, Wdg: float):
Nl = parameters.Nl
Lm = parameters.Lm
WL = 0.95 * Wdg
lg_weight = 0.054 * Lm**0.501 * (WL*Nl)**0.684
return lg_weight
def compute_propulsion_weight(parameters: AircraftParameters, Wdg: float):
engine_weight = parameters.engine_weight
num_engines = parameters.num_engines
num_fuel_tanks = parameters.num_fuel_tanks
Vt = parameters.fuel_tank_volume # gallons
Winst_eng = 2.575 * engine_weight**0.922 * num_engines # lbs
Vi = Vt
Wfuel_system = 2.49 * Vt**0.726 * (1 + Vi/Vt)**-0.363 * num_fuel_tanks**0.242 * num_engines**0.157 # lbs
return Winst_eng + Wfuel_system
def compute_miscellaneous_weight(parameters: AircraftParameters, Wdg: float):
M = parameters.cruise_mach_number
Kh = parameters.Kh
num_passengers = parameters.num_passengers
# flight controls
Wflight_controls = 0.0168 * Wdg # Roskam Part 5, equation 7.2
# hydraulics
M = 0.3 # cruise mach number
Kh = 0.05 # low subsonic with hydraulics for brakes and retracts only
Whydraulics = Kh * Wdg**0.8 * M**0.5 # Raymer, equation 15.55
# avionics
Wavionics = 40 + 0.008 * Wdg # Roskam Part 5, 7.23
# electrical
Welectrical = 0.0268 * Wdg # Roskam Part 5, 7.13
# furshings
Wfurshings = 0.412 * num_passengers**1.145 * Wdg**0.489 # Roskam Part 5, 7.41
return Wflight_controls + Whydraulics + Wavionics + Welectrical + Wfurshings
Below code defines a function for computing empty weight fraction for a given MTOW value, using the functions defined in previous block:
def compute_empty_weight(parameters: AircraftParameters, MTOW: float):
"""
Function to compute empty weight fraction
"""
wing_weight = compute_wing_weight(parameters, MTOW)
fuselage_weight = compute_fuselage_weight(parameters, MTOW)
ht_weight = compute_horizontal_tail_weight(parameters, MTOW)
vt_weight = compute_vertical_tail_weight(parameters, MTOW)
lg_weight = compute_landing_gear_weight(parameters, MTOW)
propulsion_weight = compute_propulsion_weight(parameters, MTOW)
misc_weight = compute_miscellaneous_weight(parameters, MTOW)
empty_weight = wing_weight + fuselage_weight + ht_weight + vt_weight + lg_weight + propulsion_weight + misc_weight
parameters.wing_weight = wing_weight
parameters.fuselage_weight = fuselage_weight
parameters.ht_weight = ht_weight
parameters.vt_weight = vt_weight
parameters.lg_weight = lg_weight
parameters.propulsion_weight = propulsion_weight
parameters.misc_weight = misc_weight
parameters.empty_weight = empty_weight
return empty_weight
Below code block demonstrates how the empty weight function can be used. Note that you need to compute fuel weight before calling empty weight function.
# Parameters
A = 8
S = 134 # sq ft
max_power = 595 # hp
aircraft = AircraftParameters(A, S, max_power)
# Weight
MTOW = 5000 # lbs
fuel_weight = compute_fuel_weight(aircraft, MTOW) # lbs
empty_weight = compute_empty_weight(aircraft, MTOW) # lbs
print(f"Fuel weight for MTOW of {MTOW:.0f} lbs: {empty_weight:.0f} lbs")
Fuel weight for MTOW of 5000 lbs: 3015 lbs
This concludes the empty weight fraction section, next section describes how these different modules are used for computing MTOW using the iterative process.