ASaborit/OptimizationTools
0
1import streamlit as st2import numpy as np3import matplotlib.pyplot as plt4import optuna5 6st.title("Optimization tool")7 8#selección del tipo de función 9func_user = st.selectbox("Choose a function:", ("Cuadrática", "Sine", "Gaussian"))10# ("sin(x/10)", "(x-2)^2", "exp-(x-4)^2")11 12#condcionales de cada función 13def func_cuadratic(x):14 return (x - 2) ** 215 16 17def func_sine(x):18 return np.sin(x / 10)19 20 21def func_gauss(x):22 return np.exp(-((x - 4) ** 2))23 24if func_user == "Cuadrática":25 st.latex(r"(x - 2)^2")26 func_to_use = func_cuadratic27elif func_user == "Sine":28 st.latex(r"sin({ x \over 10 })")29 func_to_use = func_sine30else:31 st.latex(r"e^{-(x-4)^2}")32 func_to_use = func_gauss33 34 35opt_user = st.selectbox("tipo de optimización:", ("minimizar", "maximizar"))36 37x_low = st.number_input("Dame el resultado menor", value=-10)38x_upp = st.number_input("Dame el esultado máximo:", value=10)39 40 41def objective(trial):42 x = trial.suggest_float("x", x_low, x_upp)43 return func_to_use(x)44 45 46study = optuna.create_study(direction=opt_user)47study.optimize(objective, n_trials=500)48 49x_opt = study.best_params["x"]50y_opt = func_to_use(x_opt)51 52st.write(f"El punto de quiebre es ({x_opt:,.4f}, {y_opt:,.4f}).")53 54x_to_use = np.linspace(x_low, x_upp)55 56plt.title("Grafica el punto de quiebre con el intervalo que da el usuario")57plt.xlabel("x")58plt.ylabel("y")59plt.plot(x_to_use, func_to_use(x_to_use))60plt.scatter(x_opt, func_to_use(x_opt), c="red")61plt.annotate(62 f"({x_opt:,.2f}, {y_opt:,.2f})",63 (x_opt, y_opt),64 textcoords="offset points",65 ha="center",66)67 68st.pyplot(plt)