主要内容

fminunc

找到最小的无约束多变量函数

描述

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

找到指定的最小的问题

最小值 x f ( x )

在哪里f(x)是一个函数,它返回一个标量。

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

例子

x= fminunc (有趣的,x0)开始的时候x0并试图找到一个局部最小值x中描述的功能有趣的。这一点x0可以是一个标量、向量或矩阵。

请注意

传递额外的参数解释如何将额外的参数传递给目标函数和非线性约束函数,如果必要的。

fminunc是没有约束的非线性问题。如果你的问题有限制,一般使用fmincon。看到优化决策表

例子

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

例子

x= fminunc (问题)发现的最低标准问题描述的结构问题

例子

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

例子

(x,fval,exitflag,输出)= fminunc (___)此外,返回一个值exitflag描述的退出条件fminunc,一个结构输出的信息优化过程。

(x,fval,exitflag,输出,研究生,黑森)= 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可以更快和更可靠的当你提供衍生品。

写一个目标函数梯度的函数返回值。使用描述的条件化形式包括梯度和麻布。目标函数。函数,

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)% f计算目标f = 100 * (x (2) - (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 ) = 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)% f计算目标f = 100 * (x (2) - (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(有趣,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

有趣= @ (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,选项)
一阶迭代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 stepsize: 2.9343 e-04 lssteplength: 1 firstorderopt: 7.9721 e-07算法:“拟牛顿”的信息:“局部最小值发现....”
  • 出口标志1表明,该解决方案是一个局部最优。

  • 输出结构显示了迭代次数,数量评估函数,和其他信息。

  • 迭代显示还显示了迭代的数量和功能评价。

当你的问题大量的变量,默认值的HessianApproximation可能会导致fminunc使用大量内存和运行缓慢。使用更少的内存,运行得更快,指定HessianApproximation = " lbfgs "

例如,如果您试图最小化multirosenbrock函数(如下所示)与1 e5变量使用默认参数,fminunc一个错误的问题。

N = 1 e5;x0 = 2 * 1 (N, 1);x0 (2:2: N) = 2;[x, fval] = fminunc (x0 @multirosenbrock)
错误使用眼睛请求100000 x100000 (74.5 gb)数组超过最大数组大小的偏好(63.9 gb)。这可能导致MATLAB变得反应迟钝。错误optim.internal.fminunc.AbstractDenseHessianApproximation(21行)。值=眼睛(据nvar);错误optim.internal.fminunc.BFGSHessianApproximation(第14行)= this@optim.internal.fminunc.AbstractDenseHessianApproximation(据nvar);错误fminusub(第73行)HessApprox = optim.internal.fminunc.BFGSHessianApproximation (sizes.nVar);错误fminunc(第488行)[x, FVAL,校友,黑森、EXITFLAG输出]= fminusub (funfcn, x,…

为了解决这个问题,设置HessianApproximation选项“lbfgs”。速度解决方案,设置选项使用提供的梯度。

N = 1 e5;x0 = 2 * 1 (N, 1);x0 (2:2: N) = 2;选择= optimoptions (“fminunc”HessianApproximation =“lbfgs”,SpecifyObjectiveGradient = true);[x, fval] = fminunc (x0, @multirosenbrock选项);
局部最小值。优化完成因为梯度的大小小于最优值的宽容。

理论的解决方案是x (i) = 1对所有。检查返回的解决方案的准确性。

max (abs (x - 1))
ans = 1.3795 e-04

这段代码创建了multirosenbrock函数。

函数(f, g) = multirosenbrock (x)%的问题大小n =长度(x);如果n = = 0,错误(“输入向量,是空的。”);结束如果国防部(n, 2) ~ = 0错误(的输入向量,x,必须有一个偶数的组件。);结束%评估向量函数优势= 1:2:n;均等的= 2:2:n;F = 0 (n, 1);F(几率,1)= 1 - x(优势);F(均等的,1)= 10。* (x(均等的)- x(几率)。^ 2);f = (f . ^ 2)总和;如果nargout > = 2%计算梯度g = 0 (n, 1);g(均等的)= 200 * (x(均等的)- x(几率)。^ 2);g(优势)= 2 * (1 - x(优势)- 400 * (x(均等的)- x(几率)。^ 2)。* x(优势);结束结束

输入参数

全部折叠

函数最小化,指定为一个函数处理或函数名。有趣的是一个函数,它接受一个向量或数组x并返回一个真正的标量f的目标函数值x

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

指定有趣的作为一个函数处理一个文件:

x = fminunc (x0 @myfun)

在哪里myfunMATLAB是一种®等功能

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

您还可以指定有趣的作为一个匿名函数的函数处理:

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

如果你能计算的梯度有趣的SpecifyObjectiveGradient选项设置为真正的设定的,

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

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

信赖域算法允许您提供一个黑森乘法函数。这个函数给出的结果Hessian-times-vector产品没有直接计算的麻绳。这可以节省内存。看到黑森乘法函数

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

数据类型:字符|function_handle|字符串

初始点,指定为一个真正的向量或真正的数组。解决使用中元素的数量x0和的大小x0确定变量的数量和大小有趣的接受。

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

数据类型:

优化选项,指定的输出optimoptions或结构等optimset的回报。

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

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

所有的算法

算法

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

“信赖域”算法需要你提供梯度(见的描述有趣的),否则fminunc使用“拟牛顿”算法。选择算法的信息,请参阅选择算法

CheckGradients

比较用户提供衍生品(客观的梯度)有限差分衍生品。的选择是(默认)或真正的

optimset,名字是DerivativeCheck和值“上”“关闭”。看到当前和遗留选项名称

诊断

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

DiffMaxChange

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

DiffMinChange

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

显示

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

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

  • “通路”在每个迭代中显示输出,给出了默认退出消息。

  • “iter-detailed”在每个迭代中显示输出,给出了技术退出消息。

  • “通知”显示输出只有在函数不收敛,并给出默认退出消息。

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

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

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

FiniteDifferenceStepSize

标量或矢量步长因子有限的差异。当您设置FiniteDifferenceStepSize一个向量v向前,有限的差异δ

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

在哪里信号′(x) =标志(x)除了信号′(0)= 1。中央有限的差异是

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

标量FiniteDifferenceStepSize扩大到一个向量。默认值是sqrt (eps)向前有限的差异,eps ^ (1/3)中央有限的差异。

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

optimset,名字是FinDiffRelStep。看到当前和遗留选项名称

FiniteDifferenceType

有限的差异,用于估算梯度,要么“前进”(默认),或“中央”(中心)。“中央”需要两倍的功能评估,但应该更准确。信赖域算法使用FiniteDifferenceType只有当CheckGradients被设置为真正的

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

FunValCheck

检查目标函数值是否有效。默认设置,“关闭”,不执行一个检查。的“上”设置显示一个错误当目标函数返回一个值复杂的,,或

MaxFunctionEvaluations

最大允许函数值的运算次数,一个正整数。默认值是100 * numberOfVariables。看到公差和停止条件迭代和函数计算

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

MaxIterations

最大允许的迭代次数,一个正整数。默认值是400年。看到公差和停止条件迭代和函数计算

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

OptimalityTolerance

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

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

OutputFcn

指定一个或多个用户定义的函数,每个迭代的优化函数调用。通过一个函数处理或处理单元阵列的功能。默认是没有([])。看到输出函数和情节函数的语法

PlotFcn

情节在算法执行时进步的各种措施;从预定义的情节或编写自己的选择。通过一个内置的函数名,函数处理,或单元阵列的内置函数名或函数处理。自定义绘制函数,通过函数处理。默认是没有([]):

  • “optimplotx”当前点的阴谋。

  • “optimplotfunccount”情节数的函数。

  • “optimplotfval”情节的函数值。

  • “optimplotstepsize”情节的步长。

  • “optimplotfirstorderopt”情节一阶最优性措施。

自定义函数使用相同的语法作为输出函数。看到输出函数优化工具箱输出函数和情节函数的语法

optimset,名字是PlotFcns。看到当前和遗留选项名称

SpecifyObjectiveGradient

由用户定义的目标函数的梯度。看到的描述有趣的看到如何定义的梯度有趣的。设置为真正的fminunc使用一个用户定义的目标函数的梯度。默认的原因fminunc估计使用有限差分梯度。你必须提供的梯度,并设置SpecifyObjectiveGradient真正的,利用信赖域算法。这个选项不需要拟牛顿算法。

optimset,名字是GradObj和值“上”“关闭”。看到当前和遗留选项名称

StepTolerance

终止上公差x,一个积极的标量。默认值是1 e-6。看到公差和停止条件

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

TypicalX

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

信赖域算法使用TypicalX只是为了CheckGradients选择。

信赖域算法
FunctionTolerance

终止公差函数值,一个积极的标量。默认值是1 e-6。看到公差和停止条件

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

HessianFcn

如果设置为[](默认),fminunc接近黑森使用有限的差异。

如果设置为“目标”,fminunc为目标函数使用一个用户定义的黑森。海赛第三输出的目标函数(见有趣的)。

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

HessianMultiplyFcn

黑森乘法函数,指定为一个函数处理。大规模的结构性问题,这个函数计算海赛矩阵产品H * Y没有真正形成H。的函数形式

W = hmfun (Hinfo, Y)

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

第一个参数是一样的第三个参数返回的目标函数有趣的例如,

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

Y是一个矩阵的行数一样有尺寸问题。矩阵W = H * Y,虽然H不是显式地形成的。fminunc使用Hinfo计算预调节器。信息如何提供任何额外的参数的值hmfun需要,请参阅传递额外的参数

请注意

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

例如,看到的最小化茂密的结构化的麻绳,线性等式

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

HessPattern

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

使用HessPattern时不方便计算海赛矩阵H有趣的,但你可以决定(验货)组件的梯度有趣的取决于x (j)fminunc可以近似H通过稀疏有限差分(梯度)如果你提供稀疏结构H的价值HessPattern。换句话说,提供非零的位置。

当结构是未知的,不确定HessPattern。就好像默认行为HessPattern是一个稠密矩阵的。然后fminunc在每个迭代计算完整的有限差分近似。这个计算可以为大问题是昂贵的,所以通常是更好的确定稀疏结构。

MaxPCGIter

最大数量的预处理共轭梯度迭代(PCG),一个积极的标量。默认值是马克斯(1楼(numberOfVariables / 2))。有关更多信息,请参见信赖域算法

PrecondBandWidth

上的带宽预调节器PCG,一个非负整数。默认情况下,fminunc上层的带宽使用对角预处理(0)。对于某些问题,增加带宽减少了PCG迭代的数量。设置PrecondBandWidth使用直接分解(柯列斯基)而非共轭梯度(CG)。直接分解比CG计算更贵,但质量更好一步生成解决方案。

SubproblemAlgorithm

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

TolPCG

在PCG迭代终止宽容,积极的标量。默认值是0.1

拟牛顿算法
HessianApproximation

指定如何fminunc计算的麻绳。的选择是:

  • “蓄热”(默认)

  • “lbfgs”

  • {“lbfgs”,正整数}

选择“lbfgs”是一样的{“lbfgs”, 10},意思是默认的“lbfgs”内存值10。使用“lbfgs”与许多变量的问题。看到解决非线性问题和许多变量

optimset选项名称HessUpdate和值“蓄热”,“lbfgs”,{“lbfgs”,正整数},“dfp”,“steepdesc”。看到当前和遗留选项名称

请注意

通常,“dfp”“steepdesc”值不会工作得很好。他们是用于教育目的;看到香蕉函数最小化

ObjectiveLimit

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

UseParallel

真正的,fminunc估计并行梯度。禁用默认设置,信赖域需要一个梯度的目标UseParallel不适用。看到并行计算

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

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

字段名 条目

客观的

目标函数

x0

初始点x

解算器

“fminunc”

选项

选择创建optimoptions

数据类型:结构体

输出参数

全部折叠

解决方案,作为真正的向量或返回数组。的大小x是一样的尺寸吗x0。通常情况下,x是当地的解决问题的办法exitflag是正的。信息的质量解决方案,明白了当解决成功

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

原因fminunc停止,返回一个整数。

1

梯度的大小是小于OptimalityTolerance宽容。

2

的变化x是小于StepTolerance宽容。

3

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

5

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

0

迭代次数超过MaxIterations超过或数量的功能评估MaxFunctionEvaluations

1

输出函数算法终止。

3

在当前迭代目标函数下面去了ObjectiveLimit

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

迭代

采取的迭代次数

funcCount

数量的功能评估

firstorderopt

的一阶最优性

算法

优化算法

cgiterations

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

lssteplength

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

stepsize

最终位移x

消息

退出消息

梯度的解决方案,作为一个真正的返回向量。研究生给的梯度有趣的在点x (:)

近似的麻绳,作为一个真正的返回矩阵。对的意思黑森,请参阅黑森输出

如果HessianApproximation选择是“lbfgs”{“lbfgs”n}然后返回的黑森[]

数据类型:

算法

全部折叠

拟牛顿算法

默认情况下,拟牛顿算法使用bfg拟牛顿方法与立方线搜索过程。这个拟牛顿方法使用蓄热([1],[5],[8],[9])更新海赛矩阵的近似公式。您还可以指定内存bfg算法(“lbfgs”)作为HessianApproximation选择。虽然不推荐,您可以指定DFP ([4],[6],[7])公式,近似逆海赛矩阵,通过设置选项“dfp”。您可以指定一个最陡下降法通过设置选项“steepdesc”,尽管这个设置通常是低效率的。看到fminunc拟牛顿算法

信赖域算法

信赖域要求您提供的梯度算法有趣的并设置SpecifyObjectiveGradient真正的使用optimoptions。该算法是一个子空间信赖域方法和基于interior-reflective牛顿方法中描述[2][3]。每个迭代都包括近似解大型线性系统使用条件共轭梯度法(PCG)。看到fminunc信赖域算法,信赖域方法非线性最小化预处理共轭梯度法

选择功能

应用程序

优化住编辑任务提供了一个可视化界面fminunc

引用

[1]Broyden, c . g .“Double-Rank最小化算法的收敛类的。”本月》杂志上。数学。品6卷,1970年,页76 - 90。

[2]科尔曼,t·f·李和y。“内部,信赖域方法对非线性最小化范围。”暹罗杂志上优化》第六卷,1996年,页418 - 445。

[3]科尔曼,t·f·李和y。“大规模非线性最小化的反光牛顿方法的收敛范围。”数学规划2号,卷。67年,1994年,页189 - 224。

[4]Davidon, w . c .“变量指标最小化的方法。”A.E.C.研发报告1959年,退火- 5990。

[5]弗莱彻,r .变量度量算法的新方法。电脑杂志13卷,1970年,页317 - 322。

[6]弗莱彻,>实用的优化方法。“卷1,。无约束最优化1980年,约翰·威利和儿子。

[7]弗莱彻、r、m·j·d·鲍威尔。“快速收敛的后裔最小化的方法。”电脑杂志》第六卷,1963年,页163 - 168。

[8]戈德法布,d .“家庭变量指标更新派生通过变分方法。”数学的计算24卷,1970年,页23日。

[9]Shanno, d . f .”条件的拟牛顿方法函数最小化。”数学的计算24卷,1970年,页647 - 656。

扩展功能

版本历史

之前介绍过的R2006a