应该lsqcurvefit重塑初始化参数向量?

2视图(30天)
当我运行下面的简单测试R2018a lsqcurvefit的
函数测试
ctrue = [1, 2, 3];
xdata =兰德(3);
ydata = F (ctrue xdata);
磅=无穷(3,1);乌兰巴托= +正(3,1);
磅(1)= 1;乌兰巴托(1)= 1;
选择= optimoptions (@lsqcurvefit,“SpecifyObjectiveGradient”,真正的);
c = lsqcurvefit (@F (0, 0, 0), xdata, ydata,磅,乌兰巴托,选择);
该模型函数,
函数[,江淮]= F (c, xd)
断言(isequal(大小(c) (3,1)),
(“c有望3 x1,但它是“,
num2str(大小(c, 1)),“x”num2str(大小(c, 2))))
= xd * c;
江淮= xd;
引发我得到维护,
错误使用测试> F(第21行)
c预计3 x1,但它是1 x3
所以lsqcurvefit经过c 1 x3行向量,即使最初的c,我提供的是一个3 x1列向量(0,0,0)。这应该发生吗?不应该我能指望初始矢量的形状确定的形状参数数组传递给模型函数?
5个评论
艾伦·韦斯
艾伦·韦斯 2021年5月6日
两个文档部分是正确的,但我现在可以看到部分线性指数不是有用的。发生了什么是,在内部,解决使用线性指数计算值,但对非线性目标和约束函数的参数是重塑回 x0 使用时的形状。
我将更新文档。
通知你,线性指数线性约束矩阵的关键 一个 Aeq ,因为对于那些参数 x 参数是一个列向量的重塑不管的形状 x0
艾伦·韦斯
MATLAB数学工具箱文档

登录置评。

接受的答案

马特·J
马特·J 2018年10月15日
编辑:马特·J 2018年10月15日
的调查之后,我想我已经发现这个问题从何而来,现在我理解得更好,我很相信这是一个编码错误。
问题发生在一个输入上的/下界对相等,磅(i) =乌兰巴托(i),意思是x(我)是已知的先验。来处理这件事,lsqcurvefit试图过筛snlsFixedVar这些变量使用函数,以便优化可以做的自由变量。
函数[xcurr, fvec,λ,雅各,EXITFLAG,输出,msgData] =
snlsFixedVar (funfcn xstart l, u,动词,选项,defaultopt,
fval JACval,调用者,Jstr、computeLambda mtxmpy,
detailedExitMsg、optionFeedback finDiffFlags变长度输入宗量)
%
% SNLSFIXEDVAR稀疏非线性最小二乘解算器与固定的变量
%
% box-constrained非线性最小二乘定位本地解决方案
%的问题:
%
%分钟{| | F (x) | | ^ 2: l < = x < = u}
%
% F: R ^ n - > R ^ m m > n, | | | | 2-norm。此外,至少有一个
% x的元素(i)是固定的,即l (i) = x (i) = u (i)。
%
%这个函数首先消除了固定变量的问题。的
%降低传递给snl是解决的问题。一旦减少
%的问题解决方案被发现,固定变量添加回
%的解决方案。
在这个函数的第一行评论,显然打算控制形状的代码为目的的评估用户功能:
%保存xstart形状我们可以重塑用户函数和输出
sizeX =大小(xstart);
然而,保存的形状 sizeX 永远不会传递到目标函数下降,这意图是永远不会满足。
%限制对“免费”的目标函数变量。
funfcn = i_createObjectiveFcn (funfcn, l, idxFree hasJacobMult);
除了这个,我相信这是一个错误,如果没有其他原因,因为这个错误只发生在有一个磅(I) =乌兰巴托(I)条件。在所有其他情况下,目标函数似乎接收输入形状的初始化数组,x0,符合现有的文档。
5个评论

登录置评。

答案(1)

艾伦·韦斯
艾伦·韦斯 2018年10月11日
可能解决的行为是不一致的,因此,当矢量方向问题,我建议你要主动,迫使你喜欢的尺寸。例如,
函数[,江淮]= F (c, xd)
c = c (:);为列c %
c = c (:)。';%行c
c =重塑(c, - 3, - 1);%另一种可能性
艾伦·韦斯
MATLAB数学工具箱文档
7评论
越南盾
越南盾 2021年5月6日
非常感谢!
感谢你给我Fexpand的函数。它是有用的。
% Wrarpper扩大决策变量
函数varargout = Fexpand (b,变长度输入宗量)
c =变长度输入宗量{1};
试一试%更新MATLAB修复bug
c (b) = c;
结束
varargout =细胞(1、nargout);
[varargout {}): = F (c,变长度输入宗量{2:结束});% < -调用原始模型
结束
虽然我理解有点困难,它成功地解决了我所遇到的问题。
但我有一个新问题。
下面这一行代码是什么意思?
@(变长度输入宗量)Fexpand(磅<乌兰巴托,变长度输入宗量{:})
如果 原始模型“F”返回一个函数处理,我可以用Fexpand的功能如何?
我很沮丧,我不知道如何解决这个问题。希望得到你的帮助,谢谢。
电子邮件:lidong@nim.ac.cn

登录置评。

类别

找到更多的在和迭代解算器输出显示帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的