why validateFcns is not working in my nlmpc Code?

11 次查看(过去 30 天)
For your convinence i have attached the requird files that will save the copy paste time
% Parameters of SIRC model
n1=nlmpc(4,4,1);
Zero weights are applied to one or more OVs because there are fewer MVs than OVs.
n1.PredictionHorizon=100;
n1.ControlHorizon=10;
n1.Ts=1;
n1.Model.StateFcn="sircstatefcn";
n1.Model.OutputFcn="sircoutput";
S0 = 0.1; % Initial susceptible population
I0 = 0.3; % Initial infected population
R0 = 0.5; % Initial recovered population
C0 = 0.1;
x0 = [S0, I0, R0, C0]; % Initial conditions
u0=0.2;
validateFcns(n1,x0,u0)
Error using nlmpc/validateFcns
Function sircstatefcn does not exist.
function dx = sircstatefcn(x,u,p)
p.mu = 0.015;
p.alpha = 100;
p.delta = 0.625;
p.gamma = 0.30;
p.sigma= 0.1;
p.beta0 = 0.5;
fx=zeros(4,1);
fx(1)=p.mu*(1-x(1)) + p.gamma*x(4);
fx(2)= -(p.mu + p.alpha)*x(2);
fx(3)=p.alpha*x(2) - (p.mu + p.delta)*x(3);
fx(4)=p.delta*x(3) - (p.mu + p.gamma)*x(4);
gx=zeros(4,1);
gx(1)=-x(2)*x(1);
gx(2)=x(2)*x(1) + p.sigma*x(4)*x(2);
gx(3)=(1-p.sigma)*x(2)*x(4);
gx(4)=-x(4)*x(2);
dx=fx+gx*u;
%original state space model
% dx = [ p.mu*(1-x(1)) - u(1)*x(2)*x(1) + p.gamma*x(4);
% u(1)*x(2)*x(1) + p.sigma*u(1)*x(4)*x(2) - (p.mu + p.alpha)*x(2);
% (1-p.sigma)*u(1)*x(2)*x(4) + p.alpha*x(2) - (p.mu + p.delta)*x(3);
% p.delta*x(3) - u(1)*x(4)*x(2) - (p.mu + p.gamma)*x(4)];
dx=dx';
end
function y= sircoutput(x,u)
y(1)=x(1);
y(2)=x(2);
y(3)=x(3);
y(4)=x(4);
y=y';
end
Please copy both function and make seperate code files for them and then make seperate file for nlmpc evaluation and then execute the code.You will see the required error i was gettin which is ---------------------------------------------------
Error using nlmpc/validateFcns
Expecting 2 input arguments but "Model.StateFcn" appears to take 3 inputs.
Error in nmpcseir (line 15)
validateFcns(n1,x0,u0)

采纳的回答

Walter Roberson
Walter Roberson 2024-1-29
The problem is that when you specify a character vector for the function, then the function cannot be a local function (must have it's own .m file)
But you have another problem:
% Parameters of SIRC model
n1=nlmpc(4,4,1);
Zero weights are applied to one or more OVs because there are fewer MVs than OVs.
n1.PredictionHorizon=100;
n1.ControlHorizon=10;
n1.Ts=1;
n1.Model.StateFcn=@sircstatefcn;
n1.Model.OutputFcn=@sircoutput;
S0 = 0.1; % Initial susceptible population
I0 = 0.3; % Initial infected population
R0 = 0.5; % Initial recovered population
C0 = 0.1;
x0 = [S0, I0, R0, C0]; % Initial conditions
u0=0.2;
validateFcns(n1,x0,u0)
Error using nlmpc/validateFcns
Expecting 2 input arguments but "Model.StateFcn" appears to take 3 inputs.
function dx = sircstatefcn(x,u,p)
p.mu = 0.015;
p.alpha = 100;
p.delta = 0.625;
p.gamma = 0.30;
p.sigma= 0.1;
p.beta0 = 0.5;
fx=zeros(4,1);
fx(1)=p.mu*(1-x(1)) + p.gamma*x(4);
fx(2)= -(p.mu + p.alpha)*x(2);
fx(3)=p.alpha*x(2) - (p.mu + p.delta)*x(3);
fx(4)=p.delta*x(3) - (p.mu + p.gamma)*x(4);
gx=zeros(4,1);
gx(1)=-x(2)*x(1);
gx(2)=x(2)*x(1) + p.sigma*x(4)*x(2);
gx(3)=(1-p.sigma)*x(2)*x(4);
gx(4)=-x(4)*x(2);
dx=fx+gx*u;
%original state space model
% dx = [ p.mu*(1-x(1)) - u(1)*x(2)*x(1) + p.gamma*x(4);
% u(1)*x(2)*x(1) + p.sigma*u(1)*x(4)*x(2) - (p.mu + p.alpha)*x(2);
% (1-p.sigma)*u(1)*x(2)*x(4) + p.alpha*x(2) - (p.mu + p.delta)*x(3);
% p.delta*x(3) - u(1)*x(4)*x(2) - (p.mu + p.gamma)*x(4)];
dx=dx';
end
function y= sircoutput(x,u)
y(1)=x(1);
y(2)=x(2);
y(3)=x(3);
y(4)=x(4);
y=y';
end
  3 个评论
Walter Roberson
Walter Roberson 2024-1-29
When I download the files, I get the same issue
Expecting 2 input arguments but "Model.StateFcn" appears to take 3 inputs.
You declare p as being in input parameter but you never use any property of p that you do not assign to. I suggest that you remove p as being an input parameter,
function dx = sircstatefcn(x,u)
AMAN
AMAN 2024-2-2
编辑:AMAN 2024-2-2
yes not declaingring p in function works thank you

请先登录,再进行评论。

更多回答(0 个)

产品


版本

R2023b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by