我想解决
min f(x) s.t. x in X哪里
1) f(x)有一个以上的局部最小值
2) f(x)是光滑的,可以计算f(x)的梯度。
3) X是R的紧子集
我使用MultiStart在MatLab中寻找f(x)的所有局部极小值。根据文档关于GlobalSearch和MultiStart的比较,在我看来,我们可以使用MultiStart找到所有的局部极小值。但是,当我运行一个简单的测试函数时,MultiStart只输出全局最小值和全局最小值。我的问题是:使用MultiStart,我如何获得所有的最小值?
我的例子是f(x) = x^4 - x^2 + 1和X=[-10,10]。在X上,f(x)有两个局部极小值:x* = 2^{-0.5}和x* = -2^{-0.5}。两者实际上都是全局极小值和f(x*) =0.75。我的示例代码如下。Multistart只输出x* = 2^{-0.5} (具有初始值x0 = 1),而不输出x* = -2^{-0.5}。有办法同时输出这两种解决方案吗?
ms = MultiStart;
ms.Display = 'iter';
options_fmincon = optimoptions('fmincon','Display','off','GradObj','on','GradConstr','off','Algorithm','sqp');
problem = createOptimProblem('fmincon','objective',@(x)test_function(x),'x0',1,'lb',-10,'ub',10,'options',options_fmincon);
[x_multi,val_multi]= run(ms,problem,50)
function [val,grad] = test_function(x)
val = x^4-x^2+1;
if nargout>1
grad = 4*x^3-2*x;
end
end发布于 2016-09-28 16:45:25
要回答我自己的问题:通过MultiStart找到的局部极小值集在run(MultiStart,problem,50)的第五个输出参数中。
run(MultiStart,problem,50)有两个以上的输出变量。具体而言,有五项产出:
[out1,out2,out3,out4,out5] = run(MultiStart,problem,50)哪里
out1是最好的局部极小值--它是将f(x)从程序找到的局部极小集合中最大化的方法。
out2是out:out2 = f(out1)中目标函数的值。
out3是一个退出标志,它告诉我们为什么我们的程序收敛/失败了。
out4列出了关于迭代次数等的信息。
out5是一个包含所有相关输出信息的结构,包括程序找到的局部极小值列表。
https://stackoverflow.com/questions/39749411
复制相似问题