创建问题结构体
关于问题结构体
要使用 GlobalSearch
或 MultiStart
求解器,您必须首先创建一个问题结构体。创建问题结构体的推荐方法是使用 createOptimProblem
函数。您可以手动创建结构体,但这样做容易出错。
使用 createOptimProblem
函数
按照以下步骤使用 createOptimProblem
函数创建问题结构体。
将您的目标函数定义为文件或匿名函数。有关详细信息,请参阅计算目标函数。如果您的求解器是
lsqcurvefit
或lsqnonlin
,请确保目标函数返回一个向量,而不是标量。如果相关,请创建约束,例如边界和非线性约束函数。有关详细信息,请参阅编写约束。
创建一个起点。例如,要创建三维随机起点
xstart
:xstart = randn(3,1);
(可选)使用
optimoptions
创建选项。例如,options = optimoptions(@fmincon,'Algorithm','interior-point');
输入
problem = createOptimProblem(solver,
其中
solver
是您的局部求解器的名称:对于
GlobalSearch
:'fmincon'
对于
MultiStart
,选项包括:'fmincon'
'fminunc'
'lsqcurvefit'
'lsqnonlin'
有关如何进行选择的帮助,请参阅优化决策表。
使用
'x0'
参数设置初始点。如果您的初始点是xstart
,而您的求解器是fmincon
,那么您的输入现在是problem = createOptimProblem('fmincon','x0',xstart,
在
objective
中包含目标函数的函数句柄:problem = createOptimProblem('fmincon','x0',xstart, ... 'objective',@objfun,
设置适用的边界和其他约束。
约束 名称 下界 'lb'
上界 'ub'
矩阵 Aineq
用于线性不等式Aineq x
≤bineq
'Aineq'
向量 bineq
表示线性不等式Aineq x
≤bineq
'bineq'
矩阵 Aeq
用于线性等式Aeq x
=beq
'Aeq'
向量 beq
用于线性等式Aeq x
=beq
'beq'
非线性约束函数 'nonlcon'
如果使用
lsqcurvefit
局部求解器,则包括输入数据和响应数据的向量,分别命名为'xdata'
和'ydata'
。最佳实践:通过在结构体上运行求解器来验证问题结构体。例如,如果您的局部求解器是
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) |
使用 fmincon
的 interior-point
算法,并将起点设置为 [2;3]
。
为目标函数编写一个函数句柄。
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);
写出线性约束矩阵。将约束改为“小于”形式:
A = [-1,-2]; b = -4;
创建局部选项以使用
interior-point
算法:opts = optimoptions(@fmincon,'Algorithm','interior-point');
使用
createOptimProblem
创建问题结构体:problem = createOptimProblem('fmincon', ... 'x0',[2;3],'objective',sixmin, ... 'Aineq',A,'bineq',b,'options',opts)
得到的结构体:
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]
最佳实践:通过在结构体上运行求解器来验证问题结构体:
[x,fval,exitflag,output] = fmincon(problem);