2016-11-21 7 views
2

私はnDOF、nprocsおよびTは、この表の最初の2列MATLAB - fminconのための目的関数を書く()

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 $を最小化したい:

:問題は、私は次のエラーを取得しています、です

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 

:objFunctionMatAssembleの

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

コード

>> 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つの引数しか取らずにもう1つを呼び出すとしても、その形式は正しくありません。

お願いします、よろしくお願いいたします。

答えて

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 

NOTEあなたの本来の機能では、括弧の矛盾もあります。 NB2

% 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; 

:それはあなたの括弧は、あなたの目的関数を作る、あなたが疑問に示したもの以外の何かであるあなたはまた、このようなあなたの目的関数を記述することができます。

ので
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 

をあなたの目的関数はそれほど多くの議論を必要としないということです。しかし、まあ、それはあなたの好みによって決まります。

関連する問題