Why mpc function and mpc loop isn't same?
1 visualizzazione (ultimi 30 giorni)
Mostra commenti meno recenti
This is my mpc code, and it works well,
% Given state-space model
% function [out1, out2] = mpcmove_test(in1,in2)
%
% r = in1;
% y = in2;
num=[1 1];
den=[1 1 2];
[A,B,C,D] = tf2ss(num,den);
sys = ss(A,B,C,D);
Ts = 0.05;
p = 10;
m = 10;
r = 1;
y = 0;
mpc_contrller = mpc(sys,Ts,p,m);
state = mpcstate(mpc_contrller);
for i = 1:100
[u] = mpcmove(mpc_contrller,state,y,r);
y = C*state.plant;
out1 = u;
out2 = y;
y_p(i,1) = y;
end
plot(y_p)
but when i run this code like fuction. It works different. It can't follow reference value.
function [out1, out2] = mpcmove_test(in1,in2)
r = in1;
y = in2;
num=[1 1];
den=[1 1 2];
[A,B,C,D] = tf2ss(num,den);
sys = ss(A,B,C,D);
Ts = 0.05;
p = 10;
m = 10;
% r = 1;
% y = 0;
mpc_contrller = mpc(sys,Ts,p,m);
state = mpcstate(mpc_contrller);
% for i = 1:100
[u] = mpcmove(mpc_contrller,state,y,r);
y = C*state.plant;
out1 = u;
out2 = y;
% y_p(i,1) = y;
% end
% plot(y_p)
end
in2 = 0;
in1 = 1;
for j = 1:100
[out1, out2] = mpcmove_test(in1,in2);
in2 = out2;
y_p(j,1) = out2;
end
plot(y_p)
I don't know why this works different?
0 Commenti
Risposta accettata
Shushant
il 1 Ago 2023
I understand that when you try to execute two identical pieces of code, one using a regular loop and the other utilizing a function but there is disparity in outputs. The difference in outputs is due to the function "mpcmove".
The second argument "state" which is being passed to the function "mpcmove" gets updated every time the function is called. Refer to the following documentation for a detailed information-
While using the normal loop "state" gets updated after each iteration and we get the correct output. But in the implementation of the function, every time the function gets called the "state" gets reinitialized which result in different output.
As a workaround to this you can initialize the state before calling the function. Below is the code snippet for the same
in2 = 0;
in1 = 1;
% initializing the controller and state before calling the function
num=[1 1];
den=[1 1 2];
[A,B,C,D] = tf2ss(num,den);
sys = ss(A,B,C,D);
Ts = 0.05;
p = 10;
m = 10;
mpc_contrller = mpc(sys,Ts,p,m);
state = mpcstate(mpc_contrller);
for j = 1:100
% Also passing the controller and state to the function
[out1, out2] = mpcmove_test(in1,in2, mpc_contrller, state, C);
in2 = out2;
y_p(j,1) = out2;
end
plot(y_p)
function [out1, out2] = mpcmove_test(in1, in2, mpc_contrller, state, C)
r = in1;
y = in2;
[u] = mpcmove(mpc_contrller,state,y,r);
y = C*state.plant;
out1 = u;
out2 = y;
end
I hope this clarifies the doubts you may have had.
Thank you,
Shushant
0 Commenti
Più risposte (0)
Vedere anche
Categorie
Scopri di più su Model Predictive Control Toolbox in Help Center e File Exchange
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!