【发布时间】:2012-10-22 20:42:57
【问题描述】:
我正在尝试使用 Octave 的 fminsearch 函数,我之前在 MATLAB 中使用过该函数。该功能似乎没有充分记录(至少对我而言),而且我不知道如何设置选项以使其实际最小化。
我尝试使用此消息末尾的代码拟合一个非常简单的指数函数。我想要以下内容:
我希望函数将 x 和 y 值作为输入,就像 MATLAB 所做的那样。此外,我希望对选项进行一些控制,以确保它实际上最小化(即最小化!)。
当然,最后我想拟合比指数更复杂的函数,但我希望至少能够拟合指数。
我在使用 fminsearch 时遇到了几个问题:
-
我尝试将 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 列显然,
fminsearch采用的参数顺序与 MATLAB 中的不同。那么,这个顺序如何??
如何让fminsearch获取值和选项? -
我找到了解决函数不接受值问题的解决方法:我将 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])这是输出:
cc =
4930.0 5184.6
fval = 2.5571e+08
为什么
fminsearch找不到解决办法?
【问题讨论】:
-
这对你来说可能很有趣 - 如何避免全局变量:stackoverflow.com/questions/12874317/…