def test_rosenbrock_constrained(plot=False): opti = asb.Opti() x = opti.variable(init_guess=0) y = opti.variable(init_guess=0) r = opti.parameter() f = (1 - x)**2 + (y - x**2)**2 opti.minimize(f) con = x**2 + y**2 <= r dual = opti.subject_to(con) r_values = np.linspace(1, 3) sols = [opti.solve({r: r_value}) for r_value in r_values] fs = [sol.value(f) for sol in sols] duals = [ sol.value(dual) # Ensure the dual can be evaluated for sol in sols ] if plot: fig, ax = plt.subplots(1, 1, figsize=(6.4, 4.8), dpi=200) plt.plot(r_values, fs, label="$f$") plt.plot(r_values, duals, label=r"Dual var. ($\frac{df}{dr}$)") plt.legend() plt.xlabel("$r$") plt.show() assert dual is not None # The dual should be a real value assert r_values[0] == pytest.approx(1) assert duals[0] == pytest.approx(0.10898760051521068, abs=1e-6)
np.linspace(Y.min(), Y.max(), 500), ) F_plot = interp({ "x": X_plot.flatten(), "y": Y_plot.flatten() }).reshape(X_plot.shape) ax.plot_surface( X_plot, Y_plot, F_plot, color="red", edgecolors=(1, 1, 1, 0.5), linewidth=0.5, alpha=0.2, rcount=40, ccount=40, shade=True, ) plt.xlabel("x") plt.ylabel("y") plt.show() import aerosandbox as asb import aerosandbox.numpy as np opti = asb.Opti() x = opti.variable(init_guess=0) y = opti.variable(init_guess=0) opti.minimize(interp({"x": x, "y": y})) sol = opti.solve() print(sol.value(x)) print(sol.value(y))
##### Plot Polars fig, ax = plt.subplots(2, 2, figsize=(8, 8)) Re = 1e6 alpha_lowres = np.linspace(-15, 15, 31) ma = alpha mCL = af.CL_function(alpha, Re) mCD = af.CD_function(alpha, Re) xf_run = asb.XFoil(af, Re=Re, max_iter=20).alpha(alpha_lowres) xa = xf_run["alpha"] xCL = xf_run["CL"] xCD = xf_run["CD"] plt.sca(ax[0, 0]) plt.plot(ma, mCL) plt.plot(xa, xCL, ".") plt.xlabel("Angle of Attack [deg]") plt.ylabel("Lift Coefficient $C_L$ [-]") plt.sca(ax[0, 1]) plt.plot(ma, mCD) plt.plot(xa, xCD, ".") plt.ylim(0, 0.05) plt.xlabel("Angle of Attack [deg]") plt.ylabel("Drag Coefficient $C_D$ [-]") plt.sca(ax[1, 0]) plt.plot(mCD, mCL) plt.plot(xCD, xCL, ".") plt.xlim(0, 0.05) plt.xlabel("Drag Coefficient $C_D$ [-]") plt.ylabel("Lift Coefficient $C_L$ [-]")
##### Tangential force calculation CT = (pt1_star + pt2_star * cosa + pt3_star * cosa**3) * sina**2 ##### Conversion to wind axes CL = CN * cosa + CT * sina CD = CN * sina - CT * cosa CM = np.zeros_like(CL) # TODO return CL, CD, CM if __name__ == '__main__': af = Airfoil("naca0012") alpha = np.linspace(0, 360, 721) CL, CD, CM = airfoil_coefficients_post_stall(af, alpha) from aerosandbox.tools.pretty_plots import plt, show_plot, set_ticks fig, ax = plt.subplots(1, 2, figsize=(8, 5)) plt.sca(ax[0]) plt.plot(alpha, CL) plt.xlabel("AoA") plt.ylabel("CL") set_ticks(45, 15, 0.5, 0.1) plt.sca(ax[1]) plt.plot(alpha, CD) plt.xlabel("AoA") plt.ylabel("CD") set_ticks(45, 15, 0.5, 0.1) show_plot()
airplane=airplane, op_point=OperatingPoint(alpha=0, beta=1), ).run() from aerosandbox.tools.pretty_plots import plt, show_plot, contour, equal, set_ticks fig, ax = plt.subplots(2, 2) alpha = np.linspace(-10, 10, 1000) aero = AeroBuildup( airplane=airplane, op_point=OperatingPoint(velocity=100, alpha=alpha, beta=0), ).run() plt.sca(ax[0, 0]) plt.plot(alpha, aero["CL"]) plt.xlabel(r"$\alpha$ [deg]") plt.ylabel(r"$C_L$") set_ticks(5, 1, 0.5, 0.1) plt.sca(ax[0, 1]) plt.plot(alpha, aero["CD"]) plt.xlabel(r"$\alpha$ [deg]") plt.ylabel(r"$C_D$") set_ticks(5, 1, 0.05, 0.01) plt.ylim(bottom=0) plt.sca(ax[1, 0]) plt.plot(alpha, aero["Cm"]) plt.xlabel(r"$\alpha$ [deg]") plt.ylabel(r"$C_m$") set_ticks(5, 1, 0.5, 0.1)