教程为优化工具箱
本教程包含多个例子,展示如何使用两个解决非线性优化,fminunc
和fmincon
和如何设置选项。在本教程中列出的原则适用于其他非线性动力学等fgoalattain
,fminimax
,lsqnonlin
,lsqcurvefit
,fsolve
。
本教程的例子介绍这些任务:
一个目标函数最小化
减少与其他参数相同的功能
最小化目标函数与约束条件
获得一个更有效的或准确的解决方案通过提供梯度或麻绳,或通过改变选项
无约束优化的例子
考虑的问题找到一个最小的函数
绘制函数最小化的地方。
f = @ x (x, y)。* exp (- x ^ 2 y ^ 2) + (x ^ 2 + y ^ 2) / 20;fsurf (f (2, 2),“ShowContours”,“上”)
点附近的情节表明最低(1/2,0)。
通常你将目标函数定义为一个MATLAB®文件。在这种情况下,功能很简单定义为一个匿名函数。
有趣= @ (x) f (x (1), (2));
设置一个初始点寻找解决方案。
x0 =[闲置;0);
设置优化选项使用fminunc
默认的“拟牛顿”
算法。这个步骤确保教程中相同的工作在每一个MATLAB版本。
选择= optimoptions (“fminunc”,“算法”,“拟牛顿”);
认为迭代解算器执行计算。
选项。显示=“通路”;
调用fminunc
,一个没有约束的非线性最小值。
[x, fval exitflag、输出]= fminunc(有趣,x0,选项);
一阶迭代Func-count f (x)步长最优0 3 -0.3769 0.339 1 6 0.0284 -0.379694 -0.405023 1 0.286 - 2 9 1 3 12 -0.405233 0.00386 1 4 15 -0.405237 -0.405237 3.17 e-05 5 18 1 3.35 e-08局部最小值。优化完成因为梯度的大小小于最优值的宽容。
显示所找到的解决方案的解决者。
uncx = x
uncx =2×1-0.6691 - 0.0000
视图函数值的解决方案。
uncf = fval
uncf = -0.4052
示例使用的数量函数评估来衡量效率。视图的总数量评估函数。
output.funcCount
ans = 18
无约束优化的例子使用额外的参数
接下来,通过额外的参数作为附加参数的目标函数,首先利用MATLAB文件,然后通过使用一个嵌套的函数。
考虑目标函数与前面的示例。
参数化的函数(a, b, c)如下:
这个函数是一个转移和扩展版本的原始目标函数。
MATLAB文件函数
考虑一个MATLAB文件命名目标函数bowlpeakfun
定义如下。
类型bowlpeakfun
函数y = bowlpeakfun (x, a, b, c) % bowlpeakfun TUTDEMO目标函数的参数传递。% 2008年版权MathWorks公司y = (x (1)——)。* exp (- ((x (1)——) ^ 2 + (x (2) - b) ^ 2)) + ((x (1)——) ^ 2 + (x (2) - b) ^ 2) / c;
定义参数。
= 2;b = 3;c = 10;
创建一个匿名函数句柄MATLAB文件。
f = @ (x) bowlpeakfun (x, a, b, c)
f =function_handle与价值:@ (x) bowlpeakfun (x, a, b, c)
调用fminunc
找到最小。
x0 =[闲置;0);选择= optimoptions (“fminunc”,“算法”,“拟牛顿”);[x, fval] = fminunc (f, x0,选项)
局部最小值。优化完成因为梯度的大小小于最优值的宽容。
x =2×11.3639 - 3.0000
fval = -0.3840
嵌套函数
考虑到nestedbowlpeak
函数,它实现了目标作为一个嵌套的函数。
类型nestedbowlpeak
函数[x, fval] = nestedbowlpeak (a, b, c, x0,选项)% nestedbowlpeak TUTDEMO嵌套函数参数传递。% 2008年版权MathWorks公司[x, fval] = fminunc (x0, @nestedfun选项);函数y = nestedfun (x) y = (x (1)——)。* exp (- ((x (1)——) ^ 2 + (x (2) - b) ^ 2)) + ((x (1)——) ^ 2 + (x (2) - b) ^ 2) / c;结束结束
参数(a, b, c)可见到嵌套的目标函数nestedfun
。外部函数,nestedbowlpeak
称fminunc
通过目标函数,nestedfun
。
定义参数、初始猜测和选择:
= 2;b = 3;c = 10;x0 =[闲置;0);选择= optimoptions (“fminunc”,“算法”,“拟牛顿”);
运行优化:
[x, fval] = nestedbowlpeak (a, b, c, x0,选项)
局部最小值。优化完成因为梯度的大小小于最优值的宽容。
x =2×11.3639 - 3.0000
fval = -0.3840
这两种方法产生相同的答案,所以你可以使用你找到一个最方便。
约束优化的例子:不平等
一个约束考虑前面的问题:
约束集的内部倾斜椭圆。把目标函数绘制的轮廓一起倾斜椭圆。
f = @ x (x, y)。* exp (- x ^ 2 y ^ 2) + (x ^ 2 + y ^ 2) / 20;g = @ x (x, y)。* y / 2 + (x + 2) ^ 2 + (y2)。^ 2/2-2;fimplicit (g)轴([6 0 1 7])在fcontour (f)情节(-.9727 .4685,“罗”);传奇(“约束”,“f轮廓”,“最低”);持有从
情节表明,椭圆内的目标函数的最小值出现在右下角的椭圆的一部分。计算绘制最低,之前猜测的解决方案。
x0 = 1 [2];
设置优化选项用内点算法,在每次迭代中显示结果。
选择= optimoptions (“fmincon”,“算法”,“内点”,“显示”,“通路”);
解决非线性约束函数要求给两个输出,一个用于非线性不等式和一个用于非线性等式。给这两个输出,写约束使用交易
函数。
gfun = @ (x)协议(g (x (1), (2)), []);
把非线性约束求解器进行求解。这个问题没有线性等式或不等式或界限,所以通过[]参数。
[x, fval exitflag、输出]= fmincon(有趣,x0, []、[] [], [], [], [], gfun,选项);
一阶范数的Iter F-count f (x)可行性最优步骤0 3 2.365241 e-01 0.000 e + 00 1.972 e-01 1 6 1.748504 e-01 0.000 e + 00 1.734 e-01 2.260 e-01 2 10 -1.570560 e-01 0.000 e + 00 2.608 e-01 9.347 e-01 3 14 -6.629160 e-02 0.000 e + 00 1.241 e-01 3.103 e-01 4 17 -1.584082 e-01 0.000 e + 00 7.934 e-02 1.826 e-01 5 20 -2.349124 e-01 0.000 e + 00 1.912 e-02 1.571 e-01 6 23 -2.255299 e-01 0.000 e + 00 1.955 e-02 1.993 e-02 7 26 -2.444225 e-01 0.000 e + 00 4.293 e 03 3.821 e-02 8 29 -2.446931 e-01 0.000 e + 00 8.100 e-04 4.035 e 03 9 32 -2.446933 e-01 0.000 e + 00 1.999 e-04 8.126 e-04 10 35 -2.448531 e-01 0.000 e + 00 4.004 e-05 3.289 e-04 11 38 -2.448927 e-01 0.000 e + 00 4.036 e-07 8.156 e-05局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。
显示所找到的解决方案的解决者。
x
x =1×2-0.9727 - 0.4686
视图函数值的解决方案。
fval
fval = -0.2449
视图的总数量评估函数。
函数宏指令= output.funcCount
函数宏指令= 38
不等式约束条件是满意的解决方案。
测查[c] = gfun (x)
c = -2.4608 e-06
测查= []
因为c (x)接近0,约束活跃,这意味着它影响的解决方案。回忆无约束的解决方案。
uncx
uncx =2×1-0.6691 - 0.0000
回忆不受约束的目标函数。
uncf
uncf = -0.4052
看到多少约束移动解决方案,增加了目标。
fval-uncf
ans = 0.1603
约束优化的例子:用户提供的梯度
你可以解决优化问题更有效而准确地提供梯度。这个例子中,喜欢上一个,解决不等式约束问题
提供的梯度f (x)fmincon
、写目标函数的形式MATLAB文件。
类型onehump
函数(f, gf) = onehump (x) % onehump Helper函数为优化工具箱教程演示% 2008 - 2009版权MathWorks, inc .) r = x (1) ^ 2 + (2) ^ 2;s = exp (- r);f = x (1) * s + r / 20;如果nargout > 1女朋友= [(1 - 2 * x (1) ^ 2) * s + x (1) / 10;2 * x (1) * (2) * s + x (2) / 10);结束
约束及其梯度MATLAB中包含的文件tiltellipse
。
类型tiltellipse
函数[c,测查,gc, gceq] = tiltellipse (x) % tiltellipse Helper函数为优化工具箱教程演示% 2008 - 2009版权MathWorks, inc . c = x (1) * (2) / 2 + (x (1) + 2) ^ 2 + (x (2) 2) ^ 2/2 - 2;测查= [];如果nargout > 2 gc = [x (2) / 2 + 2 * (x (1) + 2);(1)/ 2 + x (2) 2);gceq = [];结束
设置一个初始点寻找解决方案。
x0 = [2;1);
设置优化选项在前面的例子使用相同的算法进行比较。
选择= optimoptions (“fmincon”,“算法”,“内点”);
设置选项使用梯度信息的目标和约束函数。注意:这些选项必须打开或梯度信息将被忽略。
选择= optimoptions(选项,…“SpecifyObjectiveGradient”,真的,…“SpecifyConstraintGradient”,真正的);
因为fmincon
不需要估计梯度使用有限的差异,解决者应少计数功能。在每一次迭代时设置选项来显示结果。
选项。显示=“通路”;
解算器。
[x, fval exitflag,输出]= fmincon (@onehump, x0, []、[] [], [], [], [],…@tiltellipse选项);
一阶范数的Iter F-count f (x)可行性最优步骤0 1 2.365241 e-01 0.000 e + 00 1.972 e-01 1 2 1.748504 e-01 0.000 e + 00 1.734 e-01 2.260 e-01 2 4 -1.570560 e-01 0.000 e + 00 2.608 e-01 9.347 e-01 3 6 -6.629161 e-02 0.000 e + 00 1.241 e-01 3.103 e-01 4 7 -1.584082 e-01 0.000 e + 00 7.934 e-02 1.826 e-01 5 8 -2.349124 e-01 0.000 e + 00 1.912 e-02 1.571 e-01 6 9 -2.255299 e-01 0.000 e + 00 1.955 e-02 1.993 e-02 7 10 -2.444225 e-01 0.000 e + 00 4.293 e 03 3.821 e-02 8 11 -2.446931 e-01 0.000 e + 00 8.100 e-04 4.035 e 03 9 12 8.126 1.999 -2.446933 e-01 0.000 e + 00 e-04 e-04 10 13 -2.448531 e-01 0.000 e + 00 4.004 e-05 3.289 e-04 11 14 -2.448927 e-01 0.000 e + 00 4.036 e-07 8.156 e-05局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。
fmincon
估计梯度在前面的例子,所以迭代在这个例子中是相似的。
显示所找到的解决方案的解决者。
xold = x
xold =2×1-0.9727 - 0.4686
视图函数值的解决方案。
minfval = fval
minfval = -0.2449
视图的总数量评估函数。
Fgradevals = output.funcCount
Fgradevals = 14
比较这个数字的数量没有梯度功能评估。
函数宏指令
函数宏指令= 38
约束优化的例子:更改默认终止公差
本例中继续使用梯度和解决相同的约束问题
。
在这种情况下,您实现更准确的解决方案通过重写默认终止标准(options.StepTolerance
和options.OptimalityTolerance
)。默认值fmincon
内点算法options.StepTolerance=1e-10
和options.OptimalityTolerance=1e-6
。
覆盖这两个默认终止条件。
选择= optimoptions(选项,…“StepTolerance”1 e15汽油,…“OptimalityTolerance”1 e-8);
解算器。
[x, fval exitflag,输出]= fmincon (@onehump, x0, []、[] [], [], [], [],…@tiltellipse选项);
一阶范数的Iter F-count f (x)可行性最优步骤0 1 2.365241 e-01 0.000 e + 00 1.972 e-01 1 2 1.748504 e-01 0.000 e + 00 1.734 e-01 2.260 e-01 2 4 -1.570560 e-01 0.000 e + 00 2.608 e-01 9.347 e-01 3 6 -6.629161 e-02 0.000 e + 00 1.241 e-01 3.103 e-01 4 7 -1.584082 e-01 0.000 e + 00 7.934 e-02 1.826 e-01 5 8 -2.349124 e-01 0.000 e + 00 1.912 e-02 1.571 e-01 6 9 -2.255299 e-01 0.000 e + 00 1.955 e-02 1.993 e-02 7 10 -2.444225 e-01 0.000 e + 00 4.293 e 03 3.821 e-02 8 11 -2.446931 e-01 0.000 e + 00 8.100 e-04 4.035 e 03 9 12 8.126 1.999 -2.446933 e-01 0.000 e + 00 e-04 e-04 10 13 -2.448531 e-01 0.000 e + 00 4.004 e-05 3.289 e-04 11 14 -2.448927 e-01 0.000 e + 00 4.036 e-07 8.156 e-05 12 15 -2.448931 e-01 0.000 e + 00 4.000 e-09 8.230 e-07局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。
看到区别了新的公差更准确,显示更多的小数的解决方案。
格式长
显示所找到的解决方案的解决者。
x
x =2×1-0.972742227363546 - 0.468569289098342
比较这些值的值在前面的例子。
xold
xold =2×1-0.972742694488360 - 0.468569966693330
确定值的变化。
x - xold
ans =2×1106×0.467124813385844 - -0.677594988729435
视图函数值的解决方案。
fval
fval = -0.244893137879894
看到解决方案改善了多少。
fval——minfval
ans = -3.996450220755676 e-07
答案是负面的,因为新的解决方案是较小的。
视图的总数量评估函数。
output.funcCount
ans = 15
比较这个数字的功能评估的例子解决用户提供的梯度和默认的公差。
Fgradevals
Fgradevals = 14
约束优化的例子:用户提供的麻绳
如果你提供一个黑森除了一个梯度,解决更加准确和高效。
的fmincon
内点算法需要海赛矩阵作为一个单独的函数(目标函数)的一部分。黑森函数H (x,λ)评估的黑森拉格朗日;看到海赛为fmincon内点算法。
动力学计算的值lambda.ineqnonlin
和lambda.eqlin
;黑森函数解决告诉如何使用这些值。
这个例子有一个不等式约束,所以黑森被定义为给定的hessfordemo
函数。
类型hessfordemo
lambda函数H = hessfordemo (x) % hessfordemo Helper函数为优化工具箱教程演示% 2008 - 2009版权MathWorks, inc . s = exp (- x (x (1) ^ 2 + (2) ^ 2));H = (2 * x (1) * (2 * x (1) ^ 2 - 3) * s + 1/10, 2 * x (2) * (2 * x(1) ^ 2 - 1) *年代;2 * x (2) * (2 * x (1) ^ 2 - 1) * s, 2 * x (1) * (2 * x (2) ^ 2 - 1) * s + 1/10);hessc = (2 1/2; 1/2, 1);H = H + lambda.ineqnonlin (1) * hessc;
为了使用麻绳,您需要设置适当的选项。
选择= optimoptions (“fmincon”,…“算法”,“内点”,…“SpecifyConstraintGradient”,真的,…“SpecifyObjectiveGradient”,真的,…“HessianFcn”,@hessfordemo);
公差将他们违约,这将导致更少的功能。在每一次迭代时设置选项来显示结果。
选项。显示=“通路”;
解算器。
[x, fval exitflag,输出]= fmincon (@onehump, x0, []、[] [], [], [], [],…@tiltellipse选项);
一阶范数的Iter F-count f (x)可行性最优步骤0 1 2.365241 e-01 0.000 e + 00 1.972 e-01 1 3 5.821325 e-02 0.000 e + 00 1.443 e-01 8.728 e-01 2 5 -1.218829 e-01 0.000 e + 00 1.007 e-01 4.927 e-01 3 6 -1.421167 e-01 0.000 e + 00 8.486 e-02 5.165 e-02 4 7 -2.261916 e-01 0.000 e + 00 1.989 e-02 1.667 e-01 5 8 -2.433609 e-01 0.000 e + 00 1.537 e 03 3.486 e-02 6 9 -2.446875 e-01 0.000 e + 00 2.057 e-04 2.727 e 03 7 10 -2.448911 e-01 0.000 e + 00 2.068 e-06 4.191 e-04 8 11 -2.448931 e-01 0.000 e + 00 2.001 4.218 e-08 e-06局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。
结果显示更少的和不同的迭代。
显示所找到的解决方案的解决者。
x
x =2×1-0.972742246093537 - 0.468569316215571
视图函数值的解决方案。
fval
fval = -0.244893121872758
视图的总数量评估函数。
output.funcCount
ans = 11
比较这个数字的数量函数评估解决只使用梯度评估的示例中,使用相同的默认的公差。
Fgradevals
Fgradevals = 14