首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >倍频程搜索:最小化和选择的问题

倍频程搜索:最小化和选择的问题
EN

Stack Overflow用户
提问于 2012-10-22 20:42:57
回答 2查看 6K关注 0票数 2

我正在尝试使用Octave的fminsearch函数,这是我以前在MATLAB中使用过的。这个函数似乎没有足够的文档(至少对我来说),而且我不知道如何设置选项,使其实际上最小化。

我试着用这条消息末尾的代码拟合一个非常简单的指数函数。我想要以下几点:

我想要函数以x和y值作为输入,就像MATLAB所做的那样。此外,我希望对这些选项进行一些控制,以确保它实际上最小化(即最小化!)。

当然,最后,我想要拟合比指数更复杂的函数,但我想至少能够拟合指数。

我对fminsearch有几个问题:

  1. 我试着把x和y值交给函数,但是像这样的matlab风格的东西: xx,fval=fminsearch(@指数,1000 1,x,y); 或 xx,fval=fminsearch(@指数,33000 1,选项,x,y) 产生错误: 错误:选项(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/指数.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接受值和选项?

  1. 我找到了解决函数不接受值的方法:我将x和y值定义为全局值。不是很优雅,但至少在这个函数中值是可用的。 尽管如此,fminsearch并不能正确地最小化。 如下所示:下面是函数: 函数f=exponential(coeff)全局x全局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);结束 以下是代码: 全局x全局y x=0:1:200;y=4930*exp(-0.0454*x);选项(10)=10000000;cc,fval=fminsearch(@指数,50000.01) 这是输出: cc =4930.0 5184.6 fval = 2.5571e+08

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

EN

回答 2

Stack Overflow用户

发布于 2012-10-23 04:17:40

无论选项是什么,优化函数fminsearch总是试图找到最小值。所以如果你发现它没有找到最小值,那是因为它没有找到最小值。

根据您提供的代码,我无法确定哪里出了问题。全球问题的解决方案应该是有效的,而且在这里确实有效,所以你这边的其他东西肯定出问题了。(注:我使用的是MATLAB,而不是八度,所以这两个函数可能略有不同.)

不管怎样,为什么不这样做呢?

代码语言:javascript
运行
复制
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作为外部参数传递,

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2013-06-04 09:55:00

在八度锻造包"optim“中有一个fminsearch实现。您可以在它的实现文件中看到,第三个参数总是一个选项向量,第四个参数总是一个梯度向量,所以您的调用,x,y将无法工作。

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

该fmins实现的文档声明:

代码语言:javascript
运行
复制
         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来解决,但不能用这个八度伪造实现来解决。我必须指定一个选项向量0 1e-3 0 0 0,才能让它使用常规单纯形而不是“直角单纯形”。如果你的系数在尺度上有很大的不同,那么八度默认就没有意义了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13019540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档