主要内容

创建问题结构

关于问题的结构

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

使用createOptimProblem函数

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

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

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

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

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

    选择= optimoptions (@fmincon、“算法”、“内点”);
  5. 输入

    问题= createOptimProblem (解算器,

    在哪里解算器是你当地的解算器的名称:

    • GlobalSearch:“fmincon”

    • MultiStart的选择是:

      • “fmincon”

      • “fminunc”

      • “lsqcurvefit”

      • “lsqnonlin”

      帮助选择,看到优化决策表

  6. 设置一个初始点使用“x0”参数。如果你的初始点xstart,你的解算器fmincon现在,你的条目

    问题= createOptimProblem (fmincon, x0, xstart,
  7. 包括你的目标函数的函数处理客观的:

    问题= createOptimProblem (fmincon, x0, xstart,…“客观”,@objfun,
  8. 设置边界和其他限制适用。

    约束 的名字
    下界 “磅”
    上界 乌兰巴托的
    矩阵Aineq对于线性不等式Aineq xbineq “Aineq”
    向量bineq对于线性不等式Aineq xbineq “bineq”
    矩阵Aeq线性等式Aeq x=说真的 “Aeq”
    向量说真的线性等式Aeq x=说真的 “说真的”
    非线性约束函数 “nonlcon”
  9. 如果使用lsqcurvefit当地的解算器,包括输入数据和响应数据的向量,命名“xdata”“ydata”分别。

  10. 最佳实践:验证问题结构通过运行你的解算器结构。例如,如果您的当地的能手fmincon:

    [x, fval exitflag、输出]= fmincon(问题);

例子:创建一个结构问题createOptimProblem

这个例子最小化的功能运行解算器,受到约束x1+ 2x2≥4。我们的目标是

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

使用内点算法的fmincon,并设置起始点(2、3)

  1. 编写一个函数处理目标函数。

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

    一个= [1,2];b = 4;
  3. 创建本地选择使用内点算法:

    选择= optimoptions (@fmincon、“算法”、“内点”);
  4. 创建结构的问题createOptimProblem:

    问题= createOptimProblem (“fmincon”,…x0,(2, 3),“客观”,sixmin,……‘Aineq’,‘bineq’, b,“选项”,选择)
  5. 由此产生的结构:

    问题=结构体字段:目的:@ (x) (4 * x (1) ^ 2 - 2.1 * (1) ^ 4 + x (1) ^ 6/3 + x (1) * (2) 4 * x (2) ^ 2 + 4 * x (2) ^ 4) x0: [2 x1双]Aineq: [1 - 2] bineq: 4 Aeq:[]说真的:[]磅:[]乌兰巴托:[]nonlcon:[]解算器:“fmincon”选项:[1 x1 optim.options.Fmincon]
  6. 最佳实践:验证运行结构的问题解决者的结构:

    [x, fval exitflag、输出]= fmincon(问题);

相关的话题