创建问题结构
关于问题的结构
使用GlobalSearch
或MultiStart
求解者,首先必须创建一个问题结构。创建问题结构的推荐方法是使用createOptimProblem
函数.您可以手动创建结构,但是这样做很容易出错。
使用createOptimProblem
函数
方法创建问题结构,请遵循以下步骤createOptimProblem
函数。
将目标函数定义为文件函数或匿名函数。有关详细信息,请参见计算目标函数.如果你的求解器是
lsqcurvefit
或lsqnonlin
,确保目标函数返回一个向量,而不是标量。如果相关的话,创建约束,比如边界和非线性约束函数。有关详细信息,请参见写约束.
创建一个起点。例如,创建一个三维随机起点
xstart
:xstart = randn (3,1);
(可选)使用
optimoptions
.例如,选择= optimoptions (@fmincon、“算法”、“内点”);
输入
问题= createOptimProblem (解算器,
在哪里
解算器
是本地解算器的名称:为
GlobalSearch
:“fmincon”
为
MultiStart
的选择是:“fmincon”
“fminunc”
“lsqcurvefit”
“lsqnonlin”
关于选择的帮助,请看优化决策表.
方法设置初始点
“x0”
参数。如果你的起始点是xstart
,求解器为fmincon
,你的入口是现在问题= createOptimProblem (fmincon, x0, xstart,
包含目标函数的函数句柄
客观的
:问题= createOptimProblem('fmincon','x0',xstart,…“客观”,@objfun,
设置边界和其他适用的约束条件。
约束 的名字 下界 “磅”
上界 乌兰巴托的
矩阵 Aineq
对于线性不等式Aineq x
≤bineq
“Aineq”
向量 bineq
对于线性不等式Aineq x
≤bineq
“bineq”
矩阵 Aeq
线性等式Aeq x
=说真的
“Aeq”
向量 说真的
线性等式Aeq x
=说真的
“说真的”
非线性约束函数 “nonlcon”
如果使用
lsqcurvefit
局部求解器,包括输入数据和响应数据的向量,命名为“xdata”
而且“ydata”
分别。最佳实践:通过在结构上运行求解器来验证问题结构。例如,如果您的本地求解器是
fmincon
:[x, fval exitflag、输出]= fmincon(问题);
示例:创建一个问题结构createOptimProblem
这个例子最小化了函数运行解算器,受限于约束条件x1+ 2x2≥4.我们的目标是
sixmin = 4x2- 2.1x4+x6/ 3 +xy- 4y2+ 4y4. | (1) |
使用内点
算法的fmincon
,并将起始点设置为(2、3)
.
为目标函数写一个函数句柄。
sixmin = @ (x) (4 * x (1) ^ 2 - 2.1 * (1) ^ 4 + x(1) ^ 6/3……+ x(1)*x(2) - 4*x(2)^2 + 4*x(2)^4;
写出线性约束矩阵。将约束更改为“小于”形式:
一个= [1,2];b = 4;
创建本地选项以使用
内点
算法:选择= optimoptions (@fmincon、“算法”、“内点”);
创建问题结构
createOptimProblem
:问题= createOptimProblem('fmincon',…x0,(2, 3),“客观”,sixmin,……‘Aineq’,‘bineq’,b,“选项”,选择)
由此产生的结构:
问题= 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 optimal .options. fmincon]
最佳实践:通过在结构上运行求解器来验证问题结构:
[x, fval exitflag、输出]= fmincon(问题);