MATLAB fminsearch求最小值报错及两种方法差异咨询
问题1:第一种方法的错误原因
你在第一种方法里踩了fminsearch的核心规则坑——fminsearch要求目标函数必须返回一个标量值,但你的inner_fun返回的是一个4×1的向量:
myFun = (vector - b_mat*x).^2;
这里vector - b_mat*x是4个元素的残差向量,逐元素平方后还是4个元素的向量。fminsearch无法对向量进行最小化计算,因为它不知道要以哪个维度为优化目标,这就是报错的直接原因。
修正方法很简单,把向量的平方和求和,转换成标量的残差平方和即可:
myFun = sum((vector - b_mat*x).^2);
这样inner_fun就返回一个标量,完全符合fminsearch的输入要求。
问题2:两种实现方法的核心差异
这两种方法本质上都是求解非线性最小二乘问题(最小化残差向量的平方和),但在工具选择、实现逻辑和适用场景上有显著区别:
1. 求解器定位不同
- 第一种方法用的
fminsearch是通用无约束局部优化器,基于Nelder-Mead单纯形算法,不需要目标函数的梯度信息,适合处理非光滑、无法求导的标量目标函数。但它不是为最小二乘问题专门设计的,对于这类问题的效率和精度都不如专用工具。 - 第二种方法用的
lsqnonlin是专门的非线性最小二乘求解器,针对“最小化残差向量平方和”这类问题做了深度优化。你指定的levenberg-marquardt算法尤其适合中小规模的非线性最小二乘问题,收敛速度更快,结果更稳定。
2. 目标函数定义逻辑不同
- 用
fminsearch时,你需要手动把残差向量转换成标量的平方和(也就是我们刚才修正的点),因为它只能处理标量目标。 - 用
lsqnonlin时,你只需要返回残差向量本身,求解器会自动帮你计算平方和并完成优化,不需要手动求和,这是它的设计优势。
3. 优化控制能力不同
fminsearch的可调参数较少,主要是迭代次数、容差这类基础设置,适合快速简单的优化场景。lsqnonlin提供了丰富的优化选项(比如你设置的Algorithm和Display),还支持约束条件(虽然你这里没用到),能更精细地控制优化过程,适合复杂的最小二乘问题。
内容的提问来源于stack exchange,提问作者Kyv
相关产品推荐
相关产品推荐

