2017-01-23 1 views
0

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 
+0

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

+0

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

Répondre

0

C'est un bug dans la dernière version de YALMIP.