2016-11-21 2 views
2

Ich brauche folgende Funktion aus den ersten beiden Spalten dieser TabelleMATLAB - Schreiben Zielfunktion für fmincon()

nDOF, nprocs und T

enter image description here

genommen zu minimieren

So habe ich folgende Vektoren in MATLAB

nDOF = 
     3993 
     3993 
     3993 
     3993 
     3993 
     3993 
     3993 
     3993 
     7623 
     7623 
     7623 
     7623 
     7623 
     7623 
     7623 
     7623 

nprocs = 
    1 
    2 
    3 
    4 
    6 
    8 
    12 
    24 
    1 
    2 
    3 
    4 
    6 
    8 
    12 
    24 

vals = 
    0.6564 
    0.2569 
    0.2719 
    0.1743 
    0.1305 
    0.1230 
    0.1739 
    0.1147 
    1.1998 
    0.5088 
    0.6419 
    0.2899 
    0.2192 
    0.2033 
    0.2126 
    0.1821 

Und ich wollte die Funktion $ F $ mit Funktion fmincon wie folgt minimieren:

fmincon(@(theta) objFunctionMatAssemble(theta(1), theta(2), theta(3), theta(4), ndofIN, nprocsIN, vals), [0 0 0 0]', [], [], [], [], [0 0 0 0], [+inf +inf +inf +inf]) 

Code of objFunctionMatAssemble:

function [t] = objFunctionMatAssemble(alpha, beta, gamma, delta, ndofIN, nprocsIN, vals) 
    t = 0; 
    for i=1:length(nprocsIN) 
     t = t + alpha*ndofIN^beta + gamma*((ndofIN(i)^delta)/nprocsIN(i) - vals(i))^2; 
    end 
end 

Das Problem ist, ich bin immer folgende Fehlermeldung:

Das Problem liegt anscheinend in meiner objektiven Funktion, aber ich kann es trotz mehrmaligem Versuch nicht richtig schreiben. Ich habe hier auf SO eine Lösung gesehen, aber selbst wenn meine "closure function" nur ein Argument braucht und das andere aufruft, ist das Format trotzdem nicht korrekt.

Könnten Sie mir bitte helfen?

Antwort

1

Sie haben vergessen, Index ndofIN in der Schleife (Sie schreiben ndofIN^beta, die ndofIN(i)^beta sein sollte).

Der Operator ^ in MATLAB bedeutet matrix power. Für skalare/skalare Eingaben ist diese Operation die gleiche wie die normale Potenzierung, aber für Matrix/Skalar-Eingaben ist sie nicht ganz die gleiche. In Ihrem Fall versucht MATLAB den VektorndofIN mit beta zu potenzieren - dies ist nicht erlaubt, da die Matrixleistung nur für quadratische Matrizen definiert ist. Deshalb bekommst du diesen Fehler.

Offensichtlich ist dies nicht ganz, was Sie vorhaben - Sie wollen elementweise Exponentiation (.^). Mit diesem können Sie vereinfachen und beschleunigen Ihre Zielfunktion enorm hoch - schreiben Sie einfach, dass die Zielfunktion wie folgt aus:

function t = objFunctionMatAssemble(alpha, ... 
            beta, ... 
            gamma, ... 
            delta, ... 
            ndofIN, ... 
            nprocsIN, ... 
            vals) 

    t = alpha * ndofIN.^beta + ... 
     gamma * (ndofIN.^delta)./nprocsIN - vals; 

    t = t.' * t; 

end 

HINWEIS in Ihrer ursprünglichen Funktion auch eine Klammer Inkonsistenz ist. Das heißt, Ihre Klammer machen Ihre Zielfunktion etwas anderes als das, was man in der Frage gezeigt haben:

% your version 
t = t + alpha*ndofIN^beta + gamma*((ndofIN(i)^delta)/nprocsIN(i) - vals(i))^2; 

% what's in the image 
t = t + (alpha*ndofIN^beta + gamma* (ndofIN(i)^delta)/nprocsIN(i) - vals(i))^2; 

NB2: Sie können auch Ihre Zielfunktion wie folgt schreiben:

function t = objFunctionMatAssemble2(theta, ... 
            ndofIN, ... 
            nprocsIN, ... 
            TIN)          

    N = bsxfun(@power, ndofIN, theta([2 4]).');   
    t = [N(:,1) N(:,2)./nprocsIN] * theta([1 3]) - TIN;   
    t = t.' * t; 

end 

so dass Ihre Zielfunktion nicht so viele Argumente benötigt. Aber gut, das hängt von deinem Geschmack ab.

Verwandte Themen