创建问题结构体
关于问题结构体
要使用 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);