How can I create a handle-function with a double summation on 201 variables (40401 terms)?

3 vues (au cours des 30 derniers jours)
Hello everyone!
I have to use Lagrangian multipliers with two linear constrains to minimize the function
where W represent all 201 variables that I want to determine, C are correlation coefficients between two vectors and sigma are standard deviations of the vectors (obviously I have 201 vectors).
To use Lagrangian multipliers, I use the function fmincon.
The problem is that I don't know how create the function .
I think the input function should be a handle-function (and fmincon works with a handle-function), but I don't know how create a so complicated handle funcion.
I used
W = sym('W',[1 201]);
to create my symbolic variables.
Then, I tried to use several methods to create , like
FUN=@(W) symsum(symsum(W('i')*W('j')*S('i','j')*std(L(:,'i'))*std(L(:,'j')), j, 1, 201), i, 1, 201);
When I try to minimize this FUN with fmincon, this error appears:
"Undefined function 'symsum' for input arguments of type 'double'."
Another very complex attempt consists of creating an ausiliar array in which write every term of summations,
FUNau =cell(201*201, 1);
nit=0;
for i=1:201
for j=1:201
nit=nit+1;
FUNau(nit,1) = (W(i)*W(j)*S(i,j)*std(L(:,i))*std(L(:,j)));
end
end
% high computation time
then I tried several methods to compute the right FUN, like
FUN =@(W) sum(FUNau);
or
FUN =@(W) symsum(FUNau);
but every attemp has failed when I used fmincon.
How can I create the function so that fmincon works?
Thanks.
  3 commentaires
Damonyr
Damonyr le 11 Juin 2019
Yes, I've just corrected and that was the point, but now, unfortunately, there is another error:
Error using fmincon (line 609)
Supplied objective function must return a scalar value.
I've already found it yesterday while I was making my attempts and I failed to solve it.
Do you have any idea how to solve it?
Damonyr
Damonyr le 11 Juin 2019
Ok, I solved it. Thank you so much.

Connectez-vous pour commenter.

Réponse acceptée

Torsten
Torsten le 11 Juin 2019
FUN = @(W) (W.*sigma).'*C*(W.*sigma)
  1 commentaire
Damonyr
Damonyr le 11 Juin 2019
Modifié(e) : Damonyr le 11 Juin 2019
Hi Torsten,
Thanks for the reply.
I tried your function, but when I use fmincon this error appears:
"Error using *
Inner matrix dimensions must agree.
Error in @(W)(W.*sigma).'*S*(W.*sigma)
Error in fmincon (line 536)
initVals.f = feval(funfcn{3},X,varargin{:});
Caused by:
Failure in initial objective function evaluation. FMINCON cannot continue."
I thought you forgot a dot after C, but the error persists.
For completeness I write the code for fmincon
lb=zeros(1,201);
ub=ones(1,201);
Aeq=ones(2, 201);
Aeq(2,:)=Gain(1,:);
beq=[1; 0.05];
w0=zeros(1,201);
options = optimoptions('fmincon','Display','off');
[x,fval,exitflag,output,lambda] = fmincon(FUN,w0,[],[],Aeq,beq,lb,ub,[],options);

Connectez-vous pour commenter.

Plus de réponses (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by