2013-02-18 24 views
5

Ho una funzione per ottimizzare, ad esempio Funzione, in Matlab. Questa funzione dipende dalle variabili (diciamo x) su cui voglio ottimizzare e da un parametro (ad esempio, Q) che non necessita di essere ottimizzato. Quindi, la funzione Funzione (x, Q). In altre parole, ho una matrice di valori per Q e voglio trovare valori x ottimali per ogni Q. Tuttavia, non riesco a trovare un modo come passare quei valori Q quando si utilizza l'handle di funzione @Function nella funzione di ottimizzazione.Passaggio di ulteriori argomenti tramite l'handle di funzione in Matlab

Quindi, la mia domanda è come passare quei valori Q quando si utilizza l'handle di funzione nelle funzioni di ottimizzazione, ad esempio fmincon (@ Function, x0, A, b)?

+1

Does 'fmincon (@ funzione, x0, Q, A , b) 'lavoro? –

+0

@DennisJaheruddin No, non funziona. Purtroppo. – Tomas

risposta

4

Provare a utilizzare la funzione anonima:

x = cell(1, numel(Q)); 
for qi = 1:numel(Q) 
    x{qi} = fmincon(@(x) Function(x, Q(qi)), A, b); 
end 
+1

Grazie, ha funzionato come un fascino! – Tomas

4

Come descritto nella documentazione MATLAB, ci sono in realtà 3 soluzioni per questo problema:

  1. funzioni anonime
    che è descritto nella Shai's answer di questo post.
  2. Funzioni nidificate:
    in questo approccio, la funzione esterna accetta tutti gli argomenti e la funzione interna accetta solo i parametri che l'ottimizzazione ha su di essi.
    questo è un esempio tratto da MATLAB documentazione: function [x,fval] = runnested(a,b,c,x0) [x,fval] = fminunc(@nestedfun,x0); % Nested function that computes the objective function function y = nestedfun(x) y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)x(2) +... (-c + cx(2)^2)*x(2)^2; end end
  3. variabili globali
    in questo approccio è necessario definire i parametri che sono necessari in funzione obiettivo come global in area di lavoro, e utilizzarli in funzione obiettivo con dichiarandoli come globale.
    qui è di nuovo un esempio da MATLAB documentazione:
    • Definizione funzione obiettivo: function y = globalfun(x) global a b c y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)x(2) + ... (-c + cx(2)^2)*x(2)^2; end
    • Optimization: global a b c; a = 4; b = 2.1; c = 4; % Assign parameter values x0 = [0.5,0.5]; [x,fval] = fminunc(@globalfun,x0)
Problemi correlati