有些问题要求你找到一个满足所有约束条件的点,而不需要最小化目标函数。例如,假设你有以下约束条件:
做任何点
满足的约束?为了找出答案,编写一个函数,返回结构字段中的约束Ineq
.用二元向量写出约束条件
而不是
.把每个不等式写成函数
,意思是不平等
从不等式的两边减去每个不等式的右边。要启用绘图,请以向量化的方式编写函数,其中每一行代表一个点。此helper函数的代码名为objconstr
,出现在这个例子到此结束.
画出三个函数满足等式的点 和 ,并通过绘制函数值为-1/2的等高线来表示这些不等式。
[XX, YY] = meshgrid (2:0.1:2 4:0.1:2);ZZ = objconstr ([XX (:), YY (:))) .Ineq;ZZ =重塑(ZZ,[大小(XX), 3]);h =图;甘氨胆酸ax =;轮廓(ax, XX, YY, ZZ (:,: 1), [0] 1/2,“r”,“ShowText”,“上”);持有在轮廓(ax, XX, YY, ZZ (:,: 2), [0] 1/2,“k”,“ShowText”,“上”);轮廓(ax, XX, YY, ZZ (:,:, 3), [0] 1/2,“b”,“ShowText”,“上”);持有从
图中显示,在[1.75,-3]附近存在可行点。
设置-5的下界和3的上界,并使用surrogateopt
.
rng (1)%的再现性磅= (5,5);乌兰巴托= (3 3);[x, fval exitflag、输出试验]= surrogateopt (@objconstr磅,乌兰巴托)
surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数求值限制。
x =1×21.7312 - -3.0312
Fval = 1x0空双行向量
exitflag = 0
输出=结构体字段:rngstate: [1x1 struct] message: 'surrogateopt stopped because it exceeded the function evaluation limit by…'
试验=结构体字段:X: [200x3 double] [200x3 double]
在返回的溶液上检查可行性x
.
disp (output.ineq)
-0.0800 -0.2083 -0.7625
同样地,对函数求值objconstr
在返回溶液处x
.
disp (objconstr (x) .Ineq)
-0.0800 -0.2083 -0.7625
等价于检查Ineq
字段试用
解决方案的结构x
.首先,找到的索引x
在试用X
字段。
indx = ismember(试验。X, X,“行”);disp (trials.Ineq (indx:))
-0.0800 -0.2083 -0.7625
所有约束函数值均为负值,表示该点x
是可行的。
查看被评估的可行点surrogateopt
.
选择= optimoptions (“surrogateopt”);indx = max(trials.Ineq,[],2) <= opts. constraintolerance;可行点指数图(h);持有在情节(trials.X (indx, 1), trials.X (indx, 2),‘*’([1 2]) ylim([-3.5 -2.5]) hold从
此代码创建objconstr
helper函数。
函数F = objconstr(x) c(:,1) = (x(:,2) + x(:,1).^2)^ 2 + 0.1 * x(:, 2)。^ 2 - 1;C (:,2) = x(:,2) - exp(-x(:,1)) + 3;C (:,3) = x(:,2) - x(:,1) + 4;f.Ineq = c;结束