图像缩略图"itemprop=

fminsearchbnd, fminsearchcon

version 1.4.0.0 (20.4 KB) by 约翰D 'Errico
基于fminsearch的边界约束优化
4.9
107年评级

201下载

更新2012年2月6日

查看许可协议

编者按:这个文件被选为MATLAB中心本周精选

Fminsearch不允许有约束。
然而,存在简单的转换方法
转换界约束问题转化为
无约束问题。

Fminsearchbnd的用法和fminsearch完全一样,
除了界限适用于变量。
在内部使用
变量的变换。(二次
单界,sin(x)表示双界

边界是包容性的不平等,其承认
边界本身的价值,却不会允许
任何超出界限的函数计算。

请注意,fminsearchbnd允许用户通过将两个边界设置为完全相同的值,将变量精确地固定在某个给定值。

使用示例:
罗森= @(x) (1-x(1))^ 2 + 105 * (x - x(1)(2)。^ 2)^ 2;

%无约束fminsearch解
fminsearch (rosen [3 3])
ans =
1.0000 - 1.0000

%下界,没有上界
fminsearchbnd (rosen [2.5 - 2.5] 2 [2], [])
ans =
2.0000 - 4.0000

两个变量的下界,x(2)的上界
罗森,[2.5 .5],[2 2],[inf 3]
ans =
2.0000 - 3.0000

现在我已经包含在包fminsearchcon,该工具还允许非线性约束。

引用作为

约翰·德里科(2020年)。fminsearchbnd, fminsearchcon(//www.tatmou.com/matlabcentral/fileexchange/8277-fminsearchbnd-fminsearchcon), MATLAB中央文件交换。检索

意见及评分(169

Sarka Laxova

Mohammadmehdi Naghiaei

乔纳森Scharf

Kyriakos Flentzeris

张胸

艾莉森·韦伯

iwein vranckx

非常感谢,工作完美,这正是我正在寻找的!伟大的工作! !

Yubin李

我想知道谁能够使用这段代码来最大化问题?

丹尼尔Mbadjoun

谢谢你的帮助。请您帮我表达好。为什么我得到错误消息“??赋值有更多的非单例rhs维比非单例下标"?
我的计划是:
清除所有
clc

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%P QTU数量CdF HB R Rg
GG = [
296 845.7143 528.2500 488 40.2500 0.7475 0.8864
247 705.7143 528.2700 488 40.2700 0.6237 0.8860
246 702.8571 528.2400 488 40.2400 0.6212 0.8866
256 731.4286 528.2000 488 40.2000 0.6465 0.8875
265 757.1429 528.2600 488 40.2600 0.6692 0.8862
286 817.1429 528.2500 488 40.2500 0.7222 0.8864
273 780 528.2300 487.5000 40.7300 0.6894 0.8760
265 757.1429 528.3000 487.5000 40.8000 0.6692 0.8745
351 1.0029e+03 528.1000 487.6000 40.5000 0.8864 0.8809
349 997.1429 528.0600 487.7000 40.3600 0.8813 0.8840
365 1.0429e+03 528 487.7000 40.3000 0.9217 0.8853
359 1.0257e+03 528.1600 487.7000 40.4600.9066 0.8818
347 991.4286 528.3000 487.7000 40.6000 0.8763 0.8788
351 1.0029e+03 528.3000 487.7000 40.6000 0.8864 0.8788
368 1.0514e+03 528.2000 487.7000 40.5000 0.9293 0.8809
358 1.0229e+03 528.1400 487.7000 40.4400 0.9040 0.8822
359 1.0257e+03 528.0800 487.7000 40.3800 0.9066 0.8836
346 988.5714 528.1800 487.7000 40.4800 0.8737 0.8814
377 1.0771e+03 528.1500 488 40.1500 0.9520 0.8886
488 40.2100 0.9419 0.8873
376 1.0743e+03 528.2400 488 40.2400 0.9495 0.8866
367 1.0486e+03 528.2000 488 40.2000 0.9268 0.8875
355 1.0143e+03 528.1800 488 40.1800 0.8965 0.8880
309 882.8571 528.2300 488 40.2300 0.7803 0.8868
276 788.5714 528.2500 488 40.2500 0.6970 0.8864
254 725.7143 528.2600 488 40.2600 0.6414 0.8862
253 722.8571 528.2600 488 40.2600 0.6389 0.8862
250 714.2857 528.2700 488 40.2700 0.6313 0.8860
258 737.1429 528.2400 488 40.2400 0.6515 0.8866
292 834.2857 528.1600 488 40.1600 0.7374 0.8884
280 800 528.1600 488.6000 39.5600 0.7071 0.9019
303 865.7143 528.2000 488.6000 39.6000 0.7652 0.9010
312 891.4286 528.1000 488.6000 39.5000 0.7879 0.9032
343 980.0000 528 488.6000 39.4000 0.8662 0.9055
345 985.7143 528.0600 488.6000 39.4600 0.8712 0.9042
333 951.4286 528.1800 488.6000 39.5800 0.8409 0.9014
329 940.000 528.2400 488.6000 39.6400 0.8308 0.9000
315 900.0000 528.2800 488.6000 39.6800 0.7955 0.8991
338 965.7143 528.2000 488.6000 39.6000 0.8535 0.9010
328 937.1429 528.1000 488.6000 39.5000 0.8283 0.9032
315 900.0000 528.1000 488.6000 39.5000 0.7955 0.9032
317 905.7143 528.1000 488.6000 39.5000 0.8005 0.9032
358 1.0229e+03 528.0400 487.9000 40.1400 0.9040 0.8888
371 1060 528.1200 487.9000 40.2200 0.9369 0.8871
373 1.0657e+03 528.2200 487.9000 40.3200 0.9419 0.8849
364 1040 528.2500 487.9000 40.3500 0.9192 0.8842
348 994.2857 528.2100 487.9000 40.3100 0.8788 0.8851
296 845.7143 528.2400 487.9000 40.3400 0.7475 0.8844
267 762.8571 528.2200 487.9000 40.3200 0.6742 0.8849
242 691.4286 528.2800 487.9000 40.3800 0.6111 0.8836
243 694.2857 528.2800 487.9000 40.3800 0.6136 0.8836
238 680 528.2600 487.9000 40.3600 0.6010 0.8840
242 691.4286 528.2200 487.9000 40.3200 0.6111 0.8849
251 717.1429 528.2000 487.9000 40.3000 0.6338 0.8853
267 762.8571 528.2900 487.3000 40.9900 0.6742 0.8704
222 634.2857 528.1000 487.3000 40.8000 0.5606 0.8745
267 762.8571 527.9000 487.3000 40.6000 0.6742 0.8788
262 748.5714 527.9000 487.3000 40.6000 0.6616 0.8788
270 771.4286 528.1800 487.3000 40.8800 0.6818 0.8727
273 780 528.3000 487.3000 41.0000 0.6894 0.8702];
P = GG (: 1);
QTU = GG (:, 2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%options=optimset('PlotFcns',@optimplotfval);
% = optimset选项(“PlotFcns”,@optimplotfval);
选择= optimset(“fminsearch”);
%选择= optimset (fminsearch, @optimplotfval);
opts.Display='iter';
选择。TolX = 1. e-12;
%选择。TolFun = 1. e-12;
opts.MaxFunEvals=100;
上交所= @ (x) QTU-sum (x (1) + (2) + (3) + x (4) + (5) + x (6) + x (7) + (8));
x0=[一(60,1),一(60,1),一(60,1),一(60,1),一(60,1),一(60,1),一(60,1),一(60,1),一(60,1),一(60,1)];
n=长度(x0);
磅= [0 * 1 (n, 1) 0 (n, 1) 0 (n, 1) 0 (n, 1) 0 (n, 1) 0 (n, 1) 0 (n, 1) 0 (n, 1)];
乌兰巴托=[152 *的(n - 1) 152 *的(n, 1) 152 *的(n - 1) 152 *的(n, 1) 152 *的(n - 1) 152 *的(n, 1) 152 *的(n - 1) 152 *的(n - 1)];
% = fminsearch东南偏南(sse, x0,选项)
% xsol = fminsearchbnd (sse, x0,磅,乌兰巴托,选择)
[xsol, fval exitflag、输出]= fminsearchbnd (sse, x0,磅,乌兰巴托)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

请帮我把这个程序运行好

菲利普·G

迈克尔•霍夫曼

是否可以传递一个“options”参数而不指定“nonlcon”?

BYEONGUK IM

丹尼尔Mbadjoun

你好约翰•D 'Errico
你能帮我用python搜索一下吗?

理查德·吉利斯

我无法在Python3.7中实现这一点。

乡里

可以Bozdag

如何将目标函数作为函数文件传递?例如,在FMINCO中,我将目标函数和约束传递为
[x, f] = fmincon (@objfun x0 ,[],[],[],[], 磅,乌兰巴托,@confcun);
然而,对于fminsearchcon,它给出了错误-太多的输入参数

luckycyan

出色的表现!我正在尝试把你的代码翻译成C语言。

泰勒

约翰D 'Errico

上帝没有。不要修改所提供的代码。尤其是当你不知道你在做什么的时候!

其实,你仔细看了,fminseachbnd其实已经使用varargin了!但是我认为您所做的不是编辑fminsearchbnd代码,而是当您调用它时,它看起来像您试图添加varargin作为fminsearchbnd的输入参数。那不是你使用瓦拉金的方式。事实上,你根本不需要这么做。

因此,看看调试堆栈,paramfittreat7D调用fminsearchbnd。

paramfittreat7D中的错误(第30行)
[bmin, Smin] = fminsearchbnd(@Sfun7D,b,Lb,Ub,options);

你给fminsearchbnd传递了函数:@Sfun7D

但你从来没有告诉过它该用什么论据。

实际上,你需要学习如何使用函数句柄,因为你在用varargin做一些愚蠢的事情,不理解varargin,而你根本不需要使用它。

在调用fminsearchbnd时,将参数传递给Sfun7D,在这里创建函数句柄。当然,你还没告诉我Sfun7D用的是什么论据,所以我也没法帮你。学习使用和创建函数句柄。

而且,不,我不会在代码的注释中做咨询,因为这很容易变成一种情况,我需要教你如何在多个注释中使用函数句柄。

Reihaneh Mostolizadeh

谢谢你的文件。
我正在使用此文件运行程序,但出现以下错误:
"使用paramfittreat7D>Sfun7D出错
输入参数太多。

fminsearchbnd>@(x,varargin)fun(xtransform(x),varargin{:})(第233行)
Intrafun = @(x, varargin) fun(xtransform(x), varargin{:});

fminsearch错误(第200行)
阵线(:1)= funfcn (x,变长度输入宗量{:});

fminsearchbnd错误(第264行)
(徐、fval exitflag、输出]= fminsearch (intrafun x0u,选项,变长度输入宗量);

paramfittreat7D中的错误(第30行)
[bmin, Smin] = fminsearchbnd(@Sfun7D,b,Lb,Ub,options);

当我把"varargin"加到fminsearchbnd时,我得到了另一个错误
“尝试将脚本varargin作为函数执行:
/Applications/Matlab/MATLAB_R2018a.app/toolbox/matlab/lang/varargin.m

paramfittreat7D中的错误(第30行)
[bmin,Smin]=fminsearchbnd(@Sfun7D,b,Lb,Ub,options,varargin);”。

在这种情况下,我可以请求您帮助我吗?提前谢谢!

尼古拉斯·塔克

唐纳德·休谟

Mareedu。维拉饶

清晰;clc;关闭所有
FID =的fopen( 'vvrk.txt');
数据=fscanf(fid, '%g %g', [2 inf]);
数据=数据';
xdata =数据(:1);
ydata=数据(:,2);
X0 = [120 100 98];
% Zk在Excel xls文件的第一列。
%在实验数据中,Zk的单位为毫米,将Zk转换为米。
%设置P(O)T2P(O)和P(S)T2P(S)的浮动参数初始点。x (1), (2)
% x(3)为TPA、单线和三线ESA截面。对于P(Se)T2P(Se)化合物,浮动
%参数变为x(1)、x(2)、x(3)和x(4)。
选择= optimset(“fminsearch”);
opts.Display='iter';
选择。TolX = 1. e-12;
opts.MaxFunEvals=100;
myfun = @ FiveLevelSystem_ps_ns (x, xdata数据);
%使用函数FiveLevelSystem_ps_ns计算6个数据库的SSE之和。
%curvefitoptions = optimset( 'UseParallel', '总是', '显示', 'ITER', 'TolFun',1E-6);
%['TolFun',1e-6]——当改变平方和小于1e-6时终止函数。
[x, fval exitflag、输出]= lsqcurvefit (x0, myfun xdata, ydata,(0, 0, 0),[],选择);
%最外回路5中,发现了一组值(x(1),X(2)中,x(3))直到获得SSE最少;
%x(1)、x(2)和x(3)是TPA、单重态和三重态ESA截面。
试图找到一个由多个变量组成的标量函数的最小值,从
初步估计
% fminsearchbnd调用函数' myfun=@(x,xdata,num)FiveLevelSystem_ps_ns(x,xdata) '
%比较函数' FiveLevelSystem_ps_ns '的结果对于不同的值集(x(1),
% x (2), (3))
(' x1 x2 x3 ')
长格式;disp (x)
我正在运行这个程序,但它花了太多的时间一天或更多,可以告诉什么是问题

马里奥发音

达维德

托本Helsloot

加兹万

Stefan Fillafer

郑宇

胡传鹏

胡传鹏

非常感谢你!
但是我发现我无法下载文件。我右击“另存为”,但它显示错误:“失败-没有文件”。
你能帮帮我吗?
再次感谢。

YcekJackal

乔迪·范德·波尔

伟大的!谢谢

KeFop

乔纳斯

Birk安德烈亚斯

非常感谢你!

Jakob Rabjerg稳索

我经常使用这个工具。谢谢你的贡献。

由Buhrmann

感谢编写这个函数。是否可以为底层的fminsearch设置选项(如Display, TolFun等)?

LeahG

Jdeen

有可能优化一个域是离散的函数吗?或者更确切地说,是否有可能利用我只对要优化的参数的离散值感兴趣这一事实?

约翰D 'Errico

我没有Octave,所以我不能为一个我从未使用过的工具编程,一个我无法访问的工具。

params参数的存在是为了满足使用较老版本MATLAB并需要该选项的用户。您可以遍历并编辑代码,删除该参数。请注意,对于那些选择修改代码的人,它将成为您的代码,从某种意义上说,我不支持修改代码。金宝app


我想在八度音阶上使用这个函数(fminsearchbnd)。但在八度音阶上,它会给fminsearch输入参数带来不兼容的问题。在第229行,在调用fminsearch的同时,还传递了“params”结构。在八度音阶中,fminsearch不接受这一点。有什么解决办法吗?
我想在使用总最小二乘包时使用这个。

赛斯

一如既往,John D'Errico的贡献是文件交换所能提供的最好的贡献之一。谢谢你做得这么好。

特别注意:我正在估计带有(13)总变量的ODE的参数。我知道像作者在注释部分明确说明的那样使用这么多变量是不明智的——然而,我在Matlab中尝试过的其他方法都失败了。单纯形方法是我发现的唯一的方法,工作很好,我的具体问题,这是一个很好的代码,有助于解决这个问题。(包括优化工具箱- fmincon, fminunc,等等-但没有尝试“全局优化工具箱”)。

它是否需要大量迭代才能解决?是的。然而,这总比得到没用的结果要好!

赛斯

雁鸣声

你好,

我想让代码生成从fminsearchbnd。因为fminsearch能够做到这一点,我希望fminsearchbnd或fminsearchcon也能做到这一点。

不幸的是,我得到了以下错误:

不支持嵌套函数。金宝app

“fminsearchbnd函数。M '(#1439.6496.6510),第238行,第19列:
“Outpun_包装”

有人能帮忙解决这个问题吗?
你也可以用:
coder.screener(“fminsearchbnd”)

谢谢。
扬尼克

文斯

优秀的记录——很好

文斯

文斯

格伦·戈麦斯

突出。

约翰D 'Errico

雅各布-抱歉,但是没有。

你有一个7维的问题,有7个未知数。7个未知数非常接近使用像fminsearch这样的工具所能达到的上限。即便如此,也在挑战良好表现的极限。

如果你想并行地解决其中的几个问题,比如2个、3个或10个,你就会有一个14维、21维或70维的问题。

只用一个循环。即使这些工具足够聪明,知道你想用不同的起点解决多个问题,它所能做的只是建立一个内部循环。绝对不会有任何收获。

雅各布·西弗斯

我有一个7参数的问题,我解决使用fminsearchbnd。我想知道是否有可能解出几个x0通过把它们作为一个矩阵而不是一个向量一次。我的赋值函数至少支持这样的向量化输入。金宝app显然,这个问题与fminsearchbnd的关系比你提交的fminsearchbnd更大,但我想知道你对此有什么想法?

Yakun张

乍得伯奇主义分子

很快Ozbilge

亚历山大•沃克

很好。就像一个附加约束的符咒!

约翰D 'Errico

对于多个约束,您需要返回一个包含约束值的向量,而不仅仅是每个约束作为一个额外的函数句柄参数。这与fmincon方法是一致的,尽管我不允许fminsearchcon中的等式约束。

假设我的编辑手指工作正常,就像这样:

帕尔= fminsearchcon (@ (para) fitfunction para0,磅,乌兰巴托,[],[],@ (para)[帕拉(3)/√(para(1) *帕拉(2))/ 2 - 1),帕拉(9)/√(para(7) *帕拉(8))/ 2 - 1,
帕拉(3)/√(para(1) *帕拉(2))/ 2 + 1,
帕拉(9)/√(para(7) *帕拉(8))/ 2 + 1]);

苗族余

非常感谢fminsearch代码。
我使用fminsearchcon像一些非线性不等式功能:parag = fminsearchcon(@(对)fitfunction,para0,LB,UB,[],[] @(对位)第(3)/ SQRT(第(1)*第(2))/ 2-1),@(对位)第(9)/ SQRT(第(7)*对位(8))/ 2-1,@(对) - 对苯(3)/ SQRT(对位(1)*第(2))/ 2 + 1,@(对) - 对苯(9)/ SQRT(第(7)*对位(8))/ 2 + 1);

在这个搜索中我需要四个非线性条件,但是当我这样输入时,matlab给出了错误:@(para)para(3)/sqrt(para(1)*para(2))/2-1
输入参数太多。那么我该怎么写这个句子呢?

沃里克

非常有用的。允许修复一个或多个x0参数的特性是一个很好的附加特性。

约翰D 'Errico

塞吉奥-事实是,最小化一个函数的负数会导致最小化者试图最大化它。时期

我猜当你认为你引入了一个负号时,实际上你没有。也许你还是通过了原来的功能。这是人们常犯的错误。或者你做了一些不同的事情。当然,如果你不展示你做了什么,我不知道你到底做了什么,我不知道你是怎么做错的。

塞尔吉奥·席尔瓦

谢谢你的功能。
虽然我想用它们来最大化函数。
我试图引入一个负号(-)到我的函数,但它没有解决我的问题,'fminsearcbnd'仍然最小化我的函数

最好的问候,
塞吉奥

格雷格

谢谢你的信息,再次感谢你出色的功能。

约翰D 'Errico

格雷格-对不起,没有。

不平等约束很容易以惩罚函数的形式放入代码中,也就是说,如果它偏离了边界,就拍拍它的手。只要代码从可行点开始,惩罚函数就确保它保持可行。

然而,对于等式来说,使用一个将所有点保持在等式约束流形上的方案更有意义。为此,惩罚函数将不起作用,因此我选择不提供等式约束功能作为选项。

格雷格

嗨,约翰,

感谢一些非常有用的工具。

一个问题……fminsearchcon处理非线性等式,像fmincon,还是只处理不等式?

干杯

杰夫•米勒

西蒙Mæng

德米特里•

约翰D 'Errico

它使用了fminsearch,这是MATLAB的一部分,而不是在优化工具箱中。如果你已经有了优化工具箱,我会告诉你使用fmincon。

Seb的偏见

嘿,谢谢你。我只是想知道,没有优化工具箱,它还能工作吗?
谢谢

萨尼

约翰D 'Errico

我不知道为什么你有一个问题安装它,显然很多天之后试图这样做。除了我已经说过的,我不能再告诉你更多了。

1.点击“下载提交”按钮。用你的鼠标来做。

2.解压文件。有许多实用程序可以解压缩文件。事实上,MATLAB本身包含一个解压工具。使用它。

3.将生成的顶级目录添加到搜索路径。使用pathtool或addpath来执行此操作。

我不知道上面哪件事给你造成了问题,但它们看起来都很基本。

我不知道你问有关如何在这种情况下使用if语句。

最后,我很抱歉,但我不会深入讨论fminsearch和fmincon之间的区别。对我来说,那要花很多时间。在网上有许多地方,Nelder/Mead工具被解释给你学习FMINSEARCH。至于fmincon,首先要阅读相关文档。如果你看一下底部,你会找到参考资料。

娜塔莉

你好,我正在努力如何安装它?

如果你能帮我,我会很感激的。

还有,我是否可以用'if..,在参数的取值上施加约束/条件,因此要再次检查约束问题。还有,为什么“fmincon”可能比“fminsearch”更糟糕。我不能找到这两个命令如何工作的机制?先谢谢你。

约翰D 'Errico

1.下载它。
2.按照指示安装。
3.阅读帮助,看看例子。

我还能说什么呢?

娜塔莉

嗨,如何使用这个命令?

马太福音

Seb的偏见

总是很高兴看到Mathworks依靠用户提供这样的功能。。。

Kees de kap

亲爱的约翰,

感谢你对社区的贡献。
关于第一步,我有个问题。这可能与Nguyen的Q/A有关,但我不完全确定。

如果初始值在边界处,则初始步长非常小,因此优化将停留在边界值处(对于我的优化函数)。如果初始值位于边界的中间,则初始步骤是合理的,并且优化可以走到“全局”最小值(可以接近其中一个边界)。显然,边界之间存在步长缩放。
有可能避免这种缩放吗?

提前谢谢,
Kees

亲爱的约翰,
非常感谢你上次的帮助。
我可以再问一个关于算法的问题吗?
对于trust - region - reflection算法,以minimization为例,基本上它的四个步骤都是重复的,直到收敛。
这种收敛与TolFun或TolX之间的关系如何?
再一次感谢您!

雅各布·西弗斯

谢谢你约翰!这很好地解决了我一直在处理的一个问题!

克利斯朵夫

亲爱的约翰,
没问题,谢谢你花时间回答我的问题。非常感谢。我经常使用fminsearchbnd,也在我的优化工具列表中包含了rmsearch。非常感谢您提供这些工具!

约翰D 'Errico

嗨,克利斯朵夫,

问题是,这些工具实际上只是围绕fminsearch进行包装,fminsearch只使用了一组受限制的参数。从fminsearch的帮助中,我只看到:

fminsearch使用
这些选项:Display, TolX, TolFun, MaxFunEvals, MaxIter, FunValCheck,
PlotFcns, OutputFcn。

所以我永远无法像你所希望的那样控制这个问题。很抱歉即使是有限的变量集也会被破坏,因为fminsearchbnd使用了一个转换,这将阻止您按照设计使用TolX来控制事物。

约翰

克利斯朵夫

亲爱的约翰,
所以,非常感谢这个节目。我在想,如果有一个简单的方法来修改fminsearchbnd到能够处理的自变量的输入像(“DiffMinChange”,1E-2)?我的变量以毫米为单位,我想有变量至少0.01毫米改变。
再次感谢大家的关注!

非常感谢你的支持。金宝app
我共有7个变量。
在朋友的支持下金宝app,我们尝试将每个变量的受限范围划分为n个值。
我们进行n^7局部优化,并选择最优。
我们试图使局部极小化函数全球化。
然而,我们希望找到其他方法/工具。

约翰D 'Errico

我能说得多清楚?这些是搜索例程,就像fminsearch, fmincon, fsolve等。事实上,我提供的工具是基于fminsearch的。所有这些工具都基于它们的起始点来搜索局部最小值。

如果你选择了一个好的起点,那么你就会得到一个好的解决方案。你对你要优化的系统的知识总是有帮助的。

没有这样的工具能保证在一个完全通用的函数上找到一个全局最优。时期。

如果你坚持积极地寻找全局最优解,不管你的起点是什么,那么这些工具对你来说都是错误的。当然,除非你能保证你的函数有一些好的属性,全局优化可能是一个非常棘手的问题。祝你好运。

最好的情况是,一个具有某些良好性质的方案是从许多随机的起点开始,然后从结果中选择最好的解。金宝搏官方网站这是在我的rmsearch工具中实现的,也可以在文件交换中找到,尽管它是相当简单的,由您自己来做。这种随机方案的一个优点是,如果你从全局优化器的吸引点开始,那么它应该会收敛到那个解。只要那个盆地不太小,不被人发现,你就能在这里成功。由于蒙特卡罗开始,你甚至可以确定全局解被找到的概率。但确定吗?对不起,没有。再一次,祝你好运。

最后,您只说您有4个以上的变量。有多少?我的建议是,太多的变量会让fminsearch这样的工具工作得很差。我建议6个变量是合理的上限,但我听说有人解决更大的问题。

非常感谢你的档案。
但是我还有一个不清楚的问题。
当我改变起始值x0时,fval结果将改变(很多)。
所以我有一个初步的结论,你们的函数会找到局部极小值,这取决于开始猜测。
是这样吗?
在这种情况下,请帮助我如何找到变量上下边界之间的全局最小值(超过4个变量)?

再次感谢大家。

亚当Auton

布莱克米尔纳

洛伦兹

雅各布Kirkensgaard

Poorya

阿尔瓦罗·坎波斯Duque

是的,它的工作=)非常感谢!!

约翰D 'Errico

Fminsearchcon使用你的目标函数,对于5个参数模型,必须采取矢量输入。因此,它将向目标函数传递一个向量x它有5个元素。约束函数也必须接受长度为5的向量。所以你对fminsearchcon的调用可能是这样的:

[x,fval]=fminsearchcon(@fit,x0,lb,ub,[],[],@(x)2.3*(x(4)^2+x(3))^0.5-x(5)-x(2));

阿尔瓦罗·坎波斯Duque

再次祝贺你的有用功能,约翰。我只是有一个问题:我正在尝试使用fminsearchcon在一个5参数函数我已经创建:

函数误差=适合(参数)
x1 =参数(1);
x2 =参数(2);
x3 =参数(3);
x4 =参数(4);
x5=参数(5);
(…)这里有一个很长的脚本,但在最后,重要的是输入和输出(…)

我想知道的是找到优化误差函数的参数。这些参数由非线性约束相互关联:

-2.3 * 0.5 (x4 ^ 2 + x3) ^ + x5 + x2 > 0

问题是我不知道如何实现这个约束,我看到的例子只有一个参数。我试过这个:

x0=[0.5,0.05,0.05,1,0.5];
磅= [0,0,0,0,0);
乌兰巴托=(2,1,1、10、5];
[x, fval] = fminsearchcon (@fit x0,磅,乌兰巴托,[],[],@ (x2、x3、x4, x5) 2.3 * (x4 ^ 2 + x3) ^ 0.5 -x5-x2)

但是,当然,它不能识别x2 x3 x4 x5因为它没有定义。

有什么线索吗? ?提前谢谢!:)

阿尔瓦罗·坎波斯Duque

祝贺你,约翰,非常感谢你这么好的工作!

杰夫·华纳

祝贺您创建此函数的出色工作。这是我一直在搜索的内容。我过去一直在使用fminsearch,但它不是一个非常健壮的拟合例程,因为您无法约束拟合参数,因此我无法始终获得良好的拟合。
现在我正在使用您的fminsearchbnd,每次我运行程序在相同的文件上的匹配结果是接近于以前的匹配。

约翰D 'Errico

阿方索-抱歉,但我极力拒绝回答那些与投稿没有直接关系的问题。评论字段实际上不是用于咨询的,顺便说一下,这是我现在避免的事情。你的问题与这个工具无关。

阿方索

你好再次,

谢谢你的“不回答”。

我之前的评论只是一个关于使用变量转换的框约束优化的一般性问题,而不是对你的代码的批评(顺便说一下,我认为是4颗星)。

我以为它只是个包装…,I have not doubts on the quality of your work....

然而,在现实世界中,多维问题是非常常见的,它们需要在不等待数年的情况下收敛到最小。

在这种情况下,基于梯度的方法(如L-BFGS, SD或CG)可以与变量变换一起使用。

然后,我再次问你,我们如何避免卡在约束的边界上(其中的变换梯度是0)?

这不是一个微不足道的问题,它可能导致在次最优鞍点上提前停止优化迭代。

问候,阿方索

约翰D 'Errico

(第三部分,继续我之前的回答。)

那么,fminsearch在这个任务中成功了吗?嗯,是的,一个有资格的是的。它相当缓慢。例如,让我们试试优化工具箱中的fminunc。

>> [xfinal,fval,exitflag] = fminunc(fofx,x0,optimset('display','iter'))

一阶
迭代函数计数f(x)步长最优
0 26 2500 20
1 52 2025 0.05 18
2 78 0 1 1.49e-08

找到了局部最小值。

优化完成,因为梯度的大小小于
函数公差的默认值。

> <停止标准细节

xfinal =
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

fval =
0

exitflag =
1

Fminunc了0.014秒运行,需要2次迭代和78分功能的评价。完成后,将溶液组成的精确零。

>>格式长g
> > max (abs (xfinal))
ans =
0

正如我所说,这是一个非常非常简单的问题。没有曲线谷可遵循,因为许多优化问题将会有。这里没有弹跳的边界或限制。fminsearch在这个问题上成功了吗?是啊,但得费点劲。我们可以找到更好的工具,但是基于fminsearch的工具将会举步维艰。我通常建议fminsearch对于小问题来说是完美的。对于2或3个变量,fminsearch通常是我的“去”算法。(我甚至有时会在一个变量的问题上使用它。)没有理由在那里拿出一个大的枪,并且fminsearch有一些非常好的健壮的特性关于它的小问题。 It is insensitive to some irregularities in your function, and can even survive some things like derivative discontinuities that may make gradient based optimizers unhappy campers.

最多6个变量仍然是可以的。我倾向于6个以上的变量,这个极限是与问题相关的,很软。即使10或12个变量也可以。

但实际上,当一个问题有超过10个变量时,我将从优化工具箱中寻找一个工具。Fminunc, fmincon将是常见的选择。对于本质上真正是“线性”的问题,lsqlin甚至更好。因此,您几乎可以认为lsqlin(或quadprog)根本就不是迭代求解器,因为您不需要提供初始值。

因此,我在这里提供的fminsearch和派生工具都是很好的、可行的工具。这些不是玩具功能,但它们也有其局限性。它们在较小的问题上工作出色,为您提供了实现简单约束的简单方法。他们可能会对你的问题做一个合理的工作,但我不会把他们逼得太紧。即使是作为fminsearchbnd的作者,我建议购买的第一个工具箱是优化工具箱,如果你要做任何规模的优化。

约翰D 'Errico

(第2部分,从上一次回复继续)

让我们试着在这里更明确一些。更改MaxFunEvals参数。

>> [xfinal,fval,exitflag] = fminsearch(fofx,x0,optimset('maxfunevals',1000))

退出:超过了函数求值的最大数目
增加MaxFunEvals选项。
当前功能值:887.434654

xfinal =
列1至12
-2.923 12.909 3.1561 3.0168 -1.2408 3.0691 4.9753 2.4416 7.3143 -2.3687 3.5243 5.8719
第13至24列
2.311 -10.707 6.0148 0.45126 11.192 4.6186 3.3215 5.484 3.3361 4.2973 1.9503 12.542
列25
3.2774

fval =
887.43

>> [xfinal,fval,exitflag] = fminsearch(fofx,x0,optimset('maxfunevals',2000))

退出:超过了函数求值的最大数目
增加MaxFunEvals选项。
当前功能值:64.925968

xfinal =
列1至12
1.1789 -1.8439 1.2661 -1.4893 0.20456 3.6405 - 0.5783 0.82694 -0.63308 -0.96542 1.5783 1.6521
第13至24列
-0.07538 -2.409 0.76939 1.9824 -1.9948 0.87846 -0.94908 2.7612 0.351 -0.74091 0.32458 3.1321
列25
1.0073

fval =
64.926

>> [xfinal,fval,exitflag] = fminsearch(fofx,x0,optimset('maxfunevals',4000))

退出:超过了函数求值的最大数目
增加MaxFunEvals选项。
当前功能值:5.887733

xfinal =
列1至12
-0.039379 -0.62272 0.3608 0.033666 -0.3333 -0.43402 -0.30185 0.16978 0.106 0.41576 0.3982 -0.15116
第13至24列
0.48606 -0.83993 0.66158 0.95052 0.20017 0.77219 0.80237 0.57812 0.10016 0.62498 0.36942 -0.37967
列25
0.06037

fval =
5.8877

>> [xfinal,fval,exitflag] = fminsearch(fofx,x0,optimset('maxfunevals',8000))

退出:已超过最大迭代次数
增加MaxIter选项。
当前函数值:1.364211

xfinal =
列1至12
0.0085952 -0.12505 0.034718 -0.21946 -0.16216 0.020216 0.21074 -0.054082 0.25911 0.16582 0.41984 0.15747
第13至24列
-0.049798 -0.12582 0.45415 0.4152 -0.093939 0.38964 -0.40392 -0.12336 0.055191 -0.077377 -0.39227 -0.14665
列25
-0.094889

fval =
1.3642

在8000次函数求值之后,它达到了默认的迭代限制。

意思是(abs (xfinal))
ans =
0.18638

我可以让它变得狂野。例如,下面这个例子在我的机器上只用了2秒就解决了:

>>[xfinal,fval,exitflag]=fminsearch(fofx,x0,optimset('maxfunevals',100000,'maxiter',100000))

xfinal =
列1至12
3.2675e-05 8.4082e-05 -5.6463e-06 -0.00017336 -0.00015729
第13至24列
-4.7605e-05 0.00023687 -1.0958e-05 0.00019857 -9.4663e-05 -3.9436e-05 6.2949e-05 -5.8151e-05 4.9917e-05 -8.9443e-05 1.8443e-06 0.00011523
列25
3.8857 e-05

fval =
2.9028 e-07

exitflag =
1

>>平均值(abs(xfinal))
ans =
8.7266 e-05

顺便说一下,所有其他示例的exitflag==0。最终,fminsearch在收敛公差上绊倒了,而不是在函数或迭代限制上绊倒了。它认为它可能已经融合了!

(第二部分结束。接下来是第三部分。)

约翰D 'Errico

你好杰西卡,

问题是,fminsearch工具在搜索高维空间时效率不高。多面体到处乱转,扩张,收缩,等等,但人类的头脑根本不知道25维空间有多大。这是有道理的,因为我们被构建成三维的形象,所以我们倾向于根据我们的经验来考虑一切。

我举一个简单的例子来说明这个问题。从25个方面考虑一个完美的圆形井。我不需要担心边界或任何东西,因为这些特性不会以任何物质的方式变化。

函数是一个旋转抛物面,以25维原点为中心,我将从repmat(10,1,25)开始,所以它必须走一点路,但这是一个非常简单的问题。fminsearch是如何处理的?

>> fofx = @(x) sum(x.^2,2);
>> x0 = repmat(10,1,25);
>> [xfinal,fval] = fminsearch(fofx,x0)

退出:超过了函数求值的最大数目
增加MaxFunEvals选项。
当前功能值:3.762363

xfinal =
列1至12
0.15208 -0.37597 0.47583 -0.4156 -0.47475 -0.22822 0.30263 0.15141 0.25204 0.45515 0.48452 -0.16627
第13至24列
0.18958 -0.65985 0.55836 0.554621 -0.012447 0.32472 0.55204 0.29942 0.13633 0.28518 -0.69201 -0.25536
列25
0.21961

fval =
3.7624

正如你所看到的,从所有10的向量开始,它下降到平均0.35,所以这是一个改进。

意思是(abs (xfinal))
ans =
0.34662

因此,通过它的迭代跑出来的时候,它已经走了的这不得不沿着一条直线走的路96.5%,所以有些人可能会说,它已经做得相当不错。在另一方面,我们也可以把它做了什么,是提高通过只够起始估计拿到第十进制数字是正确的。

(非常长的第一部分结束。)

杰西卡•派珀

你好约翰,爱fminsearchbnd,谢谢!只是一个快速的问题。我一直在使用上有26个变量的问题fminsearchbnd,我已经得到了良好的效果。但是,根据您在下面的意见,我担心我刚开始很幸运!你会建议较大的问题是什么算法?(我从光学实验拟合数据,但目标是非线性的,该问题甚至不是拟凸)。

约翰D 'Errico

阿方索,看来你完全误解了这些工具的工作原理。fminsearchbnd和它的近亲是基于fminsearch的,一个叫内尔德·米德(polytope)的人优化器。事实上,他们调用fminsearch来完成实际工作。fminsearch不是一个基于梯度的工具。从来没有计算过梯度,甚至没有近似的梯度。因此,除非优化驱动他们,否则他们往往不会停留在这样一个点上。你可能想了解一下Nelder-Mead风格的工具类在此之前是如何工作的或者你判断算法。

当然,任何优化都会受到特定问题的影响。奇点、病态和多个局部解都是问题。但这一边界点并不像你所担心的那样是一个问题。金宝搏官方网站

阿方索

嗨,约翰,

给你一个简单的问题。

当你对x进行二次变换x=y^2 >=0(顺便说一下,同样的问题也适用于sin(x));如何防止优化器卡在边界(y=0)上的情况?事实上,在这种情况下,实际的解决方案不在边界上,但在优化迭代过程中,基于梯度的优化器到达了边界上的一个点,它不能向最小值改进,因为变换梯度为0 (dx/dy=2y=0)。

我希望我说得够清楚了

提前感谢您的友好回答。

阿方索

约翰D 'Errico

当你改变界限时,你改变了隐变换。它仍然会找到一个最小值,但是问题已经改变了,所以没有绝对的保证它会收敛到相同的解。当您遇到多个局部最小化器的问题时,任何优化工具都可能遇到这个问题。

柯克史密斯

我发现了一些奇怪的行为。我有7个变量的上限值[0,1]。我最后两次的结果低于0.01。接下来,我将最后两个变量的边界更改为[0,0.4],并得到一组新的值....这难道不应该和他们在第一轮比赛中从未接近0.4的成绩一样吗?
无论如何,我只是添加了一些像e*(max(x-1,0)+max(-x,0))为我的ub和lb与原始fminsearch,它工作得很好。(选择足够大的)

约翰D 'Errico

抱歉,彼得罗,但如果你用Nelder-Mead解法来解决一个20变量的问题,你是在浪费你的时间,恐怕我也是。我不会尝试调试大量的代码来解决一个永远不应该被扔到这个工具上的问题。

彼得罗

约翰在这里可以找到我的代码。。。。

http://www.mathworks.se/matlabcentral/newsreader/view_thread/320630#879608

约翰D 'Errico

彼得罗:如果没有一个具体的例子来说明问题,我就不知道发生了什么。对于起始点是否真的满足约束条件,您可能会有误解。你可能不恰当地提供了约束条件或目标本身。可能有漏洞。或者,也许你的起始点恰好在一个约束边界上,或者甚至在这个边界上。我怎么能猜到呢?同样,fmincon不需要一个可行的解决方案来启动,尽管这肯定会有帮助。所以fmincon的成功是无关紧要的,因为这是不同的算法。

彼得罗

所提供的起点满足所有约束条件。

约翰D 'Errico

Fmincon使用了一种不同的算法,可以更好地处理不可行的初始值。fminsearchcon使用的惩罚风格在这里失败了,因此您需要提供一个至少满足您的约束的起点。

彼得罗

谢谢你约翰!我收到了这条信息:

初始值不可行(非线性不等式失效)。

但是在相同的起点上,使用fmincon进行优化是可行的。你有什么建议给我吗?

谢谢。

顺致敬意,

彼得罗

约翰D 'Errico

Pietro-函数句柄可以轻松地传递参数。例如,假设您希望找到函数(x-a)^2中某个固定值a的最小值(是的,您和我都知道最小值发生在a,但计算机没有,我觉得太懒了,无法更具创造性。)

我的乐趣=@(x,a)(x-a)。^2;
x0 = 1;
求无约束最小值,a = 12。
[xmin,fmin] = fminsearchbnd(@(x) myfun(x,12),x0)

xmin =
12
fmin=
6.18466949693273即使

上面的例子,实际上只是将调用直接传递给fminsearch,但重点是如何传递。

%求解受约束的最小值,a=12。
ub=5;
[xmin, fmin] = fminsearchbnd (@ (x) myfun (x, 12), x0,[],乌兰巴托)

xmin =
5
fmin=
49

当然,最小值是在上限,在离a最近的点,这是允许的。

彼得罗

伟大的功能。如何使用函数句柄将额外的参数传递给目标函数?

达维德

谢谢你约翰!我固定它。

再次感谢。

约翰D 'Errico

我应该指出,这些工具使用fminsearch作为优化器,只是提供一个覆盖层来实现约束。这意味着fminsearch忽略的任何参数在这里也会被忽略。所以diffminchange和diffmaxchange是完全无关的。

由于没有任何数据,我无法真正测试出发生了什么。但是我看了一下代码,通常当你得到一个nan作为结果时,它来自于某个坏的参数。

因此,我在代码中做了一些调试工作,让您在生成nan后立即使用调试器。在执行代码之前,请执行以下操作之一:

dbstop如果naninf

我有点困惑为什么你也在对角线矩阵上调用det。如果简单地用元素的乘积来做,效率会高得多。既然你要计算行列式的对数,那么就把它作为元素对数的和,避免潜在的潜流或溢出。

无论如何,在你做任何优化之前,一定要测试你的目标函数。确保它符合您的期望,生成有效的结果,并且当您打乱参数时,结果会发生变化。接下来,当你运行优化器时,你看到奇怪的事情发生,在优化器中设置“Display”选项为“iter”。事实上,我每次针对任何问题运行优化时都是这样做的。确认它正在做一些聪明的事情。参数是否在改变?(注意,fminsearchbnd转换参数,因此fminsearch使用的数值与您预期的不同。)

最后,对于基于Nelder-Mead的工具,9个参数是我所推荐的上限,但它应该运行,尽管有点慢。

达维德

亲爱的约翰,很不错的功能!效果很好。我在优化问题中用过它。然而,在我的上一个代码中,我遇到了一个问题。输出是NaN,函数参数似乎没有优化。也许你可以帮我……这是我的代码。我从excel表格中获取必要的数据。

我不知道问题出在哪里。提前谢谢!干杯

函数(H, par、输出)= mygarch ()
格式的短
data = xlsread (' select3stocks.xlsx ' 2 ' A1: D249 ');
数据1=数据(1:149,:);
data2 =数据(150:199:);
(L1, L2) = (data2)大小;

C0 = (0.01, 0.02, 0.03) ';
A0 = (0.04, 0.02, 0.06) ';
B0 = (0.05, 0.09, 0.03) ';
matr=[C0,A0,B0];
par0 =重塑(matr 1 9);

X = 0 (L1-1 L2);
M =平均(DATA2);
X (1:) = data2 (1:) - m;

s=0;

H = 0 (L1-1, L2);
H (1) = (std (data1)) ^ 2;

磅=零(1,9);
ub=一(1,9);

选择= optimset(“TolX”“麦克斯特”,50000年,1平台以及DiffMaxChange, 0.00005,“DiffMinChange”,0.00001,“MaxFunEvals”,10000000);
[par,output]=fminsearchbnd(@maxlikelyhood,par0,lb,ub,options);

函数y = maxlikelyhood (par)
C = par (1:3);A = par (6);B = par(七);
因为我= 2:L1
对于j=1:L2
H (i, j) = C (j) + (j) * X(张,j) ^ 2 + B (j) * H(张,j);
结束
X(i,:)=data2(i,:)-m;
D =诊断接头(H(我,:));
s = s + 3 *日志(2 *π)+日志(侦破(D)) + X(我,:)* D . ^ (2) * X(我:)';
结束
Y = S;
结束

结束

约翰D 'Errico

(我已经修复了关于outputfcn问题的bug,并重新发布了它。新的版本应该会在今天上午的某个时候出现。)

至于Stefan的问题消失,任何时候你扔与由10月20日至30日在权力的任何数字优化想到严肃的事情出差错变化,变量的问题。这是一个没有任何字面任何数字工具。和收敛容差(TolX)设置为EPS是一样愚蠢的,尤其是当你通过参数的数量,很多订单会有所不同。

本质上,你问的是一个变量,它可以在1和1e30之间变化,必须被计算到大约2e-16的绝对精度。

一个常见的解决方案是标准化你的变量,从而使两者至少一个数量类似订单。如果你试图解决一个问题,其中一个变量具有1E20界至5E20,和第二个变量是在区间1E-6为界到1E-5,归一化变量都为1阶将使完整意义上的。但是,你的每一个变量的10多力量有所不同!

关于计算,所有的新手都需要学习的一件事是,当事物以10的许多次方变化时,使用日志!让fminsearch改变变量的log10,这样它们的下界就像[0,-6],上界就像[30,0]。现在,在函数内部,在使用参数之前,取参数的10次方。对返回的输出执行同样的操作。就fminsearch而言,你的数字看起来完全正常,但你的目标看到的数字在适当的比例。

你会发现,任何的优化运行得更加愉快,当你这样做,因为现在的变量是非常漂亮的标准化。当你在日志空间工作的所有数学的工作更简单。其实,这无疑是自然的方式来与10。一个很好的结果的许多权力改变变量的工作是在TolX公差成为变量相对公差,这东西肯定更有道理。

不要用eps作为收敛容忍度。Fminsearch将永远不能给你一个合理的尝试收敛,即使是10000个函数值,有一个细微的公差。fminsearch会一直迭代,直到函数求值完毕。使用有意义的、现实的宽容。你可能只是设置了一个公差,因为荒谬的变量缩放。

Stefan

下面的测试结果很奇怪:
----------------------------------
G0bnd 2.22e + 014 L0bnd 2.707e-006

2 .中国大陆

----------------------------------

功能测试()
'关于' 选项= optimset( '显示',...
“MaxFunEvals”,1 e4,…
'MAXITER',1E4,...
TolFun, eps,……
TolX, eps,……
“FunValCheck”、“on”。。。
);

w = 150 e-6;
xData = 1 e-6:1e-6: w;
G0 = 2 e14灯头;
L0 = 3 e-6;
yData=G0*exp(-xData./L0);

start_params = [G0, L0];
最小参数=[1,1e-6];
Max_params = [1e30, 1];


情节(xData yData, - r);
持有(上);


result_params = fminsearchbnd (@fitG_error_function start_params、min_params max_params,选项,xData, yData);
['G0bnd ' num2str(result_params(1),4) 'L0bnd num2str (result_params (2), 4)]
情节(xData result_params (1) * exp (-xData. / result_params (2)), ' g ');

结果参数=fminsearch(@fitG\u error\u函数、开始参数、选项、扩展数据、yData);
['G0'num2str(结果参数(1),4)'L0'num2str(结果参数(2),4)]
情节(xData result_params (1) * exp (-xData. / result_params (2)), - b);


function fiterror = fitG_error_function(start_params,xData,yData)
Fitted_Curve= start_params(1) * exp(-xData./start_params(2));
Error_Vector = Fitted_Curve - yData;
fiterror =总和(Error_Vector。^ 2);
结果:fiterror=fiterror;
结束
结束

罗曼

功能很好,很方便。

不过我注意到一个小错误。如果没有调用fminsearch,则该函数返回输出。Funcount,而它返回输出。否则funcCount。

约翰D 'Errico

很抱歉前一段时间我一直在玩各种各样的选择。当最新更新激活时,标题上的名称现在将是正确的。

马丁·理查德

约翰,
我已经用这个函数很多年了。爱死它了。也许您想要更改函数名,以便它适合新版本中的文件名(新文件中的fminsearchbnd3)。

约翰D 'Errico

嗨,Kathleen -之前有人问过我关于引用我的许多作品的问题。我们提出了一些选择,详细如下:

http://blogs.mathworks.com/desktop/2010/12/13/citing-file-exchange-submissions/

凯萨琳

嗨,约翰

我经常使用fminsearchbnd,我想在我的作品中引用它。你有想用的推荐信吗?
谢谢
凯萨琳

凯萨琳

嗨,约翰

我经常使用fminsearchbnd,我想在我的作品中引用它。你有想用的推荐信吗?
谢谢
凯萨琳

约翰D 'Errico

Nick - fminsearchbnd是一个简单的优化器,是fminsearch的近亲。它所关心的只是找到一个最优值,它并不知道你的目标是基于某种最小二乘估计问题。如果你需要置信限,一个简单的解决方法是对函数在最优处的线性逼近,计算在那一点的雅可比矩阵。计算参数的近似置信区间是一个简单的问题。你可以在我的优化技巧和技巧中找到解释这个过程的例子,也在文件交换中。

布伦南史密斯

谢谢!非常有用的

尼克·M。

嗨,约翰

这是一部伟大的作品,我用过它,也为我工作过。不过我有个问题。我使用了fminsearchbnd,它转换了参数,我如何计算这些参数的不确定性?(协方差矩阵?)
谢谢!

克利斯朵夫

亲爱的约翰,

非常感谢这个非常有用的程序。如果可以的话,我有一个问题

我处理“物理”问题的优化,牢记我所能获得的制造精度。例如,我知道我不能精确地加工我的参数(定义我优化的几何)。对我来说,设置为12.000、12.001甚至12.01的参数将为输出函数提供几乎相同的值。
因此,我希望能够确保参数在优化过程中移动至少一个最小的“增量”,例如1e-2。
这是我的搜索引擎能处理的吗?

延昆

非常有用的。

ks

非常感谢。它太棒了!:)

奥列格

这是伟大的!谢谢你!

Prabuddha穆克吉

非常感谢……非常有用的

尼科

非常有用…谢谢!

领域Aktas

优秀的代码…

约翰D 'Errico

瑞安,

这实在不是一个界约束问题。你的约束是一个一般的,线性或非线性不等式约束。

简单的解决方案是使用允许显式线性或非线性约束的代码。在外汇交易所有一些。事实上,我在FEX上的fminsearchcon就是这样做的,当约束被违反时,通过对问题施加惩罚。你也可以看看Rody Oldenhuis的《optimization》。此代码允许对所有表单进行显式约束。

然而,使用fminsearchbnd有一种简单的方法来解决这类问题。使用另一类转换。例如,假设一个人希望最小化函数f(x,y),受到x <= erf(y)的“界限”约束。

将你的问题转化为

U = x + erf(y)
v=x-erf(y)

很明显,v必须以0为上界。所以使用fminsearchbnd来优化二维区域(u,v)在你的目标函数中,对于(u,v)的任意值,你将计算参数(x,y)为

X = (u + v)/2;
Y = erfinv(u - x);

现在可以求函数f(x,y)了。

唯一的问题是如果你对x和y也有固定的界限,但是很多其他的变换也可以。例如,这个转换:

u = x
v=x-erf(y)

将仍然允许对参数x进行简单的绑定约束,以及允许非线性约束x<=erf(y)作为绑定约束。

约翰

瑞恩•韦伯

伟大的功能。多次使用。

然而,现在我有一个更棘手的问题其中一个边界是一个变量的函数。使UB成为xtrans的函数是可能的,但是如果变换(k)的情况仅仅由约束的初始数值决定,fminsearchbnd将如何确定这个意图?想法吗?

将要

绝佳的修饰,以创建一个非常有用的算法。谢谢!

Srinivasa Chemudupati

太感谢你了,约翰!!

克里斯的男人

美丽属于你。

乌梅什拉帕特纳

谢谢!帮了我很多忙。

利奥尼达

谢谢你约翰!

Chirackel Yoonus

非常有用的

m P。

m P。

美丽的工作为自己的优化问题。谢谢你约翰。

肯购买

注意:我提交了一个稍作修改的版本,其中包括输出和绘图函数,以及稍作改进的对varargin的处理。寻找fminsearch。

原始版本非常优秀,非常有用-我希望更改没有破坏任何东西。

梅特萨布奇酒店

优秀的代码-完成工作!

约瑟夫·埃利希曼

真的是工作。帮助很多!Matlab应该将其纳入其库中。

亚历克斯Chirokov

我真的很喜欢这样的代码:它是写得很好,非常有用。

约翰D 'Errico

有关线性和非线性不等式约束,请参见fminsearchcon。当与使用转换实现的绑定约束相结合时,等式约束更难实现-John。

杨张

我喜欢这个程序,你认为这是可能将它扩大到处理线性约束?

劳伦·库尼

谢谢你的这个伟大的项目!它节省了我很多时间和挫折!

伊莱汤姆

确实不错。

蔡基米

太棒了。我无法用fmincon解决我的问题,但用这个文件解决了。我真的很感激。

nati这一句

Dmitrey Kroshko

我将John D'Errico文件连接到OpenOpt项目
//www.tatmou.com/matlabcentral/fileexchange/loadFile.do?objectId=13115&objectType=file
并通知他(我希望我的信通过了反垃圾邮件过滤器)
如果有人装腔作势,我保证排除这一个
顺便说一下,现在默认的内部解算器是Shor ralg with AST,这比当前的fminsearch实现要好,至少,对于那些我尝试过的任务。此外,它还可以处理用户提供的(子)梯度信息,并对John代码进行相应的更改。

Umberto。

是的它的好

效果很好!

CC戈麦斯

写好。

G.H.饶

优秀的项目。在这些线上,我成功地对Matlab版本14的遗传算法程序'ga'应用了边界

塞德里克penard

工作很好,很棒!谢谢。

鲁伊·米盖尔

我真的很需要它!非常感谢。
对我来说是完美的。

Kaushik b

非常感谢。它真的很有用,工作也很漂亮。

埃文·帕尔默

工作真的很好,非常方便!不错的工作!

Vijit Nair

这是一个很棒的功能。谢谢你约翰。

肯坎贝尔

解决一个常见问题的好方法

更新

1.4.0.0

修正了当fminsearch从未被实际调用时的outputfcn错误

1.0.0.0

Bug修复 - 允许OutputFcn正常运行,在正确的领域提供的参数值。

更新FX选择提名结构-增加了演示,测试和文档文件

2.1版:修复了一个bug,当一些变量被固定,而其他变量被上下绑定。

版本3:也解决了无界问题。

允许用户通过设置较低的值来修复变量
上界是相等的。

修正了一个变量有对偶边界的问题
从边界的中点开始。

MATLAB版本兼容性
创建R14SP1
与任何版本兼容
平台的兼容性
窗户 macOS Linux

FMINSEARCHBND /演示/ html /