MATLAB fminunc求解含向量参数r的目标函数最小值方法
修改方案
问题根源
fminunc调用目标函数时,默认仅会向目标函数传入1个参数,即待优化的变量x。原代码直接将带两个输入参数的rosenbrockwithgrad句柄传给fminunc,运行时会因缺少参数r报错;另外如果r为向量,直接参与计算会导致目标函数返回值为向量,不符合fminunc要求目标函数返回标量的规则。
修改步骤
- 在调用
fminunc前,预先定义好需要传入的向量r的实际值 - 使用匿名函数绑定额外参数
r,构造仅接收x作为输入的目标函数句柄传给fminunc - 若
r为向量,需根据实际需求对r做标量化处理(如求和、取范数等),保证目标函数最终返回标量
修改后完整代码
主求解代码
x0 = [-1,2,1,2]; % 替换为你实际需要使用的向量r r = [0.1, 0.2]; % 匿名函数绑定参数r,适配fminunc的入参要求 fun = @(x) rosenbrockwithgrad(x,r); x = fminunc(fun,x0) function [f] = rosenbrockwithgrad(x,r) in = inp(); % 计算目标函数值,若r为向量请做标量化处理,示例为对r求和 % f = sum(r) + (rose(1,2,x(1),x(2),x(3),x(4),in.ep)+(1-x(1))^2); f = r + (rose(1,2,x(1),x(2),x(3),x(4),in.ep)+(1-x(1))^2); end function [f1] = rose(m,l,k1,k2,k3,k4,ep) f1=(100*(k1 - k2)^2)+ep+(k3*l)+(k4*m); end
输入参数函数(无需修改)
function [in] = inp() in.ep=-2; end
关键说明
- 匿名函数
@(x) rosenbrockwithgrad(x,r)会自动捕获当前工作区中r的值,fminunc调用时仅传入优化变量x,不会出现参数缺失问题 - 如果
r是随迭代变化的参数,该方法不适用,需将r的更新逻辑写入目标函数内部 - 必须保证目标函数返回值为标量,否则
fminunc会抛出维度不匹配错误
内容的提问来源于stack exchange,提问作者Jasmine
相关产品推荐
相关产品推荐

