Bottomline: Matlab jette les erreurs ci-dessous et ce n'est pas évident pour moi quelle est la cause. Le problème semble résider dans les arguments d'entrée, mais je ne peux pas comprendre exactement ce que c'est. J'apprécierais grandement toute aide pour le trouver.MATLAB Yalmip: impossible d'exécuter l'optimiseur; erreur dans eliminervariables
Index exceeds matrix dimensions.
Error in eliminatevariables (line 42)
aux(model.precalc.index2) = value(model.precalc.jj2);
Error in optimizer/subsref (line 276)
[self.model,keptvariablesIndex] =
eliminatevariables(self.model,self.model.parameterIndex,thisData(:),self.model.parameterIndex);
Error in SCMv0_justrun (line 68)
[solutions,diagnostics] = controller{inputs};
Contexte: Je suis en train de programmer un modèle de contrôle prédictif mais je ne suis pas encore très familier avec soit Yalmip ou des algorithmes d'optimisation mathématique. Je me suis assuré que les entrées définies et les entrées réelles ont les mêmes dimensions, par conséquent pourquoi je suis surpris que l'erreur a à voir avec les dimensions de la matrice.
L'erreur provient de lorsque mon code appelle l'optimiseur. Mon code est basé sur: https://yalmip.github.io/example/standardmpc/
Voici mon code (la première partie du code est seulement nécessaire pour définir le problème d'optimisation et est marquée entre "%%%%%", l'erreur se produit vers la fin) :
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
yalmip('clear')
clear all
% Model data
A = eye(3);
B = [1 0 -1 0 0 0 0; 0 1 0 -1 0 0 0; 0 0 0 0 1 -1 -1];
nx = 3; % Number of states
nu = 7; % Number of inputs
% MPC data
Q = [10 10 20]';
R = [10 10 1 1 5 3 3]';
C = [50 0; 0 30];
N = 90;
ny = 2;
E = [0 0 0 0 0 1 0; 0 0 0 0 0 0 1];
u = sdpvar(repmat(nu,1,N),repmat(1,1,N));
x = sdpvar(repmat(nx,1,N+1),repmat(1,1,N+1));
r = sdpvar(repmat(ny,1,N+1),repmat(1,1,N+1));
d = sdpvar(ny,1);
pastu = sdpvar(nu,1);
dx = 0.05;
Gx=[-1*eye(3);eye(3)];
gx = [0 0 0 500 500 1000]';
COVd = [zeros(5,7);0 0 0 0 0 10 0; 0 0 0 0 0 0 10];
COVx = zeros(nx,nx);
auxa = eye(5);
auxb = zeros(5,2);
Gu = [-1*eye(7,7); auxa auxb;0 0 0 0 0 1 1];
gu = [zeros(7,1); 200; 200; 50; 50; 100; 500];
Ga = [0 0 0.5 0.5 -1 0 0];
constraints = [];
objective = 0;
for k = 1:N
r{k} = r{k} + d;
objective = objective + Q'*x{k} + R'*u{k} + (r{k}-E*u{k})'*C*(r{k}-E*u{k});
constraints = [constraints, x{k+1} == A*x{k}+B*u{k}];
COVx = A*COVx*A' + B*COVd*B';
COVGx = Gx*COVx*Gx';
StDevGx = sqrt(diag(COVGx));
chance = gx - norminv(1-dx/(length (gx)*N))*StDevGx;
constraints = [constraints, Ga*u{k}==0, Gu*u{k}<=gu, Gx*x{k}<=gx-chance];
end
objective = objective + Q'*x{N+1};
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
parameters_in = {x{1},[r{:}],d,pastu};
solutions_out = {[u{:}], [x{:}]};
controller = optimizer(constraints, objective,[],parameters_in,solutions_out);
x = 100*ones(nx,1);
clf;
disturbance = randn(ny,1)*10;
oldu = zeros(nu,1);
hold on
for i = 1:150
future_r = [4*sin((i:i+N)/40);3*sin((i:i+N)/20)];% match dimensions of r
inputs = {x,future_r,disturbance,oldu};
[solutions,diagnostics] = controller{inputs};
U = solutions{1};oldu = U(1);
X = solutions{2};
if diagnostics == 1
error('The problem is infeasible');
end
x = A*x+B*u;
end
Vous avez cette erreur dans la chaîne '[solutions, diagnostics] = controller {inputs};', donc il a un mauvais argument d'entrée. Je ne peux pas trouver et corriger votre erreur, car il n'y a pas ce code dans votre question. Veuillez reformuler votre question: supprimez l'excès de code et ajoutez des informations utiles. Voir ici [ask] –
Votre syntaxe a divergé de la documentation liée. L'utilisation d'accolades ('{}') indique à MATLAB que vous voulez indexer 'controller' comme un tableau de cellules. C'est un objet, vous devez donc utiliser des parenthèses ('()'). – excaza