Newsgroup: it.discussioni.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

 Che cosa significa minimizzare una funzione di più variabili?
Forse intende una funzione booleana.
--
Blind Guardian a.k.a. capitano
Infortunatosi in una eroica azione difensiva
Dal 12/11/2000 in cerca di un nuovo tendine dell' adduttore
Per offerte scrivere a 
master.o...@inwind.it
 (astenersi A.C. Milan)

 Forse intende una funzione booleana.
Io credo che sia,dato un campo di esistenza per ciascuna variabile,il
trovare il valore delle stesse per la quale la funzione assume il valore
minimo.

 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 _____<|

Prova a dare uno sguardo al sito 
www.nag.com


 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