主要内容

fminunc

求无约束多变量函数的最小值

描述

非线性规划求解器进行求解。

查找指定问题的最小值

最小值 x F ( x )

在哪里F(x)是一个返回标量的函数。

x是向量或矩阵;看到矩阵的参数

实例

x= fminunc (有趣的,x0)从点开始x0并试图找到局部最小值x中所描述的函数有趣的.这一点x0可以是标量、向量或矩阵。

请注意

传递额外的参数说明如何在必要时向目标函数和非线性约束函数传递额外参数。

fminunc为无约束的非线性问题。如果你的问题有约束条件,一般使用fmincon.看到优化决策表

实例

x= fminunc (有趣的,x0,选项)最小化有趣的中的优化选项选项使用最佳选择设置这些选项。

实例

x= fminunc (问题)求最小值问题中所描述的结构问题

实例

[x,fval) = fminunc (___),对于任何语法,返回目标函数的值有趣的在解决方案x

实例

[x,fval,出口滞后,输出) = fminunc (___)另外返回一个值出口滞后的退出条件fminunc,结构输出关于优化过程的信息。

[x,fval,出口滞后,输出,研究生,黑森) = fminunc (___)另外的回报:

  • 研究生——梯度有趣的在解决方案x

  • 黑森-黑森有趣的在解决方案x.看到fminunc Hessian

例子

全部折叠

最小化函数 F ( x ) = 3. x 1. 2. + 2. x 1. x 2. + x 2. 2. - 4. x 1. + 5. x 2.

为此,请编写一个匿名函数有趣的这就是目标。

乐趣=@(x)3*x(1)^2+2*x(1)*x(2)+x(2)^2-4*x(1)+5*x(2);

调用fminunc找到最小值有趣的近的[1]

x0 = [1];[x, fval] = fminunc(有趣,x0)
局部最小值。由于梯度的大小小于最优性公差的值,优化完成。
x =1×22.2500 - -4.7500
fval = -16.3750

fminunc当你提供衍生品时,可以更快更可靠。

编写一个目标函数,返回梯度和函数值。使用中描述的条件化形式包括梯度和Hessians.目标函数是罗森布罗克函数,

F ( x ) = 1. 0 0 ( x 2. - x 1. 2. ) 2. + ( 1. - x 1. ) 2. ,

的梯度

F ( x ) = [ - 4. 0 0 ( x 2. - x 1. 2. ) x 1. - 2. ( 1. - x 1. ) 2. 0 0 ( x 2. - x 1. 2. ) ]

带有梯度的目标函数的代码出现在这个例子到此结束

创建选项来使用目标函数的梯度。同样,将算法设置为“信赖域”

选择= optimoptions (“fminunc”,“算法”,“信赖域”,“SpecifyObjectiveGradient”,真正的);

将初始点设置为[-1,2].然后打电话fminunc

x0 = [1, 2];有趣= @rosenbrockwithgrad;x = fminunc(有趣,x0,选项)
局部最小值。由于梯度的大小小于最优性公差的值,优化完成。
x =1×21.0000 - 1.0000

下面的代码创建rosenbrockwithgrad函数,其中包含梯度作为第二个输出。

函数[f,g]=rosenbrockwithgrad(x)%计算目标fF = 100*(x(2) -x(1) ^2)^2 + (1-x(1))^2如果nargout > 1%梯度要求g=[-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));200*(x(2)-x(1)^2)];终止终止

解决与中相同的问题供应梯度使用问题结构而不是单独的参数。

编写一个目标函数,返回梯度和函数值。使用中描述的条件化形式包括梯度和Hessians.目标函数是罗森布罗克函数,

F ( x ) = 1. 0 0 ( x 2. - x 1. 2. ) 2. + ( 1. - x 1. ) 2. ,

的梯度

F ( x ) = [ - 4. 0 0 ( x 2. - x 1. 2. ) x 1. - 2. ( 1. - x 1. ) 2. 0 0 ( x 2. - x 1. 2. ) ]

带有梯度的目标函数的代码出现在这个例子到此结束

创建选项来使用目标函数的梯度。同样,将算法设置为“信赖域”

选择= optimoptions (“fminunc”,“算法”,“信赖域”,“SpecifyObjectiveGradient”,真正的);

创建一个问题结构,包括初始点x0=[-1,2]。有关此结构中的必填字段,请参阅问题

问题。选项=选项;问题。x0=[-1,2];问题。目标= @rosenbrockwithgrad;问题。解算器=“fminunc”;

解决这个问题。

x = fminunc(问题)
局部最小值。由于梯度的大小小于最优性公差的值,优化完成。
x =1×21.0000 - 1.0000

下面的代码创建rosenbrockwithgrad函数,其中包含梯度作为第二个输出。

函数[f,g]=rosenbrockwithgrad(x)%计算目标fF = 100*(x(2) -x(1) ^2)^2 + (1-x(1))^2如果nargout > 1%梯度要求g = (-400 * (x (2) - x (1) ^ 2) * x (1) 2 * (1 - x (1));200 * (x (2) - x (1) ^ 2)];终止终止

求非线性函数的最小值和函数在最小值处的值。目标函数是

F ( x ) = x ( 1. ) E - x 2. 2. + x 2. 2. / 2. 0

有趣= @ (x) x (1) * exp (- x (x (1) ^ 2 + (2) ^ 2)) + x (x (1) ^ 2 + (2) ^ 2) / 20;

求出最小值点的位置和目标函数值x0=[1,2]

x0=[1,2];[x,fval]=fminunc(fun,x0)
局部最小值。由于梯度的大小小于最优性公差的值,优化完成。
x =1×2-0.6691 - 0.0000
fval = -0.4052

选择fminunc用于检查解决方案过程的选项和输出。

设置选项获取迭代显示和使用“拟牛顿”算法。

选项=最佳选项(@fminunc,“显示”,“国际热核实验堆”,“算法”,“拟牛顿”);

目标函数是

F ( x ) = x ( 1. ) E - x 2. 2. + x 2. 2. / 2. 0

有趣= @ (x) x (1) * exp (- x (x (1) ^ 2 + (2) ^ 2)) + x (x (1) ^ 2 + (2) ^ 2) / 20;

开始最小化x0=[1,2],并获得使您能够检查解决方案质量和流程的输出。

x0 = [1, 2];[x, fval exitflag、输出]= fminunc(有趣,x0,选项)
一阶迭代函数计数f(x)步长最优性0 3 0.256738 0.173 1 6 0.222149 1 0.131 2 9 0.15717 1 0.158 3 18-0.227902 0.438133 0.386 4 21-0.299271 1 0.46 5 30-0.404028 0.102071 0.0458 6 33-0.404868 1 0.0296 7 36-0.405236 1 0.00119 8 8 39-0.405237 1 0.000252 9 42-0.405237 1 7 1 7 1 7 7 7 7-0.97e-07找到局部最小值。由于梯度的大小为les,优化完成s大于最优性公差的值。
x =1×2-0.6691 - 0.0000
fval = -0.4052
exitflag = 1
输出=带字段的结构:firstderopt: 7.9721e-07 algorithm: '拟牛顿' message: '…'
  • 退出标志1.结果表明,该解是局部最优解。

  • 这个输出结构显示迭代次数、函数计算次数和其他信息。

  • 迭代显示还显示迭代次数和函数计算。

输入参数

全部折叠

要最小化的函数,指定为函数句柄或函数名。有趣的是接受向量还是数组的函数x并返回一个实标量F,目标函数在x

fminunc通过x目标函数的形状x0论点例如,如果x0是5乘3的数组吗fminunc通过x有趣的作为一个5乘3的数组。

指定有趣的作为文件的函数句柄:

x = fminunc (x0 @myfun)

在哪里myfun是一个MATLAB®等功能

函数F = myfun(x...%计算x处的函数值

你也可以指定有趣的作为匿名函数的函数句柄:

x = fminunc (@ (x)规范(x) ^ 2, x0);

如果你能计算出梯度有趣的这个指定对象半径选项设置为真正的按规定

选择= optimoptions (“fminunc”,“SpecifyObjectiveGradient”,真正的)
然后有趣的必须返回梯度向量g (x)在第二个输出参数中。

如果你也能计算出海森矩阵这个HessianFcn选项设置为“目标”通过选择= optimoptions(“fminunc”、“HessianFcn”,“客观”)这个算法选项设置为“信赖域”,有趣的必须返回Hessian值H (x),一个对称矩阵,在第三个输出参数。有趣的可以给稀疏的黑森。看到Hessian用于fminunc信任区域或fmincon信任区域反射算法获取详细信息。

这个信任区算法允许您提供一个Hessian乘法函数。这个函数给出了一个Hessian-time -vector乘积的结果,而不直接计算Hessian。这可以节省内存。看到黑森乘法函数

例子:有趣= @ (x) sin (x (1)) * cos (x (2))

数据类型:字符|功能手柄|字符串

初始点,指定为实向量或实数组。解算器使用x0以及x0来确定变量的数量和大小有趣的接受。

例子:x0 =(1、2、3、4)

数据类型:

的输出,指定为优化选项最佳选择或者一个结构optimset的回报。

有些选项适用于所有算法,有些则与特定算法相关。看到优化选项参考的详细信息。

有些选项不在计划中最佳选择显示。这些选项在下表中以斜体显示。有关详细信息,请参见视图选项

所有的算法

算法

选择fminunc算法。的选择是“拟牛顿”(默认)或“信赖域”

这个“信赖域”算法要求您提供渐变(请参见有趣的),否则fminunc使用“拟牛顿”算法。有关选择算法的信息,请参阅选择算法

检查梯度

比较用户提供的导数(目标梯度)和有限差分导数。的选择是(默认)或真正的

optimset,名字是导数切克这些值是“开”“关闭”.看到当前和遗留选项名称

诊断

显示关于要最小化或解决的函数的诊断信息。的选择是“关闭”(默认)或“开”

DiffMaxChange

有限差分梯度(正标量)变量的最大变化量。默认值是

DiffMinChange

有限差分梯度(正标量)变量变化的最小值。默认值是0

显示

显示水平(见迭代显示):

  • “关闭”“没有”显示没有输出。

  • “国际热核实验堆”在每次迭代时显示输出,并给出默认退出消息。

  • “国际热核实验堆详细说明”在每次迭代时显示输出,并给出技术退出消息。

  • “通知”仅当函数不收敛时显示输出,并给出默认退出消息。

  • “notify-detailed”仅在函数不收敛时显示输出,并给出技术退出消息。

  • “最后一次”(default)只显示最终输出,并给出默认的退出消息。

  • 最后详细的只显示最终输出,并给出技术性退出消息。

有限差分步长

有限差分的标量或向量步长因子。当您设置有限差分步长一个向量v,正有限差分δ

δ= v *标志的(x) *马克斯(abs (x)、TypicalX);

在哪里符号′(x)=符号(x)除了符号′(0)=1.中心有限差分是

δ= v *马克斯(abs (x)、TypicalX);

标量有限差分步长展开成一个向量。默认值是sqrt (eps)对于正向有限差分,和每股收益^(1/3)对于中心有限差分。

信任区域算法使用有限差分步长只有当检查梯度被设置为真正的

optimset,名字是FinDiffielstep.看到当前和遗留选项名称

FiniteDifferenceType

用于估计梯度的有限差分“前进”(默认),或“中央”(中心)。“中央”需要两倍的函数求值,但应该更准确。信任区域算法使用FiniteDifferenceType只有当检查梯度被设置为真正的

optimset,名字是FinDiffType.看到当前和遗留选项名称

FunValCheck

检查目标函数值是否有效。默认设置,“关闭”,不执行检查。这个“开”当目标函数返回的值为复杂的,,或

最大函数求值

允许的最大函数求值数,为正整数。默认值为100 * numberOfVariables.看到公差和停止标准迭代和函数计数

optimset,名字是MaxFunEvals.看到当前和遗留选项名称

最大迭代次数

允许的最大迭代次数,一个正整数。默认值为400.看到公差和停止标准迭代和函数计数

optimset,名字是麦克斯特.看到当前和遗留选项名称

OptimalityTolerance

一阶最优性的终止容限(正标量)。默认值是1 e-6.看到一阶最优性测量

optimset,名字是TolFun.看到当前和遗留选项名称

OutputFcn

指定优化函数在每次迭代时调用的一个或多个用户定义函数。传递一个函数句柄或函数句柄的单元格数组。默认为none ([]).看到输出函数和绘图函数语法

绘图仪

在算法执行时打印各种进度度量;从预定义打印中选择或编写自己的打印。传递内置打印函数名称、函数句柄或内置打印函数名称或函数句柄的单元格数组。对于自定义打印函数,传递函数句柄。默认值为无([]):

  • “optimplotx”绘制当前点。

  • “optimplotfunccount”绘制函数计数。

  • “optimplotfval”绘制函数值。

  • “optimplotstepsize”绘制步长。

  • “optimplotfirstorderopt”绘制一阶最优性度量。

自定义打印函数使用与输出函数相同的语法。请参阅优化工具箱的输出函数输出函数和绘图函数语法

optimset,名字是绘图仪.看到当前和遗留选项名称

指定对象半径

由用户定义的目标函数的梯度。参见有趣的来了解如何定义渐变有趣的.设置为真正的拥有fminunc使用用户定义的目标函数梯度。默认的原因fminunc使用有限差分估计梯度。必须提供梯度,并设置指定对象半径真正的,使用信任区域算法。准牛顿算法不需要这个选项。

optimset,名字是GradObj这些值是“开”“关闭”.看到当前和遗留选项名称

StepTolerance

终止上公差x,一个正标量。默认值为1 e-6.看到公差和停止标准

optimset,名字是TolX.看到当前和遗留选项名称

TypicalX

典型的x值。元素的数量TypicalX等于元素的个数x0,起点。默认值为的(numberofvariables, 1)fminunc使用TypicalX为梯度估计缩放有限差分。

这个信任区算法使用TypicalX只是为了检查梯度选择。

信任区算法
FunctionTolerance

函数值的终止容限,一个正标量。默认值是1 e-6.看到公差和停止标准

optimset,名字是TolFun.看到当前和遗留选项名称

HessianFcn

如果设置为[](默认),fminunc用有限差分近似Hessian。

如果设置为“目标”,fminunc为目标函数使用用户定义的Hessian。Hessian是目标函数的第三个输出(请参见有趣的).

optimset,名字是HessFcn.看到当前和遗留选项名称

HessianMultiplyFcn

海森乘法函数,指定为函数句柄。对于大规模的结构化问题,这个函数计算Hessian矩阵乘积H * Y没有真正形成H.功能在于形式

W = hmfun (Hinfo, Y)

在哪里Hinfo包含用于计算的矩阵H * Y

第一个参数与目标函数返回的第三个参数相同有趣的例如,

[f,g,Hinfo]=fun(x)

Y矩阵的行数与问题的维数相同。矩阵W = H * Y,虽然H不是显式形成的。fminunc使用Hinfo计算前置条件。有关如何为任何其他参数提供值的信息hmfun需要,请参阅传递额外的参数

请注意

使用HessianMultiplyFcn选项,HessianFcn必须设置为[]

例如,请参见稠密结构Hessian线性等式的极小化

optimset,名字是HessMult.看到当前和遗留选项名称

HessPattern

有限差分的Hessian稀疏模式。集HessPattern (i, j) = 1当你可以拥有∂2.有趣的/∂x(我)x (j)≠0。否则,设置HessPattern (i, j) = 0

使用HessPattern当计算Hessian矩阵不方便时H有趣的,但您可以确定(例如,通过检查)的梯度的第Th分量有趣的取决于x (j)fminunc可以近似H通过稀疏有限差分(梯度),如果你提供稀疏结构H作为HessPattern.换句话说,提供非零的位置。

当结构未知时,不要设置HessPattern.默认的行为是HessPattern是1的密集矩阵。然后fminunc在每次迭代中计算完全有限差分近似。这种计算对于大的问题可能是昂贵的,所以通常最好确定稀疏性结构。

MaxPCGIter

最大预条件共轭梯度(PCG)迭代数,一个正标量。默认值是最大值(1,楼层(numberOfVariables/2)).有关更多信息,请参见信赖域算法

PrecondBandWidth

PCG预处理器的上限带宽,非负整数。默认情况下,fminunc使用对角预处理(上限带宽为0)。对于某些问题,增加带宽可以减少PCG迭代次数。设置PrecondBandWidth使用直接因子分解(Cholesky)而不是共轭梯度(CG)。直接因式分解在计算上比CG更昂贵,但在求解过程中产生了更好的质量。

SubproblemAlgorithm

确定如何计算迭代步骤。默认的,“重心”,比。要快但不准确的一步“分解”.看到fminunc信赖域算法

TolPCG

PCG迭代的终止容限,一个正标量。默认值是0.1

拟牛顿算法
HessUpdate

拟牛顿算法中搜索方向的选择方法。的选择是:

ObjectiveLimit

一个标量的公差(停止标准)。如果迭代时目标函数值小于或等于ObjectiveLimit,迭代停止,因为问题可能是无界的。默认值为1 e20

UseParallel

真正的,fminunc平行估计梯度。通过设置为默认值来禁用,信任区需要一个渐变的目标,所以UseParallel不适用。看到并行计算

例子:选择= optimoptions(‘fminunc’,‘SpecifyObjectiveGradient’,真的)

问题结构,指定为具有以下字段的结构:

字段名 条目

客观的

目标函数

x0

起始点x

解算器

“fminunc”

选项

选择创建最佳选择

数据类型:结构

输出参数

全部折叠

解决方案,作为实向量或实数组返回。的大小x和尺寸一样吗x0.通常情况下,x什么时候能解决局部问题出口滞后是正的。有关解决方案质量的信息,请参见当解算器成功时

目标函数在解处的值,以实数返回。一般来说,fval=有趣的(x)

原因fminunc已停止,作为整数返回。

1.

梯度的大小小于OptimalityTolerance宽容。

2.

的变化xStepTolerance宽容。

3.

目标函数值的变化小于FunctionTolerance宽容。

5.

预测的目标函数下降小于FunctionTolerance宽容。

0

超过迭代次数最大迭代次数或超出功能评估的数量最大函数求值

-1

算法由输出函数终止。

-3

下面是当前迭代的目标函数ObjectiveLimit

关于优化过程的信息,作为带有字段的结构返回:

迭代

迭代次数

funcCount

函数计算次数

firstorderopt

一阶最优性测度

算法

优化算法

cgiterations

PCG迭代的总数(“信赖域”(仅限算法)

lssteplength

直线搜索步骤相对于搜索方向的大小(“拟牛顿”(仅限算法)

stepsize

最终位移x

消息

退出消息

解的梯度,返回实向量。研究生给出的梯度有趣的在点x (:)

近似的黑森函数,返回实矩阵。为了…的意义黑森看见黑森输出

算法

全部折叠

拟牛顿算法

这个拟牛顿算法采用BFGS拟牛顿法,并具有三次线搜索程序。这种拟牛顿方法使用BFGS ([1],[5],[8],[9])修正Hessian矩阵近似的公式。你可以选择DFP ([4],[6],[7])式,该式近似于逆Hessian矩阵,通过设置HessUpdate选项“dfp”(和算法选项“拟牛顿”).您可以通过设置选择最陡的下降方法HessUpdate“steepdesc”(及算法“拟牛顿”),尽管这种设置通常效率很低。看到fminunc拟牛顿算法

信赖域算法

这个信任区算法要求您在中提供渐变有趣的并设置指定对象半径真正的使用最佳选择.该算法是一种子空间信赖域方法,基于中描述的内反射牛顿法[2][3].每次迭代都涉及到使用预条件共轭梯度(PCG)方法求解一个大线性系统的近似解。看到fminunc信赖域算法,非线性极小化的信赖域方法预条件共轭梯度法

选择功能

应用程序

这个优化活动编辑器任务为fminunc

参考文献

[1] Broyden, C. G. <一类双秩最小化算法的收敛性>数学研究所学报.,第6卷,1970年,76-90页。

[2] Coleman, t.f.和Y. Li。有界非线性极小化的内部信赖域方法SIAM优化学报,第6卷,1996年,第418-445页。

[3] Coleman, t.f.和Y. Li。关于有界大规模非线性极小化的反射牛顿方法的收敛性数学规划,第67卷,第2期,1994年,189-224页。

[4] Davidon, W. C. <最小化的可变度量法>a.e.c研究与发展报告,ANL-59901959年。

[5] Fletcher, R.,《变度量算法的新方法》计算机杂志,第13卷,1970年,第317-322页。

[6] Fletcher, R. "实用优化方法"1卷,无约束最优化约翰·威利父子公司(John Wiley and Sons), 1980年。

R.弗莱彻和M. J. D.鲍威尔。“一种快速收敛的下降法最小化。”计算机杂志, 1963年,第6卷,163-168页。

[8] Goldfarb, D.《由变分均值衍生的变量度量更新的家族》。数学的计算,第24卷,1970年,第23-26页。

[9] Shanno, D. F. <函数最小化的拟牛顿方法的条件>。数学的计算,第24卷,1970年,第647-656页。

扩展功能

之前介绍过的R2006a