Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization Matlab:如何重复运行优化(fmincon)?_Optimization_Matlab - Fatal编程技术网

Optimization Matlab:如何重复运行优化(fmincon)?

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)

我正试图遵循在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) - 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