2016-11-21 327 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 

,我想盡量減少與功能fmincon函數$ F $是這樣的:

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. 

這個問題顯然是在我的目標函數中,但儘管嘗試了幾次,但我仍然無法正確寫入它。我在這裏看到了一些解決方案,但即使我的「閉包函數」只接受一個參數並且調用另一個參數,它的格式仍然不正確。

請問您能幫我解決嗎?

回答

1

你忘了在循環中編制ndofIN(你寫ndofIN^beta,應該是ndofIN(i)^beta)。

現在,MATLAB中的運算符^意味着matrix power。對於標量/標量輸入,此操作與正常的求冪相同,但對於矩陣/標量輸入,它不完全相同。在你的情況下,MATLAB試圖向向量ndofINbeta取冪 - 這是不允許的,因爲矩陣冪只能爲方陣定義。這就是你得到這個錯誤的原因。

很明顯,這不是你打算做的 - 你想要明智的指數(.^)。用這種方法,可以簡化並大大加快你的目標函數 - 只寫目標函數是這樣的:在你的原有功能

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 

所以你的目標函數不需要太多的論據。但是,這取決於你的口味。