Optimization Matlab:如何重复运行优化(fmincon)?
我正试图遵循在MATLAB中使用优化工具箱的教程。具体来说,我有一个函数Optimization Matlab:如何重复运行优化(fmincon)?,optimization,matlab,Optimization,Matlab,我正试图遵循在MATLAB中使用优化工具箱的教程。具体来说,我有一个函数 f = exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1)+b 受限制: (x(1))^2+x(2)-1=0, -x(1)*x(2)-10<=0. 步骤2:为非线性约束编写一个文件confuneq.m function [c, ceq] = confuneq(x) % Nonlinear inequality constraints c = -x(1)*x(2)
f = exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1)+b
受限制:
(x(1))^2+x(2)-1=0,
-x(1)*x(2)-10<=0.
步骤2:为非线性约束编写一个文件confuneq.m
function [c, ceq] = confuneq(x)
% Nonlinear inequality constraints
c = -x(1)*x(2) - 10;
% Nonlinear equality constraints
ceq = x(1)^2 + x(2) - 1;
步骤3:调用约束优化例程
x0 = [-1,1]; % Make a starting guess at the solution
options = optimoptions(@fmincon,'Algorithm','sqp');
[x,fval] = fmincon(@objfun,x0,[],[],[],[],[],[],...
@confuneq,options);
经过21次功能评估后,生成的解决方案
x, fval
x =
-0.7529 0.4332
fval =
1.5093
更新: 我试过你的答案,但你的第二步遇到了问题。基本上,我只是把我的第二步填到你的第二步(在“优化就像以前一样”的注释下面)。
%initialize list of targets
b = 0:1:20;
%preallocate/initialize result vectors using zeros (increases speed)
opt_x = zeros(length(b));
opt_fval = zeros(length(b));
>> for idx = 1, length(b)
objfun = @(x)objfun_builder(x,b)
%optimization just like before
x0 = [-1,1]; % Make a starting guess at the solution
options = optimoptions(@fmincon,'Algorithm','sqp');
[x,fval] = fmincon(@objfun,x0,[],[],[],[],[],[],...
@confuneq,options);
%end the stuff I fill in
opt_x(idx) = x
opt_fval(idx) = fval
end
但是,它给我的输出是:
Error: "objfun" was previously used as a variable, conflicting
with its use here as the name of a function or command.
See "How MATLAB Recognizes Command Syntax" in the MATLAB
documentation for details.
关于代码,您需要更改两件事:
b
更灵活,您需要设置另一个函数,返回所需目标函数的句柄,例如
function h = objfun_builder(x, b)
h = @(x)(objfun(x));
function f = objfun(x)
f = exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1) + b;
end
end
一种更优雅、更短的方法是,例如
毕竟,结果与上面一样。不过,对于Matlab初学者来说,这可能不那么直观
第二步
您需要调用
objfun = @(x)(objfun_builder(x,myB));
在工作区中创建目标函数。为了在间隔b=[0,20]上循环,使用以下循环
%initialize list of targets
b = 0:1:20;
%preallocate/initialize result vectors using zeros (increases speed)
opt_x = zeros(length(b))
opt_fval = zeros(length(b))
%start optimization of list of targets (`b`s)
for idx = 1, length(b)
objfun = @(x)objfun_builder(x,b)
%optimization just like before
opt_x(idx) = x
opt_fval(idx) = fval
end
@pyStarter,是的,我正在尝试使用循环。但是我应该在哪里声明循环呢?我在步骤1中尝试过,但它不起作用。请参阅我答案中的示例。@更新的问题:原始m文件是否仍在您的路径中?这可能是造成问题的原因。另一个原因可能是匿名函数的语法有问题。或者,您可以直接构造/传递匿名函数作为fmincon的参数,以避免歧义。我想我删除了原始的objfun.m文件(我没有删除约束文件)。这个页面值得一提:您能看到我的更新吗,我想我需要更多帮助,谢谢。
objfun = @(x)(objfun_builder(x,myB));
%initialize list of targets
b = 0:1:20;
%preallocate/initialize result vectors using zeros (increases speed)
opt_x = zeros(length(b))
opt_fval = zeros(length(b))
%start optimization of list of targets (`b`s)
for idx = 1, length(b)
objfun = @(x)objfun_builder(x,b)
%optimization just like before
opt_x(idx) = x
opt_fval(idx) = fval
end