{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Tutorial 25 - V-n Diagram\n", "Welcome to this tutorial on performing V-n diagram analysis of a turbofan aircraft using RCAIDE. This guide will walk you through the code, explain its components, and highlight where modifications can be made to customize the simulation for different vehicle designs.\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Header and Imports\n", "\n", "\n", "The **Imports** section is divided into two parts: general-purpose Python libraries and simulation-specific libraries." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2025-04-10T19:14:43.467250Z", "iopub.status.busy": "2025-04-10T19:14:43.466812Z", "iopub.status.idle": "2025-04-10T19:14:44.817565Z", "shell.execute_reply": "2025-04-10T19:14:44.816924Z" } }, "outputs": [], "source": [ "from RCAIDE.Library.Methods.Powertrain.Propulsors.Internal_Combustion_Engine import design_internal_combustion_engine\n", "import sys\n", "import os\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. RCAIDE Imports\n", "\n", "The **RCAIDE Imports** section includes the core modules needed for the simulation. These libraries provide specialized classes and tools for building, analyzing, and running aircraft models.\n", "\n", "### Key Imports:\n", "\n", "1. **RCAIDE**: The core package is imported directly. This approach allows us to access specific classes and methods from RCAIDE without repeatedly importing individual components at the top of the script.\n", "\n", "2. **`Units` Module**: The Units module is a standardized way to handle unit conversions within RCAIDE. It ensures consistent units across all inputs and outputs, reducing the likelihood of conversion errors." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2025-04-10T19:14:44.820151Z", "iopub.status.busy": "2025-04-10T19:14:44.819591Z", "iopub.status.idle": "2025-04-10T19:14:44.822876Z", "shell.execute_reply": "2025-04-10T19:14:44.822407Z" } }, "outputs": [], "source": [ "import RCAIDE\n", "from RCAIDE.Framework.Core import Data,Units \n", "from RCAIDE.Library.Methods.Performance import generate_V_n_diagram\n", "from RCAIDE.Library.Methods.Powertrain.Converters.Rotor import design_propeller" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Vehicle Setup\n", "\n", "The **`vehicle_setup`** function defines the baseline configuration of the aircraft. This section builds the vehicle step-by-step by specifying its components, geometric properties, and high-level parameters.\n", "\n", "A detailed description of the vehicle setup is provided in the a tutorial coming soon." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2025-04-10T19:14:44.825116Z", "iopub.status.busy": "2025-04-10T19:14:44.824932Z", "iopub.status.idle": "2025-04-10T19:14:44.853508Z", "shell.execute_reply": "2025-04-10T19:14:44.852921Z" } }, "outputs": [], "source": [ "def vehicle_setup(): \n", " \n", " #------------------------------------------------------------------------------------------------------------------------------------\n", " # ################################################# Vehicle-level Properties ######################################################## \n", " #------------------------------------------------------------------------------------------------------------------------------------ \n", " vehicle = RCAIDE.Vehicle()\n", " vehicle.tag = 'Cessna_172' \n", " vehicle.mass_properties.max_takeoff = 2550. * Units.pounds\n", " vehicle.mass_properties.takeoff = 2550. * Units.pounds\n", " vehicle.mass_properties.max_zero_fuel = 2550. * Units.pounds\n", " vehicle.mass_properties.cargo = 0. \n", " \n", " # envelope properties \n", " vehicle.flight_envelope.ultimate_load = 5.7 \n", " vehicle.flight_envelope.positive_limit_load = 3.8 \n", " vehicle.flight_envelope.design_range = 750 * Units.nmi \n", " vehicle.flight_envelope.design_dynamic_pressure = 1929.1574740443007\n", " vehicle.flight_envelope.design_mach_number = 0.18745866156304694\n", " \n", " # basic parameters \n", " vehicle.reference_area = 174. * Units.feet**2 \n", " vehicle.passengers = 4\n", "\n", "\n", " \n", " #------------------------------------------------------------------------------------------------------------------------------------\n", " # ##################################################### Landing Gear ################################################################ \n", " #------------------------------------------------------------------------------------------------------------------------------------ \n", " main_gear = RCAIDE.Library.Components.Landing_Gear.Main_Landing_Gear()\n", " main_gear.strut_length = 12. * Units.inches\n", " vehicle.append_component(main_gear) \n", " nose_gear = RCAIDE.Library.Components.Landing_Gear.Nose_Landing_Gear() \n", " nose_gear.strut_length = 6. * Units.inches \n", " vehicle.append_component(nose_gear)\n", "\n", "\n", " #------------------------------------------------------------------------------------------------------------------------------------\n", " # ######################################################## Wings #################################################################### \n", " #------------------------------------------------------------------------------------------------------------------------------------\n", " # ------------------------------------------------------------------\n", " # Main Wing\n", " # ------------------------------------------------------------------ \n", "\n", " wing = RCAIDE.Library.Components.Wings.Main_Wing()\n", " wing.tag = 'main_wing' \n", " wing.sweeps.quarter_chord = 0.0 * Units.deg\n", " wing.thickness_to_chord = 0.12\n", " wing.areas.reference = 174. * Units.feet**2\n", " wing.spans.projected = 36. * Units.feet + 1. * Units.inches\n", " wing.chords.root = 66. * Units.inches\n", " wing.chords.tip = 45. * Units.inches\n", " wing.chords.mean_aerodynamic = 58. * Units.inches\n", " wing.taper = wing.chords.tip/wing.chords.root\n", " wing.aspect_ratio = wing.spans.projected**2. / wing.areas.reference\n", " wing.twists.root = 3.0 * Units.degrees\n", " wing.twists.tip = 1.5 * Units.degrees\n", " wing.origin = [[80.* Units.inches,0, 0.820]]\n", " wing.aerodynamic_center = [22.* Units.inches,0,0]\n", " wing.vertical = False\n", " wing.symmetric = True\n", " wing.high_lift = True \n", " wing.dynamic_pressure_ratio = 1.0 \n", " \n", " # control surfaces -------------------------------------------\n", " flap = RCAIDE.Library.Components.Wings.Control_Surfaces.Flap() \n", " flap.tag = 'flap' \n", " flap.span_fraction_start = 0.15 \n", " flap.span_fraction_end = 0.324 \n", " flap.deflection = 1.0 * Units.deg\n", " flap.chord_fraction = 0.19 \n", " wing.append_control_surface(flap) \n", " \n", " slat = RCAIDE.Library.Components.Wings.Control_Surfaces.Slat() \n", " slat.tag = 'slat' \n", " slat.span_fraction_start = 0.324 \n", " slat.span_fraction_end = 0.963 \n", " slat.deflection = 1.0 * Units.deg\n", " slat.chord_fraction = 0.1 \n", " wing.append_control_surface(slat) \n", " \n", " RCAIDE.Library.Methods.Geometry.Planform.wing_planform(wing) \n", "\n", " # add to vehicle\n", " vehicle.append_component(wing)\n", "\n", "\n", " # ------------------------------------------------------------------ \n", " # Horizontal Stabilizer\n", " # ------------------------------------------------------------------ \n", " \n", " wing = RCAIDE.Library.Components.Wings.Horizontal_Tail()\n", " wing.tag = 'horizontal_stabilizer' \n", " wing.sweeps.quarter_chord = 0.0 * Units.deg\n", " wing.thickness_to_chord = 0.12\n", " wing.areas.reference = 5800. * Units.inches**2\n", " wing.spans.projected = 136. * Units.inches\n", " wing.chords.root = 55. * Units.inches\n", " wing.chords.tip = 30. * Units.inches\n", " wing.chords.mean_aerodynamic = 43. * Units.inches \n", " wing.taper = wing.chords.tip/wing.chords.root\n", " wing.aspect_ratio = wing.spans.projected**2. / wing.areas.reference\n", " wing.twists.root = 0.0 * Units.degrees\n", " wing.twists.tip = 0.0 * Units.degrees\n", " wing.origin = [[246.* Units.inches,0,0]]\n", " wing.aerodynamic_center = [20.* Units.inches,0,0]\n", " wing.vertical = False\n", " wing.symmetric = True\n", " wing.high_lift = False \n", " wing.dynamic_pressure_ratio = 0.9\n", " \n", " \n", " elevator = RCAIDE.Library.Components.Wings.Control_Surfaces.Elevator()\n", " elevator.tag = 'elevator'\n", " elevator.span_fraction_start = 0.1\n", " elevator.span_fraction_end = 0.9\n", " elevator.deflection = 0.0 * Units.deg\n", " elevator.chord_fraction = 0.35\n", " wing.append_control_surface(elevator) \n", "\n", " \n", " vehicle.append_component(wing)\n", "\n", "\n", " # ------------------------------------------------------------------\n", " # Vertical Stabilizer\n", " # ------------------------------------------------------------------\n", "\n", " wing = RCAIDE.Library.Components.Wings.Vertical_Tail()\n", " wing.tag = 'vertical_stabilizer' \n", " wing.sweeps.quarter_chord = 25. * Units.deg\n", " wing.thickness_to_chord = 0.12\n", " wing.areas.reference = 3500. * Units.inches**2\n", " wing.spans.projected = 73. * Units.inches\n", " wing.chords.root = 66. * Units.inches\n", " wing.chords.tip = 27. * Units.inches\n", " wing.chords.mean_aerodynamic = 48. * Units.inches \n", " wing.taper = wing.chords.tip/wing.chords.root\n", " wing.aspect_ratio = wing.spans.projected**2. / wing.areas.reference\n", " wing.twists.root = 0.0 * Units.degrees\n", " wing.twists.tip = 0.0 * Units.degrees\n", " wing.origin = [[237.* Units.inches,0,0]]\n", " wing.aerodynamic_center = [20.* Units.inches,0,0] \n", " wing.vertical = True \n", " wing.symmetric = False\n", " wing.t_tail = False \n", " wing.dynamic_pressure_ratio = 1.0\n", "\n", " rudder = RCAIDE.Library.Components.Wings.Control_Surfaces.Rudder()\n", " rudder.tag = 'rudder'\n", " rudder.span_fraction_start = 0.1\n", " rudder.span_fraction_end = 0.9\n", " rudder.deflection = 0.0 * Units.deg\n", " rudder.chord_fraction = 0.4\n", " wing.append_control_surface(rudder) \n", " \n", "\n", " # add to vehicle\n", " vehicle.append_component(wing)\n", "\n", "\n", " #------------------------------------------------------------------------------------------------------------------------------------\n", " # ########################################################## Fuselage ############################################################### \n", " #------------------------------------------------------------------------------------------------------------------------------------\n", " \n", " fuselage = RCAIDE.Library.Components.Fuselages.Tube_Fuselage()\n", " \n", " # define cabin\n", " cabin = RCAIDE.Library.Components.Fuselages.Cabins.Cabin() \n", " economy_class = RCAIDE.Library.Components.Fuselages.Cabins.Classes.Economy() \n", " economy_class.number_of_seats_abrest = 2\n", " economy_class.number_of_rows = 2\n", " economy_class.galley_lavatory_percent_x_locations = [] \n", " economy_class.emergency_exit_percent_x_locations = [] \n", " economy_class.type_A_exit_percent_x_locations = [] \n", " cabin.append_cabin_class(economy_class)\n", " fuselage.append_cabin(cabin)\n", " \n", " fuselage.differential_pressure = 8*Units.psi # Maximum differential pressure\n", " fuselage.width = 42. * Units.inches # Width of the fuselage\n", " fuselage.heights.maximum = 62. * Units.inches # Height of the fuselage\n", " fuselage.lengths.total = 326. * Units.inches # Length of the fuselage\n", " fuselage.lengths.tail = 161. * Units.inches \n", " fuselage.lengths.cabin = 105. * Units.inches \n", " fuselage.mass_properties.volume = .4*fuselage.lengths.total*(np.pi/4.)*(fuselage.heights.maximum**2.) #try this as approximation\n", " fuselage.mass_properties.internal_volume = .3*fuselage.lengths.total*(np.pi/4.)*(fuselage.heights.maximum**2.)\n", " fuselage.areas.wetted = 30000. * Units.inches**2. \n", " fuselage.fineness.nose = 1.6\n", " fuselage.fineness.tail = 2.\n", " fuselage.lengths.nose = 60. * Units.inches\n", " fuselage.heights.at_quarter_length = 62. * Units.inches\n", " fuselage.heights.at_three_quarters_length = 62. * Units.inches\n", " fuselage.heights.at_wing_root_quarter_chord = 23. * Units.inches\n", " fuselage.areas.front_projected = fuselage.width* fuselage.heights.maximum\n", " fuselage.effective_diameter = 50. * Units.inches\n", "\n", "\n", "\n", " # Segment \n", " segment = RCAIDE.Library.Components.Fuselages.Segments.Segment() \n", " segment.tag = 'segment_0' \n", " segment.percent_x_location = 0.0000\n", " segment.percent_z_location = 0.0000 \n", " fuselage.segments.append(segment) \n", " \n", " # Segment \n", " segment = RCAIDE.Library.Components.Fuselages.Segments.Super_Ellipse_Segment() \n", " segment.tag = 'segment_1' \n", " segment.percent_x_location = 0.02077 \n", " segment.percent_z_location = 0.0 \n", " segment.height = 0.31619 \n", " segment.width = 0.33071 \n", " fuselage.segments.append(segment) \n", " \n", " # Segment \n", " segment = RCAIDE.Library.Components.Fuselages.Segments.Rounded_Rectangle_Segment()\n", " segment.tag = 'segment_2' \n", " segment.percent_x_location = 0.03852 \n", " segment.percent_z_location = -0.02000\n", " segment.height = 0.73441 \n", " segment.width = 0.40654 \n", " fuselage.segments.append(segment) \n", " \n", " # Segment \n", " segment = RCAIDE.Library.Components.Fuselages.Segments.Rounded_Rectangle_Segment()\n", " segment.tag = 'segment_3' \n", " segment.percent_x_location = 0.16595\n", " segment.percent_z_location = -0.01226 \n", " segment.height = 1.00366 \n", " segment.width = 0.90341\n", " segment.radius = 0.29143\n", " fuselage.segments.append(segment) \n", "\n", " # Segment \n", " segment = RCAIDE.Library.Components.Fuselages.Segments.Rounded_Rectangle_Segment()\n", " segment.tag = 'segment_4' \n", " segment.percent_x_location = 0.24391 \t\n", " segment.percent_z_location = 0.01016 \n", " segment.height = 1.52704 \n", " segment.width = 1.06680\n", " segment.radius = 0.43714\n", " fuselage.segments.append(segment) \n", " \n", " # Segment \n", " segment = RCAIDE.Library.Components.Fuselages.Segments.Rounded_Rectangle_Segment()\n", " segment.tag = 'segment_5' \n", " segment.percent_x_location = 0.43388 \n", " segment.percent_z_location = 0.0132 \n", " segment.height = 1.50557 \n", " segment.width = 1.06680\n", " segment.radius = 0.4007\n", " fuselage.segments.append(segment) \n", " \n", " # Segment \n", " segment = RCAIDE.Library.Components.Fuselages.Segments.Rounded_Rectangle_Segment()\n", " segment.tag = 'segment_6' \n", " segment.percent_x_location = 0.53122\n", " segment.percent_z_location = -0.00895\n", " segment.height = 0.97386\n", " segment.width = 0.73776\n", " segment.radius = 0.29143\n", " fuselage.segments.append(segment) \n", " \n", " # Segment \n", " segment = RCAIDE.Library.Components.Fuselages.Segments.Ellipse_Segment()\n", " segment.tag = 'segment_7' \n", " segment.percent_x_location = 0.74233 \n", " segment.percent_z_location = 0\n", " segment.height = 0.55067 \n", " segment.width = 0.4517 \n", " fuselage.segments.append(segment)\n", "\n", " # Segment \n", " segment = RCAIDE.Library.Components.Fuselages.Segments.Segment()\n", " segment.tag = 'segment_9' \n", " segment.percent_x_location = 0.98310 \n", " segment.percent_z_location = 0 \n", " segment.height = 0.17226 \n", " segment.width = 0.18068 \n", " fuselage.segments.append(segment) \n", " \n", " \n", " # Segment \n", " segment = RCAIDE.Library.Components.Fuselages.Segments.Segment()\n", " segment.tag = 'segment_9' \n", " segment.percent_x_location = 1.0 \n", " segment.percent_z_location = 0.00189 \n", " fuselage.segments.append(segment) \n", "\n", " # add to vehicle\n", " vehicle.append_component(fuselage)\n", " \n", " #------------------------------------------------------------------------------------------------------------------------------------\n", " # ########################################################## Energy Network ######################################################### \n", " #------------------------------------------------------------------------------------------------------------------------------------ \n", " #initialize the fuel network\n", " net = RCAIDE.Framework.Networks.Fuel() \n", "\n", " # add the network to the vehicle\n", " vehicle.append_energy_network(net) \n", "\n", " #------------------------------------------------------------------------------------------------------------------------------------ \n", " # Bus\n", " #------------------------------------------------------------------------------------------------------------------------------------ \n", " fuel_line = RCAIDE.Library.Components.Powertrain.Distributors.Fuel_Line() \n", "\n", " #------------------------------------------------------------------------------------------------------------------------------------ \n", " # Fuel Tank & Fuel\n", " #------------------------------------------------------------------------------------------------------------------------------------ \n", " fuel_tank = RCAIDE.Library.Components.Powertrain.Sources.Fuel_Tanks.Fuel_Tank() \n", " fuel_tank.origin = vehicle.wings.main_wing.origin \n", " fuel_tank.fuel = RCAIDE.Library.Attributes.Propellants.Aviation_Gasoline() \n", " fuel_tank.fuel.mass_properties.mass = 319 *Units.lbs \n", " fuel_tank.mass_properties.center_of_gravity = wing.mass_properties.center_of_gravity\n", " fuel_tank.volume = fuel_tank.fuel.mass_properties.mass/fuel_tank.fuel.density \n", " fuel_line.fuel_tanks.append(fuel_tank) \n", "\n", " #------------------------------------------------------------------------------------------------------------------------------------ \n", " # Propulsor\n", " #------------------------------------------------------------------------------------------------------------------------------------ \n", " ice_prop = RCAIDE.Library.Components.Powertrain.Propulsors.Internal_Combustion_Engine() \n", " \n", " # Engine \n", " engine = RCAIDE.Library.Components.Powertrain.Converters.Engine()\n", " engine.sea_level_power = 180. * Units.horsepower\n", " engine.flat_rate_altitude = 0.0\n", " engine.rated_speed = 2700. * Units.rpm\n", " engine.power_specific_fuel_consumption = 0.52 * Units['lb/hp/hr']\n", " ice_prop.engine = engine \n", " \n", " # Propeller \n", " prop = RCAIDE.Library.Components.Powertrain.Converters.Propeller()\n", " prop.tag = 'propeller'\n", " prop.number_of_blades = 2.0\n", " prop.tip_radius = 76./2. * Units.inches\n", " prop.hub_radius = 8. * Units.inches\n", " prop.cruise.design_freestream_velocity = 119. * Units.knots\n", " prop.cruise.design_angular_velocity = 2650. * Units.rpm\n", " prop.cruise.design_Cl = 0.8\n", " prop.cruise.design_altitude = 12000. * Units.feet\n", " prop.cruise.design_power = .64 * 180. * Units.horsepower\n", " prop.variable_pitch = True \n", " ospath = os.path.abspath(os.path.join('Notebook'))\n", " separator = os.path.sep\n", " rel_path = os.path.dirname(ospath) + separator + '..' + separator + '..' + separator + 'VnV' + separator + 'Vehicles' + separator\n", " airfoil_path = rel_path \n", " airfoil = RCAIDE.Library.Components.Airfoils.Airfoil()\n", " airfoil.tag = 'NACA_4412' \n", " airfoil.coordinate_file = airfoil_path + 'Airfoils' + separator + 'NACA_4412.txt' # absolute path \n", " airfoil.polar_files =[ airfoil_path + 'Airfoils' + separator + 'Polars' + separator + 'NACA_4412_polar_Re_50000.txt',\n", " airfoil_path + 'Airfoils' + separator + 'Polars' + separator + 'NACA_4412_polar_Re_100000.txt',\n", " airfoil_path + 'Airfoils' + separator + 'Polars' + separator + 'NACA_4412_polar_Re_200000.txt',\n", " airfoil_path + 'Airfoils' + separator + 'Polars' + separator + 'NACA_4412_polar_Re_500000.txt',\n", " airfoil_path + 'Airfoils' + separator + 'Polars' + separator + 'NACA_4412_polar_Re_1000000.txt'] \n", " prop.append_airfoil(airfoil) \n", " prop.airfoil_polar_stations = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] \n", " ice_prop.propeller = prop\n", "\n", " # design propeller ICE \n", " design_internal_combustion_engine(ice_prop) \n", " \n", " net.propulsors.append(ice_prop)\n", "\n", " #------------------------------------------------------------------------------------------------------------------------------------ \n", " # Assign propulsors to fuel line to network \n", " fuel_line.assigned_propulsors = [[ice_prop.tag]]\n", " \n", " #------------------------------------------------------------------------------------------------------------------------------------ \n", " # Append fuel line to fuel line to network \n", " net.fuel_lines.append(fuel_line) \n", "\n", " #------------------------------------------------------------------------------------------------------------------------------------ \n", " # Avionics\n", " #------------------------------------------------------------------------------------------------------------------------------------ \n", " Wuav = 2. * Units.lbs\n", " avionics = RCAIDE.Library.Components.Powertrain.Systems.Avionics()\n", " avionics.mass_properties.uninstalled = Wuav\n", " vehicle.avionics = avionics \n", "\n", " #------------------------------------------------------------------------------------------------------------------------------------ \n", " # Vehicle Definition Complete\n", " #------------------------------------------------------------------------------------------------------------------------------------ \n", "\n", " return vehicle\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Vehicle Aerodynamic Analysis Setup\n", "\n", "The setup for aerodynamic analysis involves:\n", "\n", "1. **Initialize Analyses**: Create a vehicle analysis object and append Earth as the planetary environment and the US Standard Atmosphere 1976 model.\n", "2. **Define Conditions**: Set altitude (`0 m`) and ISA deviation (`0`).\n", "3. **Vehicle Setup**: Configure the vehicle with `normal` category, FAR part `23`, and lift coefficient limits (`3` and `-1.5`).\n", "4. **Generate V-n Diagram**: Calculate and plot the flight envelope using `generate_V_n_diagram`.\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2025-04-10T19:14:44.855387Z", "iopub.status.busy": "2025-04-10T19:14:44.855215Z", "iopub.status.idle": "2025-04-10T19:14:47.766669Z", "shell.execute_reply": "2025-04-10T19:14:47.766177Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Performing Weights Analysis\n", "--------------------------------------------------------\n", "Propulsion Architecture: Conventional\n", "Aircraft Type : General_Aviation\n", "Method : FLOPS\n", "Aircraft operating empty weight will be overwritten\n", "Aircraft center of gravity location will be overwritten\n", "Aircraft moment of intertia tensor will be overwritten\n", "\n", " Mission Solver Initiated\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", " 0%| | 0/100 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "analyses = RCAIDE.Framework.Analyses.Vehicle()\n", "# ------------------------------------------------------------------\n", "# Planet Analysis\n", "planet = RCAIDE.Framework.Analyses.Planets.Earth()\n", "analyses.append(planet)\n", "\n", "# ------------------------------------------------------------------\n", "# Atmosphere Analysis\n", "atmosphere = RCAIDE.Framework.Analyses.Atmospheric.US_Standard_1976()\n", "atmosphere.features.planet = planet.features\n", "analyses.append(atmosphere) \n", "\n", "altitude = 0 * Units.m\n", "delta_ISA = 0 \n", "\n", "vehicle = vehicle_setup()\n", "\n", "vehicle.flight_envelope.category = 'normal'\n", "vehicle.flight_envelope.FAR_part_number = '23' \n", "vehicle.flight_envelope.maximum_lift_coefficient = 3\n", "vehicle.flight_envelope.minimum_lift_coefficient = -1.5 \n", "\n", "V_n_data = generate_V_n_diagram(vehicle,analyses,altitude,delta_ISA) \n" ] } ], "metadata": { "kernelspec": { "display_name": "testingenv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.2" } }, "nbformat": 4, "nbformat_minor": 2 }