4

我一直在使用 MATLAB fminunc 函数来解决我的优化问题。我想试试 minFunc 包:

http://www.di.ens.fr/~mschmidt/Software/minFunc.html

使用 fminunc 时,我定义了一个函数 funObj.m,它为我提供了目标值和任意点“x”处的梯度。它还接受几个外部输入,例如 {a,b,c},它们是矩阵。所以函数原型看起来像:

function [objVal,G] = funObj(x,a,b,c)

我想在 minFunc 包中使用相同的设置。从示例中,我认为这应该可行:

options.Method='lbfgs';
f = @(x)funObj(x,a,b,c);
x = minFunc(f,x_init,options);

但是当我这样调用时,我得到一个错误:

Error using funObj
Too many output arguments.

为我的案例调用 minFunc 的正确方法是什么?

* *编辑:好的,这是我想与 minFunc 一起使用的示例函数。假设我想找到 a*(bx)^2 的最小值,其中 a,b 是标量参数,x 也是标量。MATLAB 目标函数将如下所示:

function obj = testFunc(x,a,b)
obj = a*(b-x)^2;

使用 fminunc(在 MATLAB 中)将其最小化的函数调用很简单:

f = @(x)testFunc(x,a,b);
x = fminunc(f,x_init);

这给了我 x = 10 的最小值。现在,我如何使用 minFunc 做同样的事情?

4

2 回答 2

4

“请注意,默认情况下 minFunc 假定提供梯度,除非 'numDiff' 选项设置为 1(用于前向差分)或 2(用于中心差分)。”

错误是因为函数只返回一个参数。您可以将梯度作为第二个参数返回,也可以打开数值差分。

于 2014-04-20T06:00:23.633 回答
0

同意马克。我认为解决它的最简单方法是

minFunc(@testFunc, x_init, a, b, c)

在 MATLAB 中,临时函数只能有一个返回值。因此,f = @(x)testFunc(x,a,b);让您的方法每次都丢弃渐变部分。因为minFunc可以接受额外的参数,所以可以通过a,bcafter x_init。我认为这会奏效。

于 2016-02-29T16:49:36.340 回答