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
相关产品推荐
相关产品推荐

