You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MATLAB中使用lsqnonlin进行参数估计时出现insu_eqn函数未定义报错的问题咨询

问题分析与解决方法

首先梳理你的报错链,核心问题是MATLAB找不到insu_eqn函数的实现,同时存在几处变量引用错误,下面分步说明并给出解决方案:

1. 核心报错原因:insu_eqn函数未定义

报错信息第一行明确指出:

Undefined function 'insu_eqn' for input arguments of type 'double'.

这意味着你在主脚本中通过匿名函数dI = @(t,I) insu_eqn(t,I,Gexp,xOpt(1:3),texp);调用了insu_eqn,但这个函数要么:

  • 完全没有编写对应的实现代码;
  • 编写了但文件不在当前工作目录,也未添加到MATLAB的搜索路径中;
  • 函数名拼写错误(MATLAB对函数名大小写敏感)。

解决方法:补全insu_eqn函数

你需要创建一个名为insu_eqn.m的单独文件,或者在主脚本末尾添加局部函数,实现胰岛素模型的微分方程逻辑。以下是符合你模型场景的示例实现(参考Pacini葡萄糖-胰岛素模型逻辑):

function dIdt = insu_eqn(t, I, Gexp, paras, texp)
    % 插值得到当前时间点的实验葡萄糖值
    G = interp1(texp, Gexp, t, 'linear', 'extrap');
    % 提取参数
    n = paras(1);
    gamma = paras(2);
    h = paras(3);
    % 胰岛素动力学微分方程(可根据你的模型需求调整)
    dIdt = -gamma * I + n * max(G - h, 0);
end

确保这个函数文件和你的主脚本在同一个文件夹,或者通过addpath命令将函数所在目录添加到MATLAB路径中。

2. 变量引用错误:混淆了葡萄糖和胰岛素模型的优化结果

在胰岛素模型优化后的代码段中,你错误地使用了xOpt(葡萄糖模型的优化输出),但实际胰岛素模型的优化结果存在xOptt变量中:

% 错误代码
n = xOpt(1); %0.2576
gamma = xOpt(2); %0.0024
h = xOpt(3); %92.0000
Io = xOpt(4); %351.0000

解决方法:修正变量名

将上述代码改为:

% 正确代码
n = xOptt(1);
gamma = xOptt(2);
h = xOptt(3);
Io = xOptt(4);

同时,后面调用insu_eqn时的参数也要对应修正:

dI = @(t,I) insu_eqn(t,I,Gexp,xOptt(1:3),texp);

3. 潜在问题:insu_model函数未定义

报错链中提到insu_model函数(Error in insu_model (line 7)),但你的主脚本中没有这个函数的定义。如果这个函数是用来封装胰岛素模型求解逻辑的,你需要补全它的实现,或者直接将求解逻辑整合到obj_fun_ins中,减少多层调用的复杂度。

比如,你可以修改obj_fun_ins,直接在里面调用ode45而不依赖insu_model

function res = obj_fun_ins(pp, texp, Iexp, Gexp)
    n = pp(1);
    gamma = pp(2);
    h = pp(3);
    Io = pp(4);
    dI = @(t,I) insu_eqn(t,I,Gexp,[n,gamma,h],texp);
    [~, I_sim] = ode45(dI, texp, Io);
    % 计算残差
    res = I_sim(:) - Iexp(:);
end

额外建议

  • 运行前先检查所有自定义函数是否存在且拼写正确;
  • pwd命令查看当前工作目录,用addpath添加函数所在文件夹;
  • 优化过程中可以给lsqnonlin设置参数上下界(比如所有参数应为正数,设置lb = zeros(4,1)),避免出现不合理的负参数。

内容的提问来源于stack exchange,提问作者MMd.NrC

火山引擎 最新活动