Main Content

本页采用了机器翻译。点击此处可查看英文原文。

创建问题结构体

关于问题结构体

要使用 GlobalSearchMultiStart 求解器,您必须首先创建一个问题结构体。创建问题结构体的推荐方法是使用 createOptimProblem 函数。您可以手动创建结构体,但这样做容易出错。

使用 createOptimProblem 函数

按照以下步骤使用 createOptimProblem 函数创建问题结构体。

  1. 将您的目标函数定义为文件或匿名函数。有关详细信息,请参阅计算目标函数。如果您的求解器是 lsqcurvefitlsqnonlin,请确保目标函数返回一个向量,而不是标量。

  2. 如果相关,请创建约束,例如边界和非线性约束函数。有关详细信息,请参阅编写约束

  3. 创建一个起点。例如,要创建三维随机起点 xstart

    xstart = randn(3,1);
  4. (可选)使用 optimoptions 创建选项。例如,

    options = optimoptions(@fmincon,'Algorithm','interior-point');
  5. 输入

    problem = createOptimProblem(solver,

    其中 solver 是您的局部求解器的名称:

    • 对于 GlobalSearch'fmincon'

    • 对于 MultiStart,选项包括:

      • 'fmincon'

      • 'fminunc'

      • 'lsqcurvefit'

      • 'lsqnonlin'

      有关如何进行选择的帮助,请参阅优化决策表

  6. 使用 'x0' 参数设置初始点。如果您的初始点是 xstart,而您的求解器是 fmincon,那么您的输入现在是

    problem = createOptimProblem('fmincon','x0',xstart,
  7. objective 中包含目标函数的函数句柄:

    problem = createOptimProblem('fmincon','x0',xstart, ...
        'objective',@objfun,
  8. 设置适用的边界和其他约束。

    约束名称
    下界'lb'
    上界'ub'
    矩阵 Aineq 用于线性不等式 Aineq xbineq'Aineq'
    向量 bineq 表示线性不等式 Aineq xbineq'bineq'
    矩阵 Aeq 用于线性等式 Aeq x = beq'Aeq'
    向量 beq 用于线性等式 Aeq x = beq'beq'
    非线性约束函数'nonlcon'
  9. 如果使用 lsqcurvefit 局部求解器,则包括输入数据和响应数据的向量,分别命名为 'xdata''ydata'

  10. 最佳实践:通过在结构体上运行求解器来验证问题结构体。例如,如果您的局部求解器是 fmincon

    [x,fval,exitflag,output] = fmincon(problem);

示例:使用 createOptimProblem 创建问题结构体

此示例最小化 运行求解器 中的函数,并受到 x1 + 2x2 ≥ 4 的约束。目标是

sixmin = 4 x2 – 2.1 x4 + x6/3 + xy – 4 y2 + 4 y4(1)

使用 fminconinterior-point 算法,并将起点设置为 [2;3]

  1. 为目标函数编写一个函数句柄。

    sixmin = @(x)(4*x(1)^2 - 2.1*x(1)^4 + x(1)^6/3 ...
        + x(1)*x(2) - 4*x(2)^2 + 4*x(2)^4);
  2. 写出线性约束矩阵。将约束改为“小于”形式:

    A = [-1,-2];
    b = -4;
  3. 创建局部选项以使用 interior-point 算法:

    opts = optimoptions(@fmincon,'Algorithm','interior-point');
  4. 使用 createOptimProblem 创建问题结构体:

    problem = createOptimProblem('fmincon', ...
        'x0',[2;3],'objective',sixmin, ...
        'Aineq',A,'bineq',b,'options',opts)
  5. 得到的结构体:

    problem = 
    
      struct with fields:
    
        objective: @(x)(4*x(1)^2-2.1*x(1)^4+x(1)^6/3+x(1)*x(2)-4*x(2)^2+4*x(2)^4)
               x0: [2x1 double]
            Aineq: [-1 -2]
            bineq: -4
              Aeq: []
              beq: []
               lb: []
               ub: []
          nonlcon: []
           solver: 'fmincon'
          options: [1x1 optim.options.Fmincon]
  6. 最佳实践:通过在结构体上运行求解器来验证问题结构体:

    [x,fval,exitflag,output] = fmincon(problem);

相关主题