之间的非线性约束转换surrogateopt
形式和其他求解形式
为什么转换约束表单?
尝试各种求解方法,包括surrogateopt
对于具有非线性不等式约束的问题,必须在所要求的形式之间进行转换surrogateopt
和其他求解器需要的形式。
将从surrogateopt
结构形式的其他求解
目标函数objconstr (x)
为surrogateopt
返回一个结构。的Fval
字段包含目标函数值,一个标量。的Ineq
字段包含约束函数值的向量。的所有值Ineq
字段小于或等于零。正值表示违反约束。
其他求解器期望目标函数返回标量值,而不是结构。其他求解器也期望非线性约束函数返回两个输出,c (x)
而且量表(x)
,不是包含的结构c (x)
.
要转换surrogateopt
函数objconstr (x)
用于其他求解器:
将目标函数设为
@ (x) objconstr (x)。Fval
.将非线性约束函数设为
@ (x)协议(objconstr (x) .Ineq, [])
.
例如,
函数Ff = objconstr(x) Ff。Fval =范数(x)^2;ff。Ineq =范数(x - [5,8])^2 - 25;结束
求解一个约束极小化问题objconstr
,叫surrogateopt
.
Lb = [-10,-20];Ub = [20,10];Sol = surrogateopt(@objconstr,lb,ub)
Surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数计算限制。Sol = 2.3325 3.7711
来解决同样的问题fmincon
,将目标和约束分解为单独的函数。包括非线性等式约束为[]
通过使用交易
函数。
objfcn = @(x)objconstr(x).Fval;nlcon = @(x)deal(objconstr(x).Ineq,[]);
调用fmincon
用目标函数objfcn
和非线性约束函数nlcon
.
[林洋新能源,fvalf eflag、输出]=...fmincon (objfcn [0, 0 ],[],[],[],[], 磅,乌兰巴托,nlcon)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。solf = 2.3500 3.7600 fvalf = 19.6602 eflag = 1 output = struct with fields: iterations: 7 funcCount: 24 constrviolation: 0 stepsize: 2.0395e-05 algorithm: ' internal -point' firstorderopt: 4.9651e-06 cgiterations: 0 message: '(发现满足约束的局部最小值)。(()优化完成,因为目标函数在()可行方向上不下降,直到最优性公差的值之内,()且约束条件满足到约束公差的值之内。(() <停止条件详细信息>())(()优化完成:相对一阶最优性度量,6.602486e-07,()小于选项。OptimalityTolerance = 1.000000e-06,相对最大约束(违例)为0.000000e+00,小于选项。约束容忍= 1.000000e-06. (() '
你也可以使用patternsearch
或遗传算法
用同样的转换来解决问题。
从其他解算器转换为surrogateopt
结构形式
如果您在表单中为其他求解器编写了问题,请使用packfcn
函数将目标和非线性约束转换为结构形式surrogateopt
.如果目标函数是一个函数句柄@obj
非线性约束函数为@nlconst
,然后使用目标函数objconstr
为surrogateopt
.
Objconstr = packfcn(@obj,@nlconst);
在本例中,目标函数为Rosenbrock函数。
Ros = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
指定约束函数,将解限制在以点[1/3,1/3]为中心,半径为1/3的圆盘内。
函数测查[c] = circlecon c (x) = (x (1) 1/3) ^ 2 + (x (2) 1/3) ^ 2 - (1/3) ^ 2;Ceq = [];
在每个组件上设置-2和2的边界。
Lb = [- 2,2];Ub = [2,2];
解决问题的方法patternsearch
从[0,0]开始。
X0 = [0,0];x = patternsearch (ros, x0 ,[],[],[],[], 磅,乌兰巴托,@circlecon)
优化终止:网格尺寸小于选项。MeshTolerance和约束违反小于options. constraintolerance。X = 0.6523 0.4258
把问题转化为解决方法surrogateopt
.
Objconstr = packfcn(ros,@circlecon);Xs = surrogateopt(objconstr,lb,ub)
Surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数计算限制。Xs = 0.6543 0.4284