Unable to extract field 'build_problem' from 'mxArray'.
3 次查看(过去 30 天)
显示 更早的评论
coder.extrinsic("DeePC");
persistent deepc
if isempty(deepc)
deepc= DeePC(col_data,T_ini,horizon);
deepc = build_problem(deepc,...
LAMBDA_G_REGULARIZER, LAMBDA_Y_REGULARIZER, LAMBDA_U_REGULARIZER);
end
function result = build_problem(obj, ...
LAMBDA_G_REGULARIZER, LAMBDA_Y_REGULARIZER, LAMBDA_U_REGULARIZER)
result = obj.build_problem(LAMBDA_G_REGULARIZER, LAMBDA_Y_REGULARIZER, LAMBDA_U_REGULARIZER);
end
function obj = build_problem(obj,...
lambda_g,lambda_y,lambda_u,lambda_proj)
if nargin < 2, lambda_g = 0 ; end
if nargin < 3, lambda_y = 0 ; end
if nargin < 4, lambda_u = 0 ; end
if nargin < 5, lambda_proj = 0 ;end
% Assertions
if exist('build_loss', 'file') == 2
% nothing to do
else
disp('Loss function callback cannot be none');
end
assert(lambda_g >= 0 && lambda_y >= 0,'Regularizers must be non-negative');
assert(lambda_u >= 0,'Regularizer of u_ini must be non-negative');
assert(lambda_proj >= 0,'The projection regularizer must be non-negative');
obj.optimization_problem = []; % optimization problem is not build yet
%Build variables
%'full' indicates that the type of the variable is a full asymmetric matrix
u_ini = sdpvar(obj.M*obj.T_ini,1,'full'); % u_ini is the initial input
y_ini = sdpvar(obj.P*obj.T_ini,1,'full'); % y_ini is the initial output
u = sdpvar(obj.M*obj.horizon,1,'full');
y = sdpvar(obj.P*obj.horizon,1,'full');
g = sdpvar(obj.T-obj.T_ini-obj.horizon+1,1,'full');
slack_u = sdpvar(obj.T_ini*obj.P,1,'full');
slack_y = sdpvar(obj.T_ini*obj.M,1,'full');
U_p = obj.Up;
U_f = obj.Uf;
Y_p = obj.Yp;
Y_f = obj.Yf;
if lambda_proj > DeePC.SMALL_NUMBER
% Compute projection matrix (for the least square solution)
Zp = [U_p;Y_p;U_f];
ZpInv = pinv(Zp);
I = eye(obj.T-obj.T_ini-obj.horizon+1);
I_min_P = I-(ZpInv*Zp);
end
A = [U_p;Y_p;U_f;Y_f];
b = [u_ini+slack_u;y_ini+slack_y;u;y];
% Build constraints
constraints = [];
constraints = [constraints,A*g == b];
if isclose(lambda_y,0)
constraints = [constraints, norm(slack_y,2) <= DeePC.SMALL_NUMBER];
end
if isclose(lambda_u,0)
constraints = [constraints, norm(slack_u,2) <= DeePC.SMALL_NUMBER];
end
%Reshape u and y
%in order to calculate loss in all step k(1 to horizon)
u = reshape(u,[obj.horizon, obj.M]);
y = reshape(y,[obj.horizon, obj.P]);
if exist('build_constraints','file')==2
Constraints = build_constraints(u,y);
else
Constraints = [];
end
constraints = [constraints,Constraints];
% Build Loss
loss = build_loss(u,y);
if lambda_g > DeePC.SMALL_NUMBER
regulariers = lambda_g * norm(g,1); % add L1 norm of g
else
regulariers = 0;
end
if lambda_y > DeePC.SMALL_NUMBER
regulariers = regulariers + lambda_y*norm(slack_y,1);
end
if lambda_proj > DeePC.SMALL_NUMBER
% Add projection regularizer
regulariers = regulariers + lambda_proj*norm(I_min_P*g);
end
if lambda_u > DeePC.SMALL_NUMBER
% Add L1 norm of slack_u
regulariers = regulariers + lambda_u*norm(slack_u,1);
end
% Define the total loss
problem_loss = loss + regulariers;
% Define the optimization problem
obj.optimization_problem = OptimizationProblem(u_ini,y_ini,u,y,g,...
slack_u,slack_y,constraints,problem_loss);
end
0 个评论
回答(1 个)
Walter Roberson
2024-10-10
移动:Walter Roberson
2024-10-10
You are declaring the function build_problem twice in the same scope.
You cannot declare class-dependent methods inside a MATLAB Function Block.
deepc= DeePC(col_data,T_ini,horizon);
deepc = build_problem(deepc,...
LAMBDA_G_REGULARIZER, LAMBDA_Y_REGULARIZER, LAMBDA_U_REGULARIZER);
You appear to be changing the type of deepc, which is not something that can be done in a MATLAB Function Block.
4 个评论
Walter Roberson
2024-10-11
You still have the problem that you are declaring the function build_problem twice.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Execution Speed 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!