2

我正在尝试使用 Octave 的 fminsearch 函数,我以前在 MATLAB 中使用过该函数。该功能似乎没有充分记录(至少对我而言),而且我不知道如何设置选项以使其实际上最小化。

我尝试使用此消息末尾的代码拟合一个非常简单的指数函数。我想要以下内容:
我希望函数将 x 和 y 值作为输入,就像 MATLAB 所做的那样。此外,我希望对选项进行一些控制,以确保它实际上最小化(即最小化!)。
当然,最后我想拟合比指数更复杂的函数,但我希望至少能够拟合指数。

我对 fminsearch 有几个问题:

  1. 我尝试将 x 值和 y 值交给函数,但是像这样的 matlab 风格的东西:

    [xx,fval]=fminsearch(@exponential,[1000 1],x,y);
    

    或者

    [xx,fval]=fminsearch(@exponential,[33000 1],options,x,y)
    

    产生错误:

    错误:options(6) 不对应于已知算法
    错误:调用自:
    错误:/opt/local/share/octave/packages/optim-1.0.6/fmins.m 第 72 行第 16 列
    错误:/opt/ local/share/octave/packages/optim-1.0.6/fminsearch.m 第 29 行第 4 列

    或者,分别(对于上面的第二种情况):

    错误:第 4 行第 3 列附近的“x”未定义
    错误:调用自:
    错误:/Users/paul/exponential.m 第 4 行第 2 列
    错误:/opt/local/share/octave/packages/optim-1.0.6 /nmsmax.m 第 63 行第 6 列
    错误:/opt/local/share/octave/packages/optim-1.0.6/fmins.m 第 77 行第 9 列
    错误:/opt/local/share/octave/packages /optim-1.0.6/fminsearch.m 第 29 行第 4 列

    显然,参数的顺序与fminsearchMATLAB 中的不同。那么,这个顺序如何??
    我怎样才能使fminsearch取值和选项?

  2. 我找到了解决函数不接受值问题的解决方法:我将 x 和 y 值定义为全局值。不优雅,但至少函数中的值可用。
    尽管如此,fminsearch并没有正确地最小化。
    如下所示:

    这是功能:

    function f=exponential(coeff)
    global x
    global y
    X=x;
    Y=y;
    a= coeff(1);
    b= coeff(2);
    Y_fun = a .* exp(-X.*b);
    DIFF = Y_fun - Y; 
    SQ_DIFF = DIFF.^2;
    
    f=sum(SQ_DIFF);
    end
    

    这是代码:

    global x
    global y
    x=[0:1:200];
    y=4930*exp(-0.0454*x);
    options(10)=10000000;
    [cc,fval]=fminsearch(@exponential,[5000 0.01])
    

    这是输出:

    抄送 =

    4930.0 5184.6

    fval = 2.5571e+08

    为什么fminsearch找不到解决方案?

4

2 回答 2

1

octave-forge 包“optim”中有一个 fminsearch 实现。您可以在其实现文件中看到第三个参数始终是选项向量,第四个参数始终是 grad 向量,因此您的 ,x,y 调用将不起作用。

您还可以在实现中看到它调用了 fmins 实现。

该 fmins 实现的文档指出:

         if options(6)==0 && options(5)==0 - regular simplex
         if options(6)==0 && options(5)==1 - right-angled simplex
            Comment: the default is set to "right-angled simplex".
              this works better for me on a broad range of problems,
              although the default in nmsmax is "regular simplex"

我最近的一个问题可以用 matlab 的 fminsearch 很好地解决,但不能用这个 octave-forge 实现。我必须指定一个选项向量 [0 1e-3 0 0 0 0] 让它使用常规单纯形而不是“直角单纯形”。如果您的系数在比例上差异很大,则默认八度音程毫无意义。

于 2013-06-04T09:55:00.953 回答
1

不管选项是什么,优化函数fminsearch总是试图找到一个最小值。因此,如果您发现它没有找到最小值,那是因为它没有这样做。

从您提供的代码中,我无法确定出了什么问题。使用全局变量的解决方案应该有效,并且确实这里有效,所以您身边的其他事情一定会出错。(注意:我使用的是 MATLAB,而不是 Octave,所以这两个函数可能略有不同......)

无论如何,为什么不这样做呢?

function f = exponential(coeff)

    x = 0:1:200;
    y = 4930*exp(-0.0454*x);

    a = coeff(1);
    b = coeff(2);

    Y_fun = a .* exp(-x.*b);     

    f = sum((Y_fun-y).^2);
end

或者,如果您必须传递xy作为外部参数,

x = [0:1:200];
y = 4930*exp(-0.0454*x);
[cc,fval] = fminsearch(@(c)exponential(c,x,y),[5000 0.01])


function f = exponential(coeff,x,y)

    a = coeff(1);
    b = coeff(2);

    Y_fun = a .* exp(-x.*b);     

    f = sum((Y_fun-y).^2);

end
于 2012-10-23T04:17:40.107 回答