Newsgroup: it.istruzione.universita.ingegneria
Titolo: Minimizzazione di funzioni

ciao a tutti,
sarei interessato a trovare un algoritmo per minimizzare una funzione di più
variabili. Lo dovrò poi implementare in C++, qualcuno sa darmi una dritta?
ciao Peppe

 voglio trovare ad esempio i valori di X,Y,Z che minimizzino la f().
Allora, per la parte matematica ti suggerisco di rivederti la teoria
dei Moltiplicatori di Lagrange -> ti indico come riferimento :
- "Analisi Matematica con elementi di analisi funzionale - 2"
- Autore : Luigi Amerio
- Massimi e minimi vincolati : Metodo dei Moltiplicatori di Lagrange
-> Il metodo dei Moltiplicatori di Lagrange puo' essere utilizzato 
per il calcolo dei massimi/minimi di frontiera -> massimo/minimo
assoluti per una funzione di n variabili indipendenti :
z = f(x1,x2,...,xn)
Supponi che f sia una funzione continua e con le derivate prime continue
definita su A, dove A e' un campo di uno spazio X a n dimensioni. 
Considera quindi un dominio limitato contenuto in A, la cui frontiera
FD sia rappresentata da un'equazione del tipo :
p(x1,x2,...,xn) = 0 [p funzione continua/derivate prime continue su A]
Con il metodo di Lagrange puoi trovare i punti NON singolari di FD che
siano per f di massimo o minimo relativo vincolato.
Dato che FD e' un insieme chiuso/limitato, in base al teorema di
Weierstrass puoi trovare i massimo/minimo assoluti di f(x1,x2,...,xn).
E' sufficiente calcolare la funzione f nei punti di stazionarieta' NON
singolari, ottenuti risolvendo il sistema :
fxj(x1,...,xn) + Lpxj(x1,...,xn) = 0 [j = 1,...,n]
                    p(x1,...,xn) = 0
[fxj = derivata parziale di f rispetto a xj]
[L   = moltiplicatore di Lagrange          ]
[pxj = derivata parziale di p rispetto a xj]
Inoltre la funzione f va calcolata anche nei punti singolari di FD.
-> Il massimo e il minimo dei valori ottenuti per f danno quindi
rispettivamente il massimo e il minimo assoluti di f su FD.
-> Per avere il massimo e il minimo assoluti di f su tutto D occorre
tener conto dei valori che la funzione f assume nei punti di 
stazionarieta' liberi, corrispondenti alle radici interne a D del 
sistema :
fxj(x1,...,xn) = 0  [j = 1,...,n]
Per quanto riguarda la parte di programma, una volta compresa la parte
matematica che sta dietro, NON vi sono grossi problemi. Infatti e'
importante definire una funzione che esegua correttamente le derivate
parziali -> un possibile approccio in via numerica e' quello di 
utilizzare il metodo delle differenze finite.
Ti allego un esempio di codice di tale funzione realizzata con Matlab e
che NON dovresti aver problemi a riscrivere in C :
######################################################################
function ydif=derivo2(y,h)
% ydif=derivo2(y,h)
% +----------------------------------------------------+
% + Questa funzione esegue la derivata prima prendendo +  
% + come dati il vettore delle Y = f(X) e l'intervallo +
% + h tra i valori del vettore X (h=cost)              +
% +----------------------------------------------------+
% Uso le differenze centrali per i punti interni
y=y(:);
n=length(y);
ydif=( y(3:n)-y(1:n-2) )/2;
% Uso le differenze avanti e indietro per i punti alla fine 
ydif=[(-3*y(1)+4*y(2)-y(3))/2; ydif;
      (y(n-2)-4*y(n-1)+3*y(n))/2];
% Se non inserisco h, il valore di default e' 1
if nargin ==2, ydif=ydif/h; end
#######################################################################
--
|Ż \/Ż | /Ż\ /Ż__/Ż__||> 
http://planynet.hypermart.net
 ŻŻŻŻŻ<|
|Ż|\/|Ż|/Ż_Ż\|(__\__ \|> 
http://pub44.ezboard.com/bplanynet
 <|
|_|  |_/_/ \_\___|___/|> NEWS: free.it.tlc.provider.fastweb <| 
|>Togli/Remove NOSPAM<|>_____ engineering && computers _____<|

 variabili. Lo dovrò poi implementare in C++, qualcuno sa darmi una dritta?
Prova e vedere al GAMS:
http://gams.nist.gov/
(
http://gams.nist.gov/serve.cgi/Class//
)
Probabilmente lo trovi in fortran ma portarlo in C++ non dovrebbe essere
troppo difficile.
Ciao