def model(m, p): return np.blend( p["trans_str"] * (m - p["m_trans"]), p["pc_sup"] + p["a"] * np.exp(-(p["scale_sup"] * (m - p["center_sup"]))**2), p["pc_sub"]) fit = asb.FittedModel(model=model, x_data=data[:, 0], y_data=data[:, 1], parameter_guesses={ "a": 0.2, "scale_sup": 1, "center_sup": 1, "m_trans": 1., "trans_str": 5, "pc_sub": 0.16, "pc_sup": 0.05, }, parameter_bounds={ "trans_str": (0, 10), }, verbose=False) # def model(m, p): # beta_squared_ideal = 1 - m ** 2 # # beta_squared = np.softmax( # beta_squared_ideal, # -beta_squared_ideal, # hardness=p["pg_hardness"]
def model(x, p): return sigmoid(p["p5"] * (x - p["o5"])**5 + p["p3"] * (x - p["o3"])**4 + p["p1"] * (x - p["o1"])) fit = asb.FittedModel( model=model, x_data=machs_to_fit, y_data=beta(machs_to_fit), parameter_guesses={ "p1": 4.6, "o1": 0.89, "p3": 140, "o3": 0.69, "p5": 120, "o5": 0.79, }, parameter_bounds={ "o3": (0, 1), "o5": (0, 1), }, weights=weights, # residual_norm_type="deviation" ) error = fit(machs_to_fit) - beta(machs_to_fit) error = np.array(error) machs_to_plot = np.linspace(-0.5, 1.5, 500) fig, ax = plt.subplots(1, 1, figsize=(8, 7), dpi=200)
import aerosandbox as asb import aerosandbox.numpy as np masses = np.load("masses.npy") spans = np.load("spans.npy") spar_masses = np.load("spar_masses.npy") def spar_mass_model(x, p): return p["c"] * (x["span"] / 40)**p["span_exp"] * (x["mass"] / 300)**p["mass_exp"] fit = asb.FittedModel(model=spar_mass_model, x_data={ "mass": masses.reshape(-1), "span": spans.reshape(-1), }, y_data=spar_masses.reshape(-1), parameter_guesses={ "c": 1, "span_exp": 1, "mass_exp": 1, }, put_residuals_in_logspace=True, verbose=False) print("\nMODEL\n-----") for k, v in fit.parameters.items(): print(f"{k} = {v}") print("spar_mass = c * (span / 40) ** span_exp * (mass_eff / 300) ** mass_exp")
eta = data['eta'].values def model(x, p): return 1 - p["1scl"] / (x - p["1cen"]) - (p["2scl"] / (x - p["2cen"]))**2 fit = asb.FittedModel(model=model, x_data=fineness, y_data=eta, parameter_guesses={ "1scl": 1, "1cen": -25, "2scl": -1, "2cen": -25, }, parameter_bounds={ "1scl": (0, None), "1cen": (None, 0), "2scl": (0, None), "2cen": (None, 0), }, residual_norm_type="L2", verbose=False) print(fit.parameters) from aerosandbox.tools.pretty_plots import plt, show_plot fig, ax = plt.subplots() plt.plot(fineness, eta, ".k") fineness_plot = np.linspace(0, 40, 500)
As the fineness ratio goes to 0, the drag-divergent Mach should go to some reasonable value in the range of 0 to 1, probably around 0.5? Certainly no more than 0.6, I imagine. (intuition) """ return 1 - (p["a"] / (fr + p["b"]))**p["c"] fit = asb.FittedModel(model=model, x_data=np.concatenate([sub[:, 0], sup[:, 0]]), y_data=np.concatenate([sub[:, 1], sup[:, 1]]), weights=np.concatenate([ np.ones(len(sub)) / len(sub), np.ones(len(sup)) / len(sup), ]), parameter_guesses={ "a": 0.5, "b": 3, "c": 1, }, parameter_bounds={ "a": (0, None), "b": (0, None), "c": (0, None) }, residual_norm_type="L2") plt.plot(fr, fit(fr), "-k", label="Fit") p.show_plot( "Drag-Divergent Mach Number for Generic\nFuselage of Varying Fineness Ratio", "$2L_n / d$", r"$\mathrm{Mach}_{DD}$ [-]") print(fit.parameters)
p["cd_sub"] + np.exp(p["a_sub"] + p["s_sub"] * (m - p["trans"]))) fit = asb.FittedModel( model=model, x_data=data[:, 0], y_data=data[:, 1], parameter_guesses={ "trans": 1, "trans_str": 10, "cd_sub": 1.2, "cd_sup": 1.2, "a_sub": -0.4, "a_sup": -0.4, "s_sub": 4.6, "s_sup": -1.5, }, parameter_bounds={ "s_sub": (0, None), "s_sup": (None, 0), # "cd_sub": (1.2, 1.2), "trans": (0.9, 1.1), "trans_str": (0, None), }, weights=1 + 5 * ((data[:, 0] > 0.9) & (data[:, 0] < 1.1)), verbose=False, # residual_norm_type="LInf", put_residuals_in_logspace=True) from pprint import pprint
fit = asb.FittedModel( model=model, x_data={ "lats_scaled": lats_scaled, "alts_scaled": alts_scaled }, y_data=speeds_scaled, parameter_guesses={ "agc": -0.5363, "agh": 1.957, "ags": 0.1459, "aqc": -1.465, "c0": -0.517, "c12": 0.08495, "c21": -0.0252, "c4a": 0.02259, "c4c": 1.028, "cg": 0.8051, "cgc": 0.2787, "cqa": 0.1866, "cql": 0.01651, "cqla": -0.1362, "lgc": 0.6944, "lgh": 2.078, "lgs": 0.9806, "lqc": 4.036, }, # parameter_bounds={ # "agc" : (-0.5363, -0.5363), # "agh" : (1.957, 1.957), # "ags" : (0.1459, 0.1459), # "aqc" : (-1.465, -1.465), # "c0" : (-0.517, -0.517), # "c12" : (0.08495, 0.08495), # "c21" : (-0.0252, -0.0252), # "c4a" : (0.02259, 0.02259), # "c4c" : (1.028, 1.028), # "cg" : (0.8051, 0.8051), # "cgc" : (0.2787, 0.2787), # "cqa" : (0.1866, 0.1866), # "cql" : (0.01651, 0.01651), # "cqla": (-0.1362, -0.1362), # "lgc" : (0.6944, 0.6944), # "lgh" : (2.078, 2.078), # "lgs" : (0.9806, 0.9806), # "lqc" : (4.036, 4.036), # }, weights=weights, # put_residuals_in_logspace=True )