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

适配GNUPLOT电缆建模脚本至MATLAB时的lsqcurvefit报错问题

问题:MATLAB lsqcurvefit维度不匹配错误

我找到一个电缆建模的GNUPLOT脚本,因Windows不支持其Linux专属终端,转写成MATLAB脚本后,执行lsqcurvefit时出现以下错误:

Error using lsqcurvefit (line 286)
Function value and YDATA sizes are not equal.

已确认:

  • data(1,:)和data(2,:)均为1×1000维度
  • 测试匿名函数输出为1×1000
  • poles0是1×11的初始参数矩阵,无法调整为1×1000

出错代码行:

poles = lsqcurvefit(@(x, poles) sqrt(pz(x, poles(1), poles(2)) .* pz(x, poles(3), poles(4)) .* pz(x, poles(5), poles(6)) .* pz(x, poles(7), poles(8)) .* pz(x, poles(9), poles(10)) .* p(x, poles(11))), poles0, data(1, :), data(2, :));

解决方案

错误根源是**lsqcurvefit要求的拟合函数参数顺序搞反了**:
lsqcurvefit规定拟合函数的第一个参数是待优化的参数向量,第二个参数是输入自变量数据,你把两者顺序写反了。

修正后的代码行

poles = lsqcurvefit(@(poles, x) sqrt(pz(x, poles(1), poles(2)) .* pz(x, poles(3), poles(4)) .* pz(x, poles(5), poles(6)) .* pz(x, poles(7), poles(8)) .* pz(x, poles(9), poles(10)) .* p(x, poles(11))), poles0, data(1, :), data(2, :));

更清晰的写法(推荐)

把拟合函数单独定义,避免参数混淆:

% 定义拟合函数:第一个参数为待优化的poles,第二个为自变量x
fitFunc = @(poles, x) sqrt(...
    pz(x, poles(1), poles(2)) .* ...
    pz(x, poles(3), poles(4)) .* ...
    pz(x, poles(5), poles(6)) .* ...
    pz(x, poles(7), poles(8)) .* ...
    pz(x, poles(9), poles(10)) .* ...
    p(x, poles(11)));

% 调用lsqcurvefit
poles = lsqcurvefit(fitFunc, poles0, data(1, :), data(2, :));

解释

lsqcurvefit的函数签名为lsqcurvefit(fun, x0, xdata, ydata),其中fun必须满足fun(x0, xdata)返回与ydata维度一致的结果。之前的写法将自变量x放在第一个参数位置,导致函数内部处理时维度不匹配,触发错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:02:17