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

