主要内容

Fminunc.

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

描述

非线性编程求解器。

查找指定问题的最小值

最小值 X F X

在哪里FX)是一个返回标量的函数。

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

例子

X= fminunc(有趣的x0从此开始x0并尝试找到当地的最低限度X中所描述的函数有趣的.这一点x0可以是标量、向量或矩阵。

请注意

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

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

例子

X= fminunc(有趣的x0选项最小化有趣的使用指定的优化选项选项.用优化选择设置这些选项。

例子

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

例子

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

例子

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

[XfvalExitFlag.输出毕业黑森) = fminunc (___另外返回:

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

  • 黑森- Hessian有趣的在解决方案X.看Fminunc Hessian

例子

全部折叠

最小化功能 F X = 3. X 1 2 + 2 X 1 X 2 + X 2 2 - 4. X 1 + 5. X 2

为此,请编写一个匿名函数有趣的计算目标。

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

调用Fminunc.找到最少的有趣的靠近[1,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”“算法”“信赖域”“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)];结尾结尾

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

编写一个目标函数,返回梯度和函数值。使用中描述的条件化形式包括渐变和幽灵.目标函数是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”“算法”“信赖域”“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.

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.用于检查解决方案过程的选项和输出。

设置选项获取迭代显示和使用'quasi-newton'算法。

选项= Optimoptions(@Fminunc,“显示”'iter'“算法”'quasi-newton');

目标函数是

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 exitflag、输出]= fminunc(有趣,x0,选项)
一阶迭代Func-count f(x)阶梯尺寸最优值0 3 0.156738 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.13  -0.404868 1 0.0296 7 36 -0.405236 1 0.00119 8 39 -0.405237 1 0.000252 9 42 -0.405237 1 7.97E-07本地最低限度。优化完成,因为梯度的大小小于最优耐受性的值。
x =1×2-0.6691 - 0.0000
fval = -0.4052
exitflag = 1
输出=结构与字段:firstderopt: 7.9721e-07 algorithm: '拟牛顿' message: '…'
  • 出口标志1表明该解决方案是局部最佳。

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

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

输入参数

全部折叠

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

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

x = fminunc (x0 @myfun)

在哪里myfun是一个matlab.®等功能

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

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

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

如果您可以计算渐变有趣的specifyobjectivegradient.选项设置为真正的按规定

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

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

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

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

数据类型:字符|function_handle.|细绳

初始点,指定为真实的矢量或真实数组。求解器使用元素数量x0和大小的x0来确定变量的数量和大小有趣的接受。

例子:x0 = [1,2,3,4]

数据类型:双倍的

的输出,指定为优化选项优化选择或一个结构如optimset返回。

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

某些选择缺席优化选择显示。这些选项在下表中以斜体显示。有关详细信息,请参见视图选项

所有算法

算法

选择Fminunc.算法。的选择是'quasi-newton'(默认)或“信赖域”

“信赖域”算法要求您提供梯度(请参阅描述有趣的), 要不然Fminunc.用来'quasi-newton'算法。有关选择算法的信息,请参阅选择算法

袭击者

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

optimset,名字是衍生师傅这些值是'在'“关闭”.看当前和遗留选项名称

诊断

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

DiffMaxChange

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

DiffMinChange

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

显示

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

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

  • 'iter'在每次迭代时显示输出,并给出默认退出消息。

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

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

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

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

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

finitedifferencestepsize.

用于有限差异的标量或矢量步长因子。当你设置时finitedifferencestepsize.向矢量V.,正有限差分δ

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

在哪里签名'(x)= sign(x)除了标志'(0)= 1.中央有限差异是

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

标量finitedifferencestepsize.展开成一个向量。默认为sqrt (eps)对于正向有限差分,和EPS ^(1/3)用于中央有限差异。

信任区域算法使用finitedifferencestepsize.只有当袭击者被设置为真正的

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

finitedifferenceType.

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

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

funvalcheck.

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

MaxFunctionEvaluations.

允许最大函数评估数,一个正整数。默认值是100 * numberofvariables..看公差和停止标准迭代和函数计数

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

最大

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

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

OptimalityTolerance

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

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

OutputFcn

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

Plotfcn.

在算法执行时绘制各种进展措施;从预定义的地块中选择或写自己的。通过内置绘图函数名称,函数句柄或内置绘图函数名称或功能处理的单元格数组。对于自定义绘图功能,通过功能句柄。默认值为none([]):

  • “optimplotx”绘制当前点。

  • “optimplotfunccount”绘制函数计数。

  • “optimplotfval”绘制函数值。

  • “optimplotstepsize”绘制阶梯尺寸。

  • 'OptimplotFirstordopt'绘制一阶的最优性措施。

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

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

specifyobjectivegradient.

由用户定义的目标函数的梯度。参见有趣的来了解如何定义渐变有趣的.设置真正的具有Fminunc.使用客观函数的用户定义梯度。默认值原因Fminunc.使用有限差异来估计梯度。您必须提供渐变和设置specifyobjectivegradient.真正的,使用信任区域算法。准牛顿算法不需要这个选项。

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

StepTolerance.

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

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

TypicalX

典型的X值。元素的数量TypicalX等于元素的个数x0,起点。默认值是(Numberofvarialbles,1)Fminunc.使用TypicalX用于缩放有限差异的梯度估计。

信任地区算法使用TypicalX只是为了袭击者选择。

信任地区算法
FunctionTolerance

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

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

HessianFcn

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

如果设置为“目标”Fminunc.使用用户定义的Hessian来实现目标函数。黑森州是目标函数的第三个产出(见有趣的).

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

黑森州Multiplyfcn.

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

w = hmfun(hinfo,y)

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

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

[f,g,hinfo] =有趣(x)

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

请注意

使用黑森州Multiplyfcn.选项,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.是一种密集的矩阵。然后Fminunc.计算每次迭代中的完整有限差分近似。对于大问题来说,这种计算可能是昂贵的,因此通常更好地确定稀疏结构。

MaxPCGIter

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

PrecondBandWidth

PCG的前提者的上带宽,非负整数。默认情况下,Fminunc.使用对角预处理(上限带宽为0)。对于某些问题,增加带宽可以减少PCG迭代次数。设置PrecondBandWidth使用直接分解(Cholesky)而不是共轭梯度(CG)。直接分解比CG计算更昂贵,但为解决方案产生更好的质量步骤。

SubproblemAlgorithm

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

TolPCG

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

拟牛顿算法
HessUpdate

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

ObjectiveLimit

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

UseParallel

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

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

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

字段名 条目

客观的

目标函数

x0

初始点X

求解器

“fminunc”

选项

选择创建优化选择

数据类型:塑造

输出参数

全部折叠

解决方案,返回真正的矢量或真实数组。的大小X与大小相同x0.通常情况下,X是当地解决问题的地方ExitFlag.是正的。有关解决方案质量的信息,请参见当求职者成功时

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

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

1

梯度的大小小于OptimalityTolerance宽容。

2

的变化XStepTolerance.宽容。

3.

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

5.

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

0.

超出迭代次数最大或超出函数评估数MaxFunctionEvaluations.

-1

算法由输出函数终止。

3

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

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

迭代

采取的迭代人数

funcCount

函数计算次数

firstorderopt

一阶最优性的衡量

算法

优化算法

cgiterations

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

lssteplength

直线搜索步骤相对于搜索方向的大小('quasi-newton'仅限算法)

stepsize

最终位移X

信息

退出消息

解的梯度,返回实向量。毕业给出的梯度有趣的在点X(:)

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

算法

全部折叠

拟牛顿算法

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

信赖域算法

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

替代功能

应用程序

优化活动编辑器任务为Fminunc.

参考文献

[1] Broyden, C. G. <一类双秩最小化算法的收敛性>期刊inst。数学。applic。,卷。6,1970,第76-90页。

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

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

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

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

[6]弗莱彻,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,970,pp。647-656。

扩展功能

之前介绍过的R2006a