主要内容

Fminunc.

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

描述

非线性编程求解器。

查找最低问题所指定的问题

x f x

在哪里fx)是返回标量的函数。

x是矢量或矩阵;看矩阵的参数

例子

x= fminunc(有趣的X0.从点开始X0.并尝试找到当地的最低限度x中描述的功能有趣的.点X0.可以是标量、向量或矩阵。

请注意

通过额外的参数如有必要,如何将额外参数传递给客观函数和非线性约束函数。

Fminunc.用于没有约束的非线性问题。如果您的问题有约束,通常使用粉刺.看到优化决策表

例子

x= fminunc(有趣的X0.选项最小化有趣的使用指定的优化选项选项.使用optimoptions设置这些选项。

例子

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

例子

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

例子

xfvalexitflag输出] = fminunc(___另外返回一个值exitflag这描述了退出条件Fminunc.,结构输出关于优化过程的信息。

xfvalexitflag输出毕业黑森] = fminunc(___另外返回:

  • 毕业- 梯度有趣的在解决方案x

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

例子

全部折叠

最小化函数 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) * (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.当您提供衍生工具时,可以更快且更可靠。

编写一个目标函数,返回渐变以及函数值。使用描述的条件化表单包括渐变和幽灵.目标函数是rosenbrock的函数,

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''算法'“信赖域”'specifyobjectivegrient',真的);

设置初始点为[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%梯度要求[-400*(x(2)-x(1)^2)*x(1) - 2*(1-x(1))];200 * (x (2) - x (1) ^ 2)];结束结束

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

编写一个目标函数,返回渐变以及函数值。使用描述的条件化表单包括渐变和幽灵.目标函数是rosenbrock的函数,

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''算法'“信赖域”'specifyobjectivegrient',真的);

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

问题.Options =选项;问题.x0 = [-1,2];问题.Objective = @rosenbrockwithgrad;问题.Solver =.'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

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

找到最小化器的位置和目标函数值开始于x0 = [1, 2]

x0 = [1, 2];[x, fval] = fminunc(有趣,x0)
发现本地最低限度。由于梯度的大小小于最优性公差的值,优化完成。
X =1×2-0.6691 0.0000
fval = -0.4052

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

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

选择= optimoptions (@fminunc,'展示'“通路”'算法'“拟牛顿”);

目标函数为

f x x 1 e - x 2 2 + x 2 2 / 2 0

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

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

x0 = [1, 2];[x,fval,出口,输出] = fminunc(有趣,x0,选项)
一阶迭代Func-count f (x)步长最优3 0 0.15717 0.222149 0.256738 0.173 - 1 6 1 0.131 - 2 9 1 0.158 3 18 -0.227902 0.438133 0.386 4 21 30 -0.404028 0.102071 0.0458 -0.299271 0.46 1 5 6 33 -0.405236 -0.404868 0.0296 1 7 36 1 0.00119 8 39 -0.405237 1 7.97 -0.405237 0.000252 1 9 42 e-07局部最小值。由于梯度的大小小于最优性公差的值,优化完成。
X =1×2-0.6691 0.0000
fval = -0.4052
exitflag = 1
输出=结构体字段:迭代:9 Funccount:42步骤:2.9343E-04 LSSTeplenth:1:7.9721E-07算法:'Quasi-Newton'消息:'...'
  • 出口标志1证明了解是一个局部最优解。

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

  • 迭代显示还显示了迭代和函数评估的数量。

输入参数

全部折叠

功能最小化,指定为函数句柄或函数名称。有趣的是一个接受向量或数组的函数x并返回一个真正的标量f,目标函数的取值为x

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

x = fminunc(@ myfun,x0)

在哪里myfun.MATLAB是一种®功能如

函数f = myfun(x)%计算函数在x处的值

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

x = fminunc(@(x)rang(x)^ 2,x0);

如果您可以计算渐变有趣的SpecifyObjectiveGradient选项设置为真的,如图所示

选项= Optimoptions('fminunc','specifyobjectivegradient',true)
然后有趣的必须返回渐变向量g(x)在第二个输出参数中。

如果你也能计算出Hessian矩阵赫索斯·福克选项设置为'客观的'通过选项= Optimoptions('fminunc','hessianfcn','目标')算法选项设置为“信赖域”有趣的必须返回黑森州的价值h(x),一个对称矩阵,在第三输出参数中。有趣的可以给稀疏的黑森。看到Hessian用于fminunc信任区域或fmincon信任区域反射算法获取详细信息。

信赖域算法允许您提供Hessian乘法函数。此功能给出了Hessian - 时间 - 矢量产品的结果,而不直接计算Hessian。这可以节省内存。看到Hessian乘法功能

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

数据类型:char|function_handle|细绳

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

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

数据类型:双倍的

优化选项,指定为输出optimoptions或者一个结构优化集返回。

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

控件中缺少一些选项optimoptions展示。这些选项在下表中显示在斜体中。有关详细信息,请参阅视图选项

所有的算法

算法

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

“信赖域”算法要求你提供梯度(见有趣的),否则Fminunc.用来“拟牛顿”算法。有关选择算法的信息,请参见选择算法

CheckGradients

将用户提供的衍生物(客观梯度)与有限差分衍生物进行比较。的选择是(默认)或真的

优化集, 名字是DerivativeCheck这些值是“上”要么'离开'.看到当前和遗留选项名称

诊断

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

diffmaxchange.

有限差分梯度(正标量)的变量最大变化。默认为INF.

差异

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

展示

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

  • '离开'要么“没有”显示无输出。

  • “通路”在每次迭代时显示输出,并提供默认退出消息。

  • “iter-detailed”在每次迭代时显示输出,并给出技术退出消息。

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

  • '通知 - 详细'仅在函数不收敛时显示输出,并给出技术退出消息。

  • '最后'(默认)仅显示最终输出,并提供默认退出消息。

  • '最终详细'仅显示最终输出,并提供技术退出消息。

FiniteDifferenceStepSize

用于有限差异的标量或矢量步长因子。当你设置时FiniteDifferenceStepSize向矢量v,前向的有限差异三角洲

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

在哪里符号“(x) =符号(x)除了标志' (0)= 1.中央有限差异是

delta = v。* max(abs(x),典型值);

标量子FiniteDifferenceStepSize扩展到向量。默认为sqrt (eps)用于前进有限差异,和eps ^ (1/3)对于中心有限差分。

信任区域算法使用FiniteDifferenceStepSize只有当CheckGradients被设置为真的

优化集, 名字是FinDiffRelStep.看到当前和遗留选项名称

finitedifferenceType.

用于估计梯度的有限差分是“前进”(默认),或'中央'(以中心)。'中央'需要两倍的函数评估,但应该更准确。信任区域算法使用finitedifferenceType.只有当CheckGradients被设置为真的

优化集, 名字是findifftype..看到当前和遗留选项名称

funvalcheck.

检查客观函数值是否有效。默认设置,'离开',不执行检查。的“上”当目标函数返回值时,设置显示错误复杂的INF., 要么

MaxFunctionEvaluations

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

优化集, 名字是Maxfunevals..看到当前和遗留选项名称

MaxIterations

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

优化集, 名字是maxiter..看到当前和遗留选项名称

最优法

终止耐受一阶最优性(正标量)。默认为1E-6.看到一阶最优测量

优化集, 名字是塔尔芬.看到当前和遗留选项名称

outputfcn.

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

PlotFcn

绘制算法执行时的各种进度度量;从预定义的情节中选择或编写您自己的。传递内置绘图函数名、函数句柄或内置绘图函数名或函数句柄的单元格数组。对于定制的绘图函数,传递函数句柄。默认为none ([]):

  • 'Optimplotx'绘制当前点。

  • 'OptimplotFunccount'绘制函数计数。

  • 'OptimplotFval'绘制函数值。

  • 'OptimplotStepsize'绘制步长。

  • 'OptimplotFirstordopt'绘制一阶最优测度。

自定义绘图函数使用与输出函数相同的语法。看到优化工具箱的输出函数输出功能和绘图函数语法

优化集, 名字是PlotFcns.看到当前和遗留选项名称

SpecifyObjectiveGradient

由用户定义的目标函数的梯度。参见有趣的来了解如何定义渐变有趣的.设置真的Fminunc.使用客观函数的用户定义梯度。默认值原因Fminunc.用有限差分估计梯度。你必须提供渐变和设置SpecifyObjectiveGradient真的,使用信任区域算法。Quasi-Newton算法不需要此选项。

优化集, 名字是GradObj这些值是“上”要么'离开'.看到当前和遗留选项名称

StepTolerance.

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

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

TypicalX

典型的x价值观。元素的数量TypicalX等于元素的个数X0.,起点。默认值为(Numberofvarialbles,1)Fminunc.用途TypicalX用于缩放有限差异的梯度估计。

信赖域算法使用TypicalX只适用于CheckGradients选项。

信赖域算法
FunctionTolerance

函数值终止差值,正标量。默认为1E-6.看到公差和停止标准

优化集, 名字是塔尔芬.看到当前和遗留选项名称

赫索斯·福克

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

如果设置为'客观的'Fminunc.使用用户定义的Hessian函数作为目标函数。Hessian是目标函数的第三个输出(见有趣的).

优化集, 名字是Hessfcn..看到当前和遗留选项名称

黑森州Multiplyfcn.

Hessian乘法函数,指定为函数句柄。对于大规模的结构问题,此功能计算Hessian矩阵产品H * Y.没有实际形成H.该功能是表单

w = hmfun(hinfo,y)

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

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

[f, g, Hinfo] =乐趣(x)

Y是具有相同数量的行的矩阵,因为问题存在尺寸。矩阵W = H * Y,虽然H不是明确形成的。Fminunc.用途Hinfo计算前提者。有关如何为任何其他参数提供值的信息HMFUN.需要,看看通过额外的参数

请注意

使用黑森州Multiplyfcn.选项,赫索斯·福克必须设置为[]

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

优化集, 名字是Hessmult..看到当前和遗留选项名称

Hesspattern.

Hessian的稀疏模式,用于有限差异。放Hesspattern(i,j)= 1当你可以拥有∂2有趣的/∂x(i)x(j)≠0.否则,设置Hesspattern(i,j)= 0

使用Hesspattern.当计算Hessian矩阵不方便时H有趣的,但你可以确定(说,通过检查)何时梯度的分量有趣的依赖于取决于x(j)Fminunc.可以近似H如果您提供的,通过稀疏有限差异(梯度)稀疏结构H作为价值Hesspattern..换句话说,提供非安利斯的位置。

当结构未知时,未设置Hesspattern..默认行为就像Hesspattern.是一种密集的矩阵。然后Fminunc.计算每次迭代中的完整有限差分近似。对于大问题来说,这种计算可能是昂贵的,因此通常更好地确定稀疏结构。

maxpcgiter.

最大预处理缀合物梯度(PCG)迭代,一个正标量。默认为马克斯(1楼(numberOfVariables / 2)).有关更多信息,请参阅信赖域算法

precondbandwidth.

PCG预调制器的上带宽,非负整数。默认情况下,Fminunc.使用对角线预处理(上带宽为0)。对于一些问题,增加带宽减少了PCG迭代的数量。环境precondbandwidth.INF.使用直接因子分解(Cholesky)而不是共轭梯度(CG)。直接因式分解在计算上比CG更昂贵,但在求解过程中产生了更好的质量。

子项产算法

确定如何计算迭代步骤。默认值,'cg',比速度更快但不太准确“分解”.看到Fminunc信任区域算法

TolPCG

PCG迭代的终止公差,正标量。默认为0.1

拟牛顿算法
Hessupdate.

在Quasi-Newton算法中选择搜索方向的方法。选择是:

Objectivelimit.

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

UseParallel

什么时候真的Fminunc.平行估计梯度。通过设置为默认值来禁用,信赖域需要梯度,所以UseParallel不适用。看到并行计算

例子:选项= Optimoptions('fminunc','specifyobjectivegradient',true)

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

字段名称 条目

客观的

目标职能

X0.

初始点x

求解器

'fminunc'

选项

选择的选项optimoptions

数据类型:结构体

输出参数

全部折叠

解,返回实向量或实数组。的大小x与大小相同X0..通常,x是当地解决问题的地方exitflag是积极的。有关解决方案质量的信息,请参阅当求解成功时

解决方案的目标函数值,作为实数返回。一般来说,fval有趣(x)

原因Fminunc.已停止,返回为整数。

1

梯度的幅度小于最优法宽容。

2

的变化xStepTolerance.宽容。

3.

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

5

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

0

超过迭代次数MaxIterations或超过函数求值次数MaxFunctionEvaluations

-1

算法由输出函数终止。

-3

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

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

迭代

迭代次数

funcCount

函数计算次数

firstorderopt

一阶最优性的度量

算法

优化算法使用

cgiteration.

PCG迭代总次数(“信赖域”算法只)

lssteplength

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

一步的大小

最终流离失所x

消息

退出消息

解决方案的梯度,作为真正的矢量返回。毕业给出梯度有趣的在点X(:)

近似的黑森函数,返回实矩阵。为了…的意义黑森,请参阅黑森州的产出

算法

全部折叠

拟牛顿算法

拟牛顿算法使用BFGS Quasi-Newton方法具有三次线路搜索过程。此Quasi-Newton方法使用BFGS([1][5][8],[9])用于更新Hessian矩阵近似的公式。您可以选择DFP([4][6],[7])式,该式近似于逆Hessian矩阵,通过设置Hessupdate.选择“dfp”(和该算法选择“拟牛顿”).您可以通过设置选择最陡的下降方法Hessupdate.“steepdesc”(和算法“拟牛顿”),虽然这个设置通常效率低下。看到Fminunc Quasi-Newton算法

信赖域算法

信赖域算法要求你提供梯度有趣的和集合SpecifyObjectiveGradient真的使用optimoptions.该算法是子空间信任区域方法,基于内部反射牛顿方法[2][3].每次迭代都涉及到使用预条件共轭梯度(PCG)方法求解一个大线性系统的近似解。看到Fminunc信任区域算法非线性最小化的信任区域方法预处理的共轭梯度法

选择功能

应用程序

优化Live Editor任务提供可视界面Fminunc.

参考

[1] Broyden,C.G。“一类双级最小化算法的收敛性”。本月》杂志上。数学。品。,卷。6,1970,第76-90页。

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

[3] Coleman,T. F.和Y. Li。“关于对界限大规模非线性最小化的反光牛顿方法的收敛性。”数学规划,卷。67,第294号,第294页,第189-224页。

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

[5] Fletcher,R。“一种可变度量算法的新方法”。电脑杂志,第13卷,1970年,317-322页。

[6]弗莱彻,R。“优化的实用方法”。卷。1,不受约束的优化,约翰瓦利和儿子,1980年。

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

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

[9] Shanno,D. F。“Quasi-Newton方法的调节功能最小化”。数学的计算,第24卷,1970年,第647-656页。

扩展能力

在R2006A之前介绍