You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab灰箱辨识工具箱idnlgrey对象无法输出阶跃响应问题求助

Matlab灰箱模型step无响应问题修复方案

核心错误点

  • 参数传递不匹配:你创建idnlgrey对象时传入了3个自定义参数(a、b、c),但你的boat_cODE函数只声明了2个自定义参数接收位(m、d),参数数量对不上导致函数运行报错。
  • 变量未定义:ODE函数中使用的L变量没有任何赋值逻辑,你给第三个参数c赋值为100,推测该参数就是你要用到的长度L,没有正确传入会直接触发运行错误。
  • 可选优化:非线性模型调用step函数时,建议明确指定仿真时间范围,避免默认配置不符合模型特性导致输出无明显变化。

修改后的完整代码

clear all; close all; clc;

ParName = {'a'; ... %3x3质量矩阵
    'b'; ... %3x3阻尼矩阵
    'c' ... %1x1船长参数
    };
ParUnit = {'kg'; 'kg/s'; 'm'};
ParValue = {diag([2652.25; 2825.29; 4201.26]); ...
    diag([848.05; 10161.62; 22719.39]); ...
    100};

FileName = 'boat_c';
Order = [3 2 3];
Parameters = struct('Name', ParName, 'Unit', ParUnit, 'Value', ParValue, 'Minimum', 0, 'Maximum', Inf, 'Fixed', false);
Ts = 0;
InitialStates = struct('Name', {'r'; 's'; 't'}, 'Unit', {'m/s'; 'm/s'; '1/s'}, ...
    'Value', [0; 0; 0], 'Minimum', -Inf, 'Maximum', Inf, 'Fixed', true);
nlgr = idnlgrey(FileName, Order, Parameters, InitialStates, Ts, 'Name', 'Boot', ...
    'InputName', {'x'; 'y'}, 'InputUnit', {'N'; 'rad'}, ...
    'OutputName', {'r'; 's'; 't'}, 'OutputUnit', {'m/s'; 'm/s'; '1/s'}, 'TimeUnit', 's');
% 调用step时指定仿真时间范围0-10s,步长0.1s
step(nlgr, 0:0.1:10)

% 修改后的ODE函数,补充第三个参数L的接收,对应你传入的c参数
function [dx, y] = boat_c(t, x, u, m, d, L)
 y = [x(1); x(2); x(3)];
 dx = [m(2,2)/m(1,1)*x(2)*x(3)-d(1,1)/m(1,1)*x(1)+u(1)*cos(u(2))/m(1,1); ...
     -m(1,1)/m(2,2)*x(1)*x(3)-d(2,2)*m(2,2)*x(2)+u(1)*sin(u(2))/m(2,2); ...
     (m(1,1)-m(2,2))/m(3,3)*x(1)*x(2)-d(3,3)/m(3,3)*x(3)+L/2*u(1)*sin(u(2))/m(3,3)];
 end

验证步骤

修改完成后先运行present(nlgr)查看模型配置,确认无参数错误提示后再运行step即可正常生成阶跃响应曲线。


内容的提问来源于stack exchange,提问作者Benjamin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:48:04