import matplotlib.pyplot as plt import math def raymers_iterate(current_max_weight, payload_weight, fuel_weight, a_constant, c_constant, variable_sweep_constant): empty_max_weight_ratio = (a_constant * current_max_weight**c_constant * variable_sweep_constant) new_max_weight = payload_weight / (1 - (fuel_weight / current_max_weight) - (empty_max_weight_ratio)) return new_max_weight payload_mass_metric = 125 # Grams payload_mass_imperial = payload_mass_metric * 0.002204623 # Converting grams to pounds a_constant = 0.86 # Sailplane - Unpowered c_constant = -0.05 # Sailplane - Unpowered max_weight_guess = 6 # Initial weight guess of 6 lbs current_estimate = max_weight_guess imperial_estimates = [] for i in range(0,11): current_estimate = raymers_iterate(current_estimate, payload_mass_imperial, 0, a_constant, c_constant, 1) imperial_estimates.append(current_estimate) metric_estimates = [] for imperial_estimate in imperial_estimates: metric_estimates.append(imperial_estimate / 0.002204623) plt.plot(metric_estimates, linestyle='--', marker='o') # This section has been commented out because jordan (senft) does not believe the customer wants to see the numbers # Add labels to each point #for index, weight in enumerate(metric_estimates): # plt.text(index, weight + 5, f'{index}: {weight:.2f}', fontsize=9, ha='right') plt.title("Aircraft Raymer's Method Weight Estimation") plt.xlabel("Iteration Number") plt.ylabel("Weight Estimation (g)") plt.grid(True) #plt.show() print("Raymer's Aircraft Calculations (IMPERIAL UNITS)\n") print("Weight Estimation (mass): %0.4f lbs" % imperial_estimates[-1]) # Wing loading typical_weight_area_ratio = 6 # Historical sailplane ratio print("Typical Weight Area Ratio: %0.4f lbs/ft²" % typical_weight_area_ratio) # To find area of the wings we must work backwards (ratio = weight/area) # Area of wings wing_area = imperial_estimates[-1] / typical_weight_area_ratio print("Main Wing Area: %0.4f ft²" % wing_area) # L/D Ratio ld_ratio = 7.5 / 1.5 print("Lift to Drag Ratio: %0.4f" % ld_ratio) # Aspect Ratio (Wing span) - Need L/D aspect_ratio = 4.464 * (ld_ratio**0.69) print("Aspect Ratio: %0.4f" % aspect_ratio) # Wing span wing_span = math.sqrt(aspect_ratio*wing_area) print("Main Wing Span %0.4f ft" % wing_span) # Chord Length chord_length = wing_area / wing_span print("Main Wing Chord Length %0.4f ft" % chord_length) # Fuselage Length fuselage_length = 0.86 * imperial_estimates[-1]**0.48 print("Fuselage Length %0.4f ft" % fuselage_length) # Tail Positioning (Moment arm) tail_position = fuselage_length * 0.65 print("Tail Positioning (Moment arm location) %0.4f ft" % tail_position) # Vertical Tail Area C_VT = 0.02 # Assumed constant (sail plane, raymers) vertical_tail_area = C_VT * ((wing_span * wing_area) / tail_position) print("Vertical Tail Area: {:.4f} ft²".format(vertical_tail_area)) # Horizontal Tail Area C_HT = 0.5 # Assumed constant (sail plane, raymers) horizontal_tail_area = C_HT * ((chord_length * wing_area) / tail_position) print("Horizontal Tail Area: {:.4f} ft²\n".format(horizontal_tail_area)) # Convert everything to metric print("End of imperial numbers (THANK THE LORD!)\n") print("Weight Estimation (mass): %0.4f kg" % (metric_estimates[-1]*(10**-3))) # Total Lift Force lift_force_total = (metric_estimates[-1]*(10**-3)) * 9.81 #lift_force_per_ft = lift_force_total / wing_span #lift_force_per_wing_per_ft = lift_force_per_ft / 2 print("Total Lift Force: {:.4f} N\n".format(lift_force_total)) #print("Lift Force per unit length: {:.4f} lbf/ft".format(lift_force_per_ft)) #print("Lift Force per unit length (1 wing): {:.4f} lbf/ft".format(lift_force_per_wing_per_ft)) # Bending Moments number_of_wings = 2 print("BENDING MOMENTS\n") wing_span_metric = wing_span * 0.3048 print("Wing Span: {:.4f} m".format(wing_span_metric)) # Bending Moment at Wing Root bending_moment_wing = (lift_force_total / number_of_wings) * (wing_span_metric / 4) print(f"Bending Moment at of 1 Wing from root: {bending_moment_wing:.4f} Nm\n") # Max Stress Calcs B = 4 * 0.001 # Width in m D = 4 * 0.001 # Height or depth in m # 4mm Spars area_moment_inertia = ((B) * (D**3))/12 print(f"Second moment of inertia for 4mm: {area_moment_inertia} m^4") max_stress = bending_moment_wing * ((D/2) / area_moment_inertia) print(f"Max Stress for 4mm spar: {max_stress:.4f} Pa or {max_stress/1000000:.4f} MPa") B = 6 * 0.001 # Width in m D = 6 * 0.001 # Height or depth in m # 6mm Spars area_moment_inertia = ((B) * (D**3))/12 print(f"Second moment of inertia for 6mm: {area_moment_inertia} m^4") max_stress = bending_moment_wing * ((D/2) / area_moment_inertia) print(f"Max Stress for 6mm spar: {max_stress:.4f} Pa or {max_stress/1000000:.4f} MPa") B = 12 * 0.001 # Width in m D = 2 * 0.001 # Height or depth in m # 6mm Spars area_moment_inertia = ((B) * (D**3))/12 print(f"Second moment of inertia for new test: {area_moment_inertia} m^4") max_stress = bending_moment_wing * ((D/2) / area_moment_inertia) print(f"Max Stress for new test spar: {max_stress:.4f} Pa or {max_stress/1000000:.4f} MPa")