def l_over_d(aircraft, mach, altitude): """calculate specific excess power""" c_d_0 = Aircraft(aircraft, mach).c_d_zero(altitude) c_l_a = Aircraft(aircraft, mach).c_l_alpha() ar = aircraft['wing']['aspect_ratio'] l_d = 1 / 2 * (((c_l_a / 2) * ar) / c_d_0)**0.5 return l_d
def trim_aileron(aircraft, v, altitude, p): """trim aircraft with aileron and rudder""" a = Atmosphere(altitude).speed_of_sound() # [ft/s] mach = v / a b = span(aircraft['wing']['aspect_ratio'], aircraft['wing']['planform']) k = b / (2 * v) c_l_p = Aircraft(aircraft, mach).c_r_roll_rate() # [] c_l_da = Aircraft(aircraft, mach).c_r_delta_aileron() # [] da = -c_l_p * p * k / c_l_da da = rad2deg(da) return da
def master_constraint(aircraft, wing_loading, mach, altitude, n, gamma, a_x): """master constraint equation for flight.""" "return sea level static thrust to weight ratio" rho = Atmosphere(altitude).air_density() rho_sl = Atmosphere(0).air_density() a = Atmosphere(altitude).speed_of_sound() v = a * mach q_bar = 0.5 * rho * v**2 c_d_0 = Aircraft(aircraft, mach).c_d_zero(altitude) c_l_a = Aircraft(aircraft, mach).c_l_alpha() t_w = (q_bar * c_d_0 / wing_loading + wing_loading * (n**2) * (cos(deg2rad(gamma))**2) / (q_bar * c_l_a) + n * sin(deg2rad(gamma)) + a_x / g) * rho_sl / rho return t_w
def trim_alpha_de_throttle(aircraft, speed, altitude, gamma, n=1): """trim aircraft with angle of attack, elevator, and throttle""" a = Atmosphere(altitude).speed_of_sound() # [ft/s] rho = Atmosphere(altitude).air_density() # [slug / ft^3] mach = speed / a # [] c_l_a = Aircraft(aircraft, mach).c_l_alpha() # [1/rad] c_l_de = Aircraft(aircraft, mach).c_l_delta_elevator() # [1/rad] c_m_a = Aircraft(aircraft, mach).c_m_alpha() # [1/rad] c_m_de = Aircraft(aircraft, mach).c_m_delta_elevator() # [1/rad] c_l_0 = Aircraft(aircraft, mach).c_l_zero() # [] c_d_0 = Aircraft(aircraft, mach).c_d_zero(altitude) # [] w = aircraft['weight']['weight'] * n # [lb] q_bar = 0.5 * rho * speed**2 # [psf] s_w = aircraft['wing']['planform'] # [ft^2] c_bar = mac(aircraft['wing']['aspect_ratio'], s_w, aircraft['wing']['taper']) c_l_1 = w * cos(deg2rad(gamma)) / (s_w * q_bar) # [] t = Propulsion(aircraft['propulsion'], [speed, altitude], ones((aircraft['propulsion']['n_engines'])), aircraft['weight']['cg']).thrust_f_m() a = array([[-c_l_a, -c_l_de, 0], [c_m_a, c_m_de, (t[4]) / (s_w * q_bar * c_bar)], [-2 * c_l_1, 0, t[0] / (s_w * q_bar)]]) c_m_0 = Aircraft(aircraft, mach).c_m_zero(altitude) b = array([[-c_l_1 + c_l_0], [-c_m_0], [w * sin(deg2rad(gamma)) / (s_w * q_bar) + c_d_0]]) c = linalg.solve(a, b) # [rad] c[0:2] = rad2deg(c[0:2]) return c
def n_per_alpha(aircraft, x_0): """return acceleration sensitivity.""" rho = Atmosphere(x_0[-1]).air_density() # [slug/ft3] a = Atmosphere(x_0[-1]).speed_of_sound() # [ft/s] v = sqrt(sum(x_0[0:3]**2)) # [ft/s] q_bar = 0.5 * rho * v**2 # [psf] s = aircraft['wing']['planform'] # [ft2] cla = Aircraft(aircraft, v / a).c_l_alpha() # [1/rad] n_a = cla * s * q_bar / aircraft['weight']['weight'] # [g/rad] return n_a
def takeoff(aircraft, wing_loading, s_to, altitude, mu, c_l_max=1.4): """takeoff constraint equation.""" "return sea level static thrust to weight ratio" rho = Atmosphere(altitude).air_density() rho_sl = Atmosphere(0).air_density() a = Atmosphere(altitude).speed_of_sound() q_stall = wing_loading / c_l_max q_v_avg = 0.5 * q_stall mach_avg = sqrt(q_v_avg / (0.5 * rho)) / a c_d_0 = Aircraft(aircraft, mean(mach_avg)).c_d_zero(altitude) c_l_a = Aircraft(aircraft, mean(mach_avg)).c_l_alpha() c_l_0 = Aircraft(aircraft, mean(mach_avg)).c_l_zero() d_w = q_v_avg * (c_d_0 + (c_l_0**2) / c_l_a) / wing_loading l_w = q_v_avg * c_l_0 / wing_loading t_w = (1.44 * wing_loading / (rho * c_l_max * s_to * g) + d_w + mu * (1 - l_w)) * rho_sl / rho return t_w
def trim_aileron_rudder(aircraft, v, altitude, alpha, beta, p, r): """trim aircraft with aileron and rudder""" a = Atmosphere(altitude).speed_of_sound() # [ft/s] mach = v / a b = span(aircraft['wing']['aspect_ratio'], aircraft['wing']['planform']) k = b / (2 * v) c_l_b = Aircraft(aircraft, mach).c_r_beta(alpha) c_l_p = Aircraft(aircraft, mach).c_r_roll_rate() # [] c_l_r = Aircraft(aircraft, mach).c_r_yaw_rate(alpha) # [] c_l_da = Aircraft(aircraft, mach).c_r_delta_aileron() # [] c_l_dr = Aircraft(aircraft, mach).c_r_delta_rudder() # [] c_n_b = Aircraft(aircraft, mach).c_n_beta(alpha) # [] c_n_p = Aircraft(aircraft, mach).c_n_roll_rate(alpha) # [] c_n_r = Aircraft(aircraft, mach).c_n_yaw_rate(alpha) # [] c_n_da = Aircraft(aircraft, mach).c_n_delta_aileron() # [] c_n_dr = Aircraft(aircraft, mach).c_n_delta_rudder() # [] a = array([[c_l_da, c_l_dr], [c_n_da, c_n_dr]]) b = array([[-c_l_b * beta - c_l_p * p * k - c_l_r * r * k], [-c_n_b * beta - c_n_p * p * k - c_n_r * r * k]]) c = linalg.solve(a, b) # [rad] return rad2deg(c)
def trim_alpha_de(aircraft, speed, altitude, gamma, n=1): """trim aircraft with angle of attack and elevator""" a = Atmosphere(altitude).speed_of_sound() # [ft/s] rho = Atmosphere(altitude).air_density() # [slug / ft^3] mach = speed / a # [] c_l_a = Aircraft(aircraft, mach).c_l_alpha() # [1/rad] c_l_de = Aircraft(aircraft, mach).c_l_delta_elevator() # [1/rad] c_m_a = Aircraft(aircraft, mach).c_m_alpha() # [1/rad] c_m_de = Aircraft(aircraft, mach).c_m_delta_elevator() # [1/rad] c_l_0 = Aircraft(aircraft, mach).c_l_zero() # [] a = array([[c_l_a, c_l_de], [c_m_a, c_m_de]]) w = aircraft['weight']['weight'] * n # [lb] q_bar = 0.5 * rho * speed**2 # [psf] s_w = aircraft['wing']['planform'] # [ft^2] c_l_1 = w * cos(deg2rad(gamma)) / (s_w * q_bar) # [] c_m_0 = Aircraft(aircraft, mach).c_m_zero(altitude) b = array([[c_l_1 - c_l_0], [-c_m_0]]) c = linalg.solve(a, b) # [rad] return rad2deg(c)
def trim_vs(aircraft, altitude, gamma, n=1): """trim aircraft with angle of attack and elevator""" rho = Atmosphere(altitude).air_density() # [slug / ft^3] mach = 0.3 # [] assume moderate mach number c_l_a = Aircraft(aircraft, mach).c_l_alpha() # [1/rad] c_l_de = Aircraft(aircraft, mach).c_l_delta_elevator() # [1/rad] c_m_a = Aircraft(aircraft, mach).c_m_alpha() # [1/rad] c_m_de = Aircraft(aircraft, mach).c_m_delta_elevator() # [1/rad] c_l_0 = Aircraft(aircraft, mach).c_l_zero() # [] w = aircraft['weight']['weight'] * n # [lb] s_w = aircraft['wing']['planform'] # [ft^2] a_s = deg2rad(aircraft['wing']['alpha_stall']) c_m_0 = Aircraft(aircraft, mach).c_m_zero(altitude) a = array([[-w * cos(deg2rad(gamma)) / (0.5 * rho * s_w), c_l_de], [0, c_m_de]]) b = array([[-c_l_0 - c_l_a * a_s], [-c_m_0 - c_m_a * a_s]]) c = linalg.solve(a, b) # [rad] v_s = float((1 / c[0])**0.5) return v_s
def lateral_stability(plane, mach, alpha): """return airplane static lateral stability.""" c_r_b = Aircraft(plane, mach).c_r_beta(alpha) return c_r_b
def directional_stability(plane, mach, alpha): """return airplane static directional stability.""" c_n_b = Aircraft(plane, mach).c_n_beta(alpha) return c_n_b
def static_margin(plane, mach): """return longitudinal static margin.""" c_m_a = Aircraft(plane, mach).c_m_alpha() c_l_a = Aircraft(plane, mach).c_l_alpha() sm = -c_m_a / c_l_a * 100 return sm