在matlab中编写目标函数(包括梯度向量)的常用方法如下:
[L,G] = objfun(x)
其中
L
是目标函数的值,G
是梯度向量,x
是我要优化的系数向量。但是,当我包含另一个输入(即
[L,G]=objfun(x,M)
,其中M
是矩阵)时,或者当我在函数objfun
中调用另一个函数时,代码未运行。如何通过保持这种优化格式来在
objfun
中包含任何输入并调用任何函数?请注意,我将优化称为:
[x ,fval] = fminunc(@objfun,x,options)
哪里
options = optimoptions(@fminunc,'Algorithm','quasinewton',...
'Display','iter','Gradobj','on','TolFun',10^-8)
最佳答案
关于目标函数,有关于passing extra parameters的mathworks帮助文章:
您可以使用@(...)
运算符为仅依赖于单个参数的函数生成匿名函数句柄。
a = 4; b = 2.1; c = 4;
f = @(x)objfun(x,a,b,c)
从原始页面(您的
objfun
是parameterfun
的地方):注意:匿名函数中传递的参数是创建匿名函数时存在的参数。考虑一下
例
a = 4; b = 2.1; c = 4;
f = @(x)parameterfun(x,a,b,c)
假设您随后将a更改为3并运行
[x,fval] = fminunc(f,x0)
您得到与以前相同的答案,因为parameterfun使用a = 4,所以
创建f时的值。
要更改传递给函数的参数,请续订
通过重新输入匿名函数:
a = 3;
f = @(x)parameterfun(x,a,b,c)