minFunc包用法

时间:2014-04-10 15:57:42

标签: matlab mathematical-optimization gradient-descent

我一直在使用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 *(b-x)^ 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做同样的事情?

2 个答案:

答案 0 :(得分:4)

"请注意,默认情况下,minFunc假定提供渐变,除非“数字”和“#”选项设置为1(用于前向差分)或2(用于中心差分)。"

错误是因为函数只返回一个参数。您可以将渐变作为第二个参数返回,也可以启用数值差分。

答案 1 :(得分:0)

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

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

在MATLAB中,临时函数只能有一个返回值。因此,f = @(x)testFunc(x,a,b);让您的方法每次都会删除渐变部分。由于minFunc可以接受额外的参数,因此您可以在a之后传递bcx_init。我认为这会奏效。