def propeller_range_endurance_speeds(analyses, altitude, CL_max, up_bnd, delta_isa): # setup a mission that runs a single point segment without propulsion def mini_mission(): # ------------------------------------------------------------------ # Initialize the Mission # ------------------------------------------------------------------ mission = SUAVE.Analyses.Mission.Sequential_Segments() mission.tag = 'the_mission' # ------------------------------------------------------------------ # Single Point Segment 1: constant Speed, constant altitude # ------------------------------------------------------------------ segment = SUAVE.Analyses.Mission.Segments.Single_Point.Set_Speed_Set_Altitude_No_Propulsion( ) segment.tag = "single_point" segment.analyses.extend(analyses) segment.altitude = altitude segment.temperature_deviation = delta_isa # add to misison mission.append_segment(segment) return mission # This is what's called by the optimizer for CL**3/2 /CD Max def single_point_3_halves(X): # Update the mission mission.segments.single_point.air_speed = X # Run the Mission point_results = mission.evaluate() CL = point_results.segments.single_point.conditions.aerodynamics.lift_coefficient CD = point_results.segments.single_point.conditions.aerodynamics.drag_coefficient three_halves = -(CL**( 3 / 2)) / CD # Negative because optimizers want to make things small return three_halves # This is what's called by the optimizer for L/D Max def single_point_LDmax(X): # Modify the mission for the next iteration mission.segments.single_point.air_speed = X # Run the Mission point_results = mission.evaluate() CL = point_results.segments.single_point.conditions.aerodynamics.lift_coefficient CD = point_results.segments.single_point.conditions.aerodynamics.drag_coefficient L_D = -CL / CD # Negative because optimizers want to make things small return L_D # ------------------------------------------------------------------ # Run the optimizer to solve # ------------------------------------------------------------------ # Setup the a mini mission mission = mini_mission() # Takeoff mass: mass = analyses.aerodynamics.geometry.mass_properties.takeoff # Calculate the stall speed Vs = stall_speed(analyses, mass, CL_max, altitude, delta_isa)[0][0] # The final results to save results = Data() # Wrap an optimizer around both functions to solve for CL**3/2 /CD max outputs_32 = sp.optimize.minimize_scalar(single_point_3_halves, bounds=(Vs, up_bnd), method='bounded') # Pack the results results.CL32 = Data() results.CL32.air_speed = outputs_32.x results.CL32.value = -outputs_32.fun[0][0] # Wrap an optimizer around both functions to solve for L/D Max outputs_ld = sp.optimize.minimize_scalar(single_point_LDmax, bounds=(Vs, up_bnd), method='bounded') # Pack the results results.L_D_max = Data() results.L_D_max.air_speed = outputs_ld.x results.L_D_max.value = -outputs_ld.fun[0][0] return results