Let $S_m = (x_1, x_2, \dots , x_m)$ be the $m$-tuple of positive real numbers with $x_1 + x_2 + \cdots + x_m = m$ for which $P_m = x_1 \cdot x_2^2 \cdot \cdots \cdot x_m^m$ is maximised.
For example, it can be verified that $\lfloor P_{10}\rfloor = 4112$ ($\lfloor \, \rfloor$ is the integer part function).
Come sempre, per approcciare un problema complicato, possiamo partire in piccolo e osservare cosa accade in casi più semplici; quindi qui per esempio analizzando i casi m=2 e m=3. Giusto perché è carino, e perché Julia permette di farlo molto facilmente, possiamo anche raccontare graficamente questa prima esplorazione.
println("Max value ($(maximum(vals))) reached at $max_idx, ie for")
println("x1 = ", x1_max)
println("x2 = ", x2_max)
println("x3 = ", 3-x1_max-x2_max)
Max value (1.6873721655472487) reached at CartesianIndex(34, 67), ie for
x1 = 0.49748743718592964
x2 = 0.9949748743718593
x3 = 1.507537688442211
vera soluzione:
3-element Vector{Float64}:
0.5
1.0
1.5
Questo approccio, come detto, può servire per ambientarci nel problema, e sarebbe ad esempio utile se potessimo già da questi esempi derivare o intuire un qualche pattern rilevante. Tuttavia, non sembra molto il caso dai numeri derivati qui sopra, quindi possiamo passare direttamente alla trattazione matematica e rigorosa del problema.
L'idea è che stiamo affrontando un problema di ottimizzazione per una funzione multivariata f(x):Rn→R, soggetta al vincolo g(x)=0, dove anche g(x):Rn→R: un contesto che sembra proprio chiamare in causa i moltiplicatori di Lagrange! Quando ci ho pensato non volevo crederci, e soprattutto non volevo rimestare nel torbido per recuperare i miei appunti di Analisi 2. A malincuore ho dovuto però farlo, e in effetti con quelli si arriva tranquillamente (e anche molto velocemente) alla soluzione.
I moltiplicatori di Lagrange permettono infatti di convertire un problema di ottimizzazione (inteso come ricerca di punti di massimo/minimo) di una funzione f soggetta a un vincolo[1]g in un altro problema di ottimizzazione, stavolta libero, quindi non soggetto a vincoli, di un'altra funzione L, al costo di aggiungere una variabile λ. Questa nuova funzione sarebbe
L(x,λ)=f(x)+λg(x)
i cui punti di massimo/minimo sono ora molto facili da individuare: basta infatti usare il classico metodo dell'imporre la "derivata uguale a zero", che in questo contesto multivariato si traduce nel chiedere che il gradiente della funzione sia uguale a zero, ovvero ∇L(x,λ)=0, per trovare i candidati punti di massimo/minimo. Questa richiesta, vista la definizione di L, equivale in realtà a
Questo metodo permette anche di gestire più vincoli ovviamente, e in tal caso si introdurrebbe una nuova variabile per vincolo, ma per non appesantire la spiegazione mi sono concentrato sul caso del problema dove c'è un vincolo solo.
Nel nostro caso, il problema è maxf(x)=i=1∏mxiis.t.g(x)=i=1∑mxi−m=0
(s.t. sta per "subject to", cioè "soggetto al vincolo") Però, pensando di dover derivare f per calcolare ∇f(x), questa formulazione non sembra molto comoda, dato che derivando rispetto ad xi rimarrebbe comunque un termine che comprende tutte le altre variabili xj. Un'idea è quindi di riformulare il problema applicando a f un logaritmo: dopotutto, massimizzare f(x) è equivalente a massimizzare lnf(x), dato che il logaritmo è una funzione crescente. Passando quindi a trattare il problema