weixin_48257667 2024-08-14 09:30 采纳率: 100%
浏览 13
已结题

燃机的MPC控制器代码问题

错误:未定义与 'struct' 类型的输入参数相对应的函数 'minus'。
Error in nmpcblock_interface.m (line 165)
throw(ME)
'test100load/Nonlinear MPC Controller/MPC/NLMPC' (line 24) 中出现错误
#代码

nx = 2;%状态
nu = 2;%输入
ny = 2;%输出
nlobj = nlmpc(nx, ny, nu);

%定义输入输出名称
nlobj.States(1).Name = 'speed';
nlobj.States(2).Name = 'temp';
nlobj.MV(1).Name = 'fuel';
nlobj.MV(1).Name = 'IGV';

% Set sample time, prediction horizon, and control horizon
Ts = 0.05;
p = 4;
nlobj.Ts = Ts;
nlobj.PredictionHorizon = p;
nlobj.ControlHorizon = 2;

%约束
nlobj.MV(1).Min = 2;
nlobj.MV(1).Max = 10;
nlobj.MV(2).Min = 0;
nlobj.MV(2).Max = 1;

% Set the weights and other parameters...权重
nlobj.Weights.ManipulatedVariables = [1 0;0 1]; % 输入权重
nlobj.Weights.ManipulatedVariablesRate = [0.1 0;0 0.1]; % 输入变化率权重
nlobj.Weights.OutputVariables = [10 0;0 10]; % 输出跟踪权重

%Specify the state function for the controller_模型状态方程
nlobj.Model.StateFcn = "gasmodel";
nlobj.Model.IsContinuousTime = true;

% Specify the output function for the controller._模型输出
nlobj.Model.OutputFcn = "gasmodel";

%Speficy optimization paremeters.
weights = [1; 1]; % 根据需要调整
nlobj.Optimization.CustomCostFcn =  "cost";
nlobj.Optimization.ReplaceStandardCost = false;

%nlobj.Optimization.CustomIneqConFcn = "IneqConFunction";
nlobj.Optimization.SolverOptions.MaxIter = 1000;
nlobj.Optimization.UseSuboptimalSolution = true;

x0 = [0;0];
u0 = [0;0]; 
validateFcns(nlobj,x0,u0);

% Open the Simulink model
mdl = 'test100load'; % Ensure this is the correct model name
open_system(mdl);

% Check that the nlobj exists in the base workspace
assignin('base', 'nlobj', nlobj);

function cost = cost(N, x, u, ref)
% N: 预测步数
% xopt: 预测的状态(状态包含 x1 和 x2)
% uopt: 预测的控制输入(控制输出 u1 和 u2)
% ref: 参考轨迹
% weights: 权重向量或矩阵

% 实现自定义成本的计算
cost = 0;
weights=[1; 0.1];
% 逐步计算与参考信号的偏差的加权平方和
for k = 1:N
stateError = x(:, k) - ref(:, k); % 状态偏差
inputError = u(:, k); % 输入偏差,假设期望输入为0
cost = cost + weights(1) * (stateError' * stateError) + weights(2) * (inputError' * inputError);
end
end

img

  • 写回答

21条回答 默认 最新

  • 专家-皆知 2024-08-14 09:30
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    从您提供的错误信息来看,问题出在minus函数与struct类型的输入参数不兼容。根据上下文,这可能是由于在某个地方尝试对结构体变量执行减法操作时发生了错误,但MATLAB的结构体并不直接支持减法运算。然而,从您提供的代码片段中并未直接显示出这一操作。不过,基于您的描述和代码,我们可以做一些分析和尝试性修正。

    首先,错误信息指向了nmpcblock_interface.m文件中的第165行以及test100load/Nonlinear MPC Controller/MPC/NLMPC路径下的某行代码,这表明问题可能源于Simulink模型内部或与之交互的部分,而非直接在您贴出的代码段内。

    考虑到您正在配置一个非线性模型预测控制器(NMPC),且自定义了成本函数cost,通常这类错误会发生在控制器内部的模型预测、状态更新或者优化求解过程中,特别是在处理状态误差计算时。

    分析及建议

    1. 检查模型内部逻辑:确保在Simulink模型中没有直接或间接地尝试对结构体进行减法操作。检查模型中所有调用的成本函数、约束函数等是否正确传递并处理了状态、输入、输出等变量。

    2. 状态误差计算:在您提供的cost函数中,有一行代码stateError = x(:, k) - ref(:, k);,这里尝试计算状态预测值与参考轨迹之间的差异。虽然这段代码在独立的函数中看似没有问题,但如果在模型内部调用时,xref不是预期的数值类型(比如其中一个变成了结构体),就可能导致上述错误。

    修正建议

    • 确认数据类型:在cost函数开头,添加类型检查来确认xref确实是双精度矩阵(或向量),可以加入如下代码:

      if ~isnumeric(x) || ~isnumeric(ref)
          error('Both x and ref must be numeric arrays.');
      end
      
    • 确保模型接口一致:确认Simulink模型与您的cost函数之间数据传递的接口正确无误。检查模型中所有与控制器交互的模块,确保它们正确地将状态、输入、输出和参考轨迹转换为适当的数值类型。

    • 模型验证:重新验证模型,确保所有自定义函数(如cost)被正确配置且与模型中的其他部分兼容。

    由于直接查看或修改nmpcblock_interface.m或其他Simulink模型内部文件超出我们当前环境的能力,建议您按照上述建议检查并调整您的模型和代码。如果问题仍然存在,可能需要进一步检查Simulink模型的具体配置,特别是与控制器交互的部分。

    结论

    请先尝试上述建议的检查和修正步骤,确保数据类型正确且模型与外部函数接口匹配。如果问题依然未解决,考虑检查模型内部是否有其他隐含的减法运算可能涉及到了结构体变量,并相应地调整代码或模型配置。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(20条)

报告相同问题?

问题事件

  • 系统已结题 8月24日
  • 已采纳回答 8月16日
  • 创建了问题 8月14日

悬赏问题

  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)
  • ¥15 【求职】怎么找到一个周围人素质都很高不会欺负他人,并且未来月薪能够达到一万以上(技术岗)的工作?希望可以收到写有具体,可靠,已经实践过了的路径的回答?
  • ¥15 Java+vue部署版本反编译
  • ¥100 对反编译和ai熟悉的开发者。
  • ¥15 带序列特征的多输出预测模型
  • ¥15 Python 如何安装 distutils模块
  • ¥15 关于#网络#的问题:网络是从楼上引一根网线下来,接了2台傻瓜交换机,也更换了ip还是不行
  • ¥15 资源泄露软件闪退怎么解决?