主要内容

教程为优化工具箱

本教程包含多个例子,展示如何使用两个解决非线性优化,fminuncfmincon和如何设置选项。在本教程中列出的原则适用于其他非线性动力学等fgoalattain,fminimax,lsqnonlin,lsqcurvefit,fsolve

本教程的例子介绍这些任务:

  • 一个目标函数最小化

  • 减少与其他参数相同的功能

  • 最小化目标函数与约束条件

  • 获得一个更有效的或准确的解决方案通过提供梯度或麻绳,或通过改变选项

无约束优化的例子

考虑的问题找到一个最小的函数

x 经验值 ( - - - - - - ( x 2 + y 2 ) ) + ( x 2 + y 2 ) / 2 0

绘制函数最小化的地方。

f = @ x (x, y)。* exp (- x ^ 2 y ^ 2) + (x ^ 2 + y ^ 2) / 20;fsurf (f (2, 2),“ShowContours”,“上”)

图包含一个坐标轴对象。坐标轴functionsurface类型的对象包含一个对象。

点附近的情节表明最低(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文件,然后通过使用一个嵌套的函数。

考虑目标函数与前面的示例。

f ( x , y ) = x 经验值 ( - - - - - - ( x 2 + y 2 ) ) + ( x 2 + y 2 ) / 2 0

参数化的函数(a, b, c)如下:

f ( x , y , 一个 , b , c ) = ( x - - - - - - 一个 ) 经验值 ( - - - - - - ( ( x - - - - - - 一个 ) 2 + ( y - - - - - - b ) 2 ) ) + ( ( x - - - - - - 一个 ) 2 + ( y - - - - - - b ) 2 ) / 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。外部函数,nestedbowlpeakfminunc通过目标函数,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

这两种方法产生相同的答案,所以你可以使用你找到一个最方便。

约束优化的例子:不平等

一个约束考虑前面的问题:

最小化 x 经验值 ( - - - - - - ( x 2 + y 2 ) ) + ( x 2 + y 2 ) / 2 0 ,

主题 x y / 2 + ( x + 2 ) 2 + ( y - - - - - - 2 ) 2 / 2 2

约束集的内部倾斜椭圆。把目标函数绘制的轮廓一起倾斜椭圆。

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轮廓”,“最低”);持有

图包含一个坐标轴对象。坐标轴对象包含3 implicitfunctionline类型的对象,functioncontour,线。这些对象代表约束,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

约束优化的例子:用户提供的梯度

你可以解决优化问题更有效而准确地提供梯度。这个例子中,喜欢上一个,解决不等式约束问题

最小化 x 经验值 ( - - - - - - ( x 2 + y 2 ) ) + ( x 2 + y 2 ) / 2 0 ,

主题 x y / 2 + ( x + 2 ) 2 + ( y - - - - - - 2 ) 2 / 2 2

提供的梯度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

约束优化的例子:更改默认终止公差

本例中继续使用梯度和解决相同的约束问题

最小化 x 经验值 ( - - - - - - ( x 2 + y 2 ) ) + ( x 2 + y 2 ) / 2 0 ,

主题 x y / 2 + ( x + 2 ) 2 + ( y - - - - - - 2 ) 2 / 2 2

在这种情况下,您实现更准确的解决方案通过重写默认终止标准(options.StepToleranceoptions.OptimalityTolerance)。默认值fmincon内点算法options.StepTolerance=1e-10options.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.ineqnonlinlambda.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

相关的话题