内容

与FMINSEARCH约束优化

函数testoptimize

介绍

使用

首先,定义一个测试函数:

clc,罗森= @ (x) (1 - x (1)) ^ 2 + 105 * (x (2) - x (1) ^ 2) ^ 2;

这是古典Rosenbr \”uck函数,它有一个全球最低f (x)=f([1])= 0。函数是相对难以优化,因为最低位于长狭窄的“谷”:

k = 0;范围= 5:0.1:5;z = 0 (101);我=范围m = 0;k = k + 1;j =射程m = m + 1;rosen z (k、m) = ((i, j));结束结束[y、x] = meshgrid(范围,范围);冲浪(x, y, z,“线型”,“没有”),视图(-150,30),轴

完全无约束优化问题,优化确实发现全球最低:

解决方案=优化(rosen [3 3])
解决方案= 1.0000 - 1.0000

实施一个下界的变量

(解决方案,fval) =优化(rosen [3 3], [2 2], [])
解决方案= 2.0000 4.0000 fval = 1.0000

在图中,这是怎样的

zz = z;zz (x > 2 & y > 2) =正;ZZ = z;ZZ (x < 2) =正;ZZ (y < 2) =正;图,冲浪(x, y, zz,“线型”,“没有”,“FaceAlpha”0.2)冲浪(x, y,老公,“线型”,“没有”)视图(-150,30),网格,轴plot3(解决方案(1)、解决方案(2)fval + 1 e3,“g”。,“MarkerSize”,20)

同样,强加一个上界收益率

解决方案=优化(rosen [3 3], [], [0.5 - 0.5]) zz = z;zz (x < 0.5和< 0.5)=正;ZZ = z;ZZ (x > 0.5) =正;ZZ (y > 0.5) =正;图,冲浪(x, y, zz,“线型”,“没有”,“FaceAlpha”0.2)冲浪(x, y,老公,“线型”,“没有”)视图(150,30),网格,轴plot3(解决方案(1)、解决方案(2)fval + 1 e3,“g”。,“MarkerSize”,20)
解决方案= 0.5000 - 0.2500

优化与x(2)固定在3。在这种情况下,优化只是消除了变量之前FMINSEARCH看来,本质上降低了问题的维数。这是特别有用,当维度的数量N变得大。

3优化(rosen[3],[负3],[正3])
ans = 1.7314 - 3.0000

也可以使用一般非线性约束。一个简单的例子:

非线性不等式:

$ $ \√6 {x_1 ^ 2 + x_2 ^ 2} \ leq 1 $ $

非线性等式:

$ $ x_1 ^ 2 + x_2 ^ 3 = 0.5 $ $

选择= optimset (“TolFun”1 e-8“TolX”1 e-8);[溶胶,fval exitflag、输出]=优化(rosen [3 3], [], [], [],[]、[][],@nonlcon,[],选项);

请注意,nonlcon子功能,下面列出。在一个图中,这是怎样的

zz = z;zz (√x。y ^ 2 +。^2) <= 1) = inf; ZZ = z; ZZ(sqrt(x.^2 + y.^2) >= 1.2) = inf; zZ = z; zZ(x.^2 + y.^3 >= 0.5 + 0.1) = inf; zZ(x.^2 + y.^3 <= 0.5 - 0.1) = inf; figure, hold冲浪(x, y, zz,“线型”,“没有”,“FaceAlpha”0.2)冲浪(x, y,老公,“线型”,“没有”)xX = x (isfinite (zZ));xX = xX (:);yY = y (isfinite (zZ));xX = xX (:);zZ = zZ (isfinite (zZ));zZ = zZ (:);(xX,第1)= (xX)进行排序;yY = yY(第1);zZ = zZ(第1);xyz = (xX, yY, zZ);i = 1:长度(xX) 1%行命令有所* *不方便…l =线([xyz(我,1);xyz (i + 1, - 1)]、[xyz(我,2);xyz (i + 1, 2)]、[xyz(我,3);xyz (i + 1, 3)]);集(l,“颜色”,“r”,“线宽”,2)结束视图(150年,50),网格,轴plot3 (sol(1)溶胶(2),fval + 1 e3,“g”。,“MarkerSize”,20)

注意,输出结构包含一个字段“constrviolation”:

输出
输出=迭代:123 funcCount: 230算法:直接Nelder-Mead单纯形搜索的信息:[1 x196 char] constrviolation: [1 x1 struct]

显示所有的内容约束满足:

output.constrviolation
ans = nonl_eq: {[0] [0]} nonl_ineq: {[0] [0]}
结束
函数测查[c] = nonlcon c (x) =规范(x) - 1;测查x = x (1) ^ 2 + (2) ^ 3 - 0.5;结束