Matlabの最適化ツールボックスのガイドを読んでいます。 1-15ページでは、インデックス作成用の変数を作成するためのコードが提供されています。ここにコードです:matlabでインデックスを作成する変数を作成する
%Combine variables into one vector
variables = {'I1','I2','HE1','HE2','LE1','LE2','C','BF1',...
'BF2','HPS','MPS','LPS','P1','P2','PP','EP'};
N = length(variables);
% create variables for indexing
for v = 1:N
eval([variables{v},' = ',num2str(v),';']); %?
end
私は "変数"のクラスがセル配列であることを知っています。しかし、私は "eval"の機能をはっきりと理解することはできません。次のコードを読むには、要素のインデックスを変数に作成して、要素を行列やベクトルの操作に使用するインデックス番号として使用できるようにします。例えば:
lb = zeros(size(variables));
lb([P1,P2,MPS,LPS]) = [2500,3000,271536,100623];
私はヘルプ文書を読んだが、それでもそれを得ることはできません。だから誰でも私のことをもっとはっきりと説明することができます。
ところで、ユーザーズガイドはこの「eval」機能を避けることを提案しています。したがって、上記の機能を達成するための他の方法がありますか?すべての
完全なプログラム
% Combine variables into one vector
variables = {'I1','I2','HE1','HE2','LE1','LE2','C','BF1',...
'BF2','HPS','MPS','LPS','P1','P2','PP','EP'};
N = length(variables);
% create variables for indexing
for v = 1:N
eval([variables{v},' = ',num2str(v),';']); %?
end
% Write bound constraints
lb = zeros(size(variables));
lb([P1,P2,MPS,LPS]) = ...
[2500,3000,271536,100623];
ub = Inf(size(variables));
ub([P1,P2,I1,I2,C,LE2]) = ...
[6250,9000,192000,244000,62000,142000];
% Write linear inequality constraints
A = zeros(3,N);
A(1,I1) = 1; A(1,HE1) = -1; b(1) = 132000;
A(2,EP) = -1; A(2,PP) = -1; b(2) = -12000;
A(3,[P1,P2,PP]) = [-1,-1,-1]; b(3) = -24550;
% Write linear equality constraints
Aeq = zeros(8,N); beq = zeros(8,1);
Aeq(1,[LE2,HE2,I2]) = [1,1,-1];
Aeq(2,[LE1,LE2,BF2,LPS]) = [1,1,1,-1];
Aeq(3,[I1,I2,BF1,HPS]) = [1,1,1,-1];
Aeq(4,[C,MPS,LPS,HPS]) = [1,1,1,-1];
Aeq(5,[LE1,HE1,C,I1]) = [1,1,1,-1];
Aeq(6,[HE1,HE2,BF1,BF2,MPS]) = [1,1,1,-1,-1];
Aeq(7,[HE1,LE1,C,P1,I1]) = [1267.8,1251.4,192,3413,-1359.8];
Aeq(8,[HE2,LE2,P2,I2]) = [1267.8,1251.4,3413,-1359.8];
% Write the objectvie
f = zeros(size(variables));
f([HPS PP EP]) = [0.002614 0.0239 0.009825];
% Solve the problem
%print out the results in floating-point fromat in a field 12 characters
%wide, including 2 digits after the decimal point for first data
[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub);
for d = 1:N
fprintf('%12.2f \t %s \n',x(d),variables{d});
end
fval
疑問に思っている人のために、これは*公式のドキュメントにあります(https://www.mathworks.com/help/optim/ug/example-linear-programming.html#bsmt5lz)。 – excaza
はい、そうです。たぶん私は明らかに自分自身を表現していないかもしれません。別の言い方をすれば、 "eval"はセル配列内の要素に値を代入することです。それは正しい?もしそうなら、同じことをする他の方法はありますか? –
@ Rolf_Zhangあなたがここにぶら下がってあなたを残して申し訳ありません:私たちのいくつかはあなたの質問を議論し、公式のドキュメントに存在するこの恐ろしい怪物によって引き起こされたショックに気を散らしました:) –