2016-11-21 4 views
2

мне нужно свести к минимуму следующих функцийMATLAB - написание целевой функции для fmincon()

NdOF, nprocs и T взяты из первых двух столбцов этой таблицы

enter image description here

Итак, у меня есть следующие векторы в 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 

И я хотел, чтобы минимизировать функцию $ F $ с функцией fmincon так:

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]) 

код 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 

Проблема заключается в том, я получаю следующее сообщение об ошибке:

>> 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]) 
Error using^
Inputs must be a scalar and a square matrix. 
To compute elementwise POWER, use POWER (.^) instead. 

Error in objFunctionMatAssemble (line 4) 
     t = t + alpha*ndofIN^beta + gamma*((ndofIN(i)^delta)/nprocsIN(i) - vals(i))^2; 

Error in @(theta)objFunctionMatAssemble(theta(1),theta(2),theta(3),theta(4),ndofIN,nprocsIN,vals) 

Error in fmincon (line 535) 
     initVals.f = feval(funfcn{3},X,varargin{:}); 

Caused by: 
    Failure in initial objective function evaluation. FMINCON cannot continue. 

Проблема, по-видимому, в моей объективной функции, но я не могу ее правильно написать, несмотря на несколько попыток. Я видел некоторое решение здесь на SO, но даже если моя «функция закрытия» принимает только один аргумент и вызывает другой, все же его формат неверен.

Не могли бы вы помочь мне в этом?

ответ

1

Вы забыли указать ndofIN в цикле (вы пишете ndofIN^beta, который должен быть ndofIN(i)^beta).

Операционист ^ в MATLAB означает matrix power. Для скалярного/скалярного ввода эта операция такая же, как и нормальное экспоненцирование, но для матричных/скалярных входов это не совсем то же самое. В вашем случае MATLAB пытается повысить эффективность вектора ndofIN с beta - это недопустимо, так как мощность матрицы определяется только для квадратных матриц. Вот почему вы получаете эту ошибку.

Очевидно, что это не совсем то, что вы намереваетесь сделать - вы хотите, чтобы элемент был мудрым возвеличиванием (.^). Используя это, вы можете упростить и ускорить вашу целевую функцию чрезвычайно - просто написать эту целевую функцию, как это:

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

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

    t = t.' * t; 

end 

ПРИМЕЧАНИЕ в исходной функции есть и скобка несогласованность. То есть, ваша скобка сделать вашу целевую функцию что-то другое, чем то, что вы показали в этом вопросе:

% 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: Вы также можете написать целевую функцию, как это:

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 

так что вашей целевой функции не нужно столько аргументов. Но хорошо, это зависит от ваших вкусов.

Смежные вопросы