Introduzione all'ottimizzazione in Python
Jasmin Ludolf
Content Developer

from scipy.optimize import minimize_scalar, minimizedef profit(q): return -q**4 / 4 + 11 * q**3 - 160 * q**2 + 900 * qresult_min_scalar = minimize_scalar(lambda q: -profit(q))print(f"{result_min_scalar.message}") print(f"Il massimo secondo minimize_scalar è {-result_min_scalar.fun:.2f} \ ed è raggiunto a {result_min_scalar.x:.2f}\n")
Optimization terminated successfully;
The returned value satisfies the termination criteria
(using xtol = 1.48e-08 )
Il massimo secondo minimize_scalar è 1718.75 ed è raggiunto a 5.00
x0 = 9
result = minimize(lambda q: -profit(q), x0, bounds=[(0, 20)])
print(f"{result.message}")
print(f"Il massimo secondo minimize(x0={x0}) è {-result.fun:.2f} a {result.x[0]:.2f}\n")
CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH
Il massimo secondo minimize(x0=9) è 1718.75 a 5.00
x0 = 10 + 1e-8
result = minimize(lambda q: -profit(q), x0)
print(f"{result.message}")
print(f"Il massimo secondo minimize(x0={x0}) è {-result.fun:.2f} a {result.x[0]:.2f}\n")
Optimization terminated successfully.
Il massimo secondo minimize(x0=10.00000001) è 1500.00 a 10.00
from scipy.optimize import basinhoppingx0 = 0 result = basinhopping(lambda q: -profit(q), x0, niter=10000)print(f"{result.message}") print(f"Il massimo secondo basinhopping(x0={x0}, niter=10000) \ è {-result.fun:.2f} a {result.x[0]:.2f}\n")
['requested number of basinhopping iterations completed successfully']
Il massimo secondo basinhopping(x0=0, niter=10000) è 2268.00 a 18.00
from scipy.optimize import basinhopping, NonlinearConstraint x0 = 0 kwargs = {"constraints": NonlinearConstraint(lambda x: x, lb=0, ub=30)}result = basinhopping(lambda q: -profit(q), x0, minimizer_kwargs=kwargs) print(f"{result.message}") print(f"Il massimo secondo basinhopping(x0={x0}) è a {result.x[0]:.2f}\n")
['requested number of basinhopping iterations completed successfully']
Il massimo secondo basinhopping(x0=0) è a 18.00
from scipy.optimize import basinhopping, LinearConstraint x0 = 0 kwargs = {"constraints": LinearConstraint([1], lb=0, ub=30)}maxima = [] def callback(x, f, accept): if accept: maxima.append(*x)result = basinhopping(lambda q: -profit(q), x0, callback=callback, minimizer_kwargs=kwargs, niter=5)
print(f"{result.message}")
print(f"Il massimo secondo basinhopping(x0={x0}) è a {result.x[0]:.2f}\n")
print(f"I massimi (locali) trovati da basinhopping sono: {[round(x, 2) for x in maxima]}")
$$ $$
['requested number of basinhopping iterations completed successfully']
Il massimo secondo basinhopping(x0=0) è a 18.00
I massimi (locali) trovati da basinhopping sono: [5.0, 5.0, 5.0, 5.0, 5.0, 18.0]
seed per replicare i risultatiIntroduzione all'ottimizzazione in Python