2017-01-23 117 views
0

結束語: Matlab會拋出下面的錯誤,這對我來說不明顯是什麼根源。問題似乎存在於輸入參數中,但我無法弄清楚它到底是什麼。我非常感謝任何幫助找到它。MATLAB Yalmip:無法運行優化器;消除變量中的錯誤

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

背景: 我試圖編程模型預測控制,但我不是很熟悉卻又有兩種Yalmip或數學優化算法。我已經確定定義的輸入和實際輸入具有相同的尺寸,因此我很驚訝該錯誤與矩陣尺寸有關。

錯誤來源於我的代碼調用優化器時。 我的代碼是基於:https://yalmip.github.io/example/standardmpc/

這裏是我的代碼(代碼的第一部分只需要定義優化問題,並標有「%%%%%」之間;接近尾聲時出現錯誤) :

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

你在'[solutions,diagnostics] = controller {inputs};'string中得到了這個錯誤,所以它有錯誤的輸入參數。我無法找到並解決你的錯誤,因爲在你的問題中沒有這個代碼。請更改您的問題:刪除多餘的代碼並添加有用的信息。看到這裏[問] –

+0

你的語法已經脫離了鏈接文檔。使用大括號('{}')告訴MATLAB你想像單元陣列一樣索引'controller'。這是一個對象,所以你需要使用括號('()')。 – excaza

回答

0

這是最新版本的YALMIP中的一個錯誤。