主要内容

fminunc

求无约束多元函数的最小值

描述

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

找到指定的问题的最小值

最小值 x f x )

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

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

例子

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

请注意

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

fminunc是针对无约束的非线性问题。如果您的问题有限制条件,一般使用fmincon.看到优化决策表

例子

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”“算法”“信赖域”“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)²)²+ (1-x(1))²;如果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)²)²+ (1-x(1))²;如果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,选项)
一阶迭代函数计数f(x)步长最优性0 3 0.256738 0.173 1 6 0.222149 1 0.131 29 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 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
输出=结构体字段:迭代:9 funcCount: 42 stepsize: 2.9343e-04 lsstelength: 1 firstorderopt: 7.9721e-07算法:'准牛顿'消息:'局部最小值发现....'
  • 出口标志1说明该解是一个局部最优解。

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

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

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

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

N = 1 e5;x0 = 2 * 1 (N, 1);x0 (2:2: N) = 2;[x, fval] = fminunc (x0 @multirosenbrock)
请求的100000x100000 (74.5GB)阵列超过了最大阵列大小优先级(63.9GB)。这可能会导致MATLAB失去响应。在optima .internal.fminunc. abstractdensehessianapproximate(第21行)中的错误。值=眼睛(据nvar);best .internal.fminunc. bfgshessian逼近错误(第14行)this = this@optim.internal.fminunc.AbstractDenseHessianApproximation(nVars);HessApprox = optimal .internal.fminunc. bfgshessian逼近(sizes.nVar);错误在fminunc (line 488) [x,FVAL,GRAD,HESSIAN,EXITFLAG,OUTPUT] = 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,错误('输入向量x为空');结束如果Mod (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 × 3的数组吗fminunc通过x有趣的作为一个5 × 3的数组。

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

x = fminunc (x0 @myfun)

在哪里myfunMATLAB是一种®等功能

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

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

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

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

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

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

信赖域算法允许你提供一个黑森乘法函数。这个函数给出了一个Hessian乘向量乘积的结果,而不需要直接计算Hessian。这可以节省内存。看到黑森乘法函数

例子:有趣= @ (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”仅在函数不收敛时显示输出,并给出技术退出消息。

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

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

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

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

PlotFcn

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

  • “optimplotx”绘制当前点。

  • “optimplotfunccount”绘制函数计数。

  • “optimplotfval”绘制函数值。

  • “optimplotstepsize”绘制步长。

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

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

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为目标函数使用用户定义的Hessian。Hessian是目标函数的第三个输出有趣的).

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

HessianMultiplyFcn

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

W = hmfun (Hinfo, Y)

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

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

[f, g, Hinfo] =乐趣(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.默认的行为是as ifHessPattern是1的密集矩阵。然后fminunc在每次迭代中计算一个完整的有限差分近似。对于大型问题,这种计算可能代价昂贵,因此通常最好确定稀疏结构。

MaxPCGIter

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

PrecondBandWidth

PCG预处理器的上带宽,非负整数。默认情况下,fminunc使用对角预处理(上带宽为0)。对于某些问题,增加带宽可以减少PCG迭代次数。设置PrecondBandWidth使用直接因式分解(Cholesky)而不是共轭梯度(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

的变化xStepTolerance宽容。

3.

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

5

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

0

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

-1

算法被输出函数终止。

3

当前迭代的目标函数为ObjectiveLimit

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

迭代

迭代次数

funcCount

函数求值的次数

firstorderopt

一阶最优性的度量

算法

优化算法

cgiterations

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

lssteplength

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

stepsize

最终位移x

消息

退出消息

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

近似Hessian,作为实矩阵返回。的意义黑森,请参阅黑森输出

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

数据类型:

算法

全部折叠

拟牛顿算法

默认情况下,拟牛顿算法采用BFGS拟牛顿法和三次线搜索程序。这种准牛顿方法使用BFGS ([1][5][8],[9])更新Hessian矩阵近似的公式。您还可以指定低内存BFGS算法(“lbfgs”)作为HessianApproximation选择。虽然不推荐,但您可以指定DFP ([4][6],[7])公式,它近似于Hessian逆矩阵,将选项设置为“dfp”.通过将选项设置为,可以指定最陡下降方法“steepdesc”,尽管这个设置通常是低效的。看到fminunc拟牛顿算法

信赖域算法

信赖域算法要求你提供梯度有趣的并设置SpecifyObjectiveGradient真正的使用optimoptions.该算法是一种子空间信赖域方法,基于文中描述的内反射牛顿方法[2]而且[3].每次迭代都使用预条件共轭梯度(PCG)方法对一个大型线性系统进行近似求解。看到fminunc信赖域算法非线性极小化的信赖域方法而且预条件共轭梯度法

选择功能

应用程序

优化Live Editor任务提供了一个可视化的界面fminunc

参考文献

[1] Broyden c.g. <一类双秩极小化算法的收敛性>。本月》杂志上。数学。品,第6卷,1970年,第76-90页。

[2]科尔曼,T. F.和李宇春。有界非线性极小化的内部信赖域方法SIAM优化期刊, 1996年第6卷,第418-445页。

[3]科尔曼,T. F.和李宇春。大范围非线性极小化问题的反射牛顿方法收敛性研究。数学规划1994年,第67卷第2期,第189-224页。

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

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

[6]弗莱彻R.《优化的实用方法》。1卷,无约束最优化,约翰·威利及其儿子,1980年。

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

[8] Goldfarb, D. <由变分均值导出的可变度量更新族>。数学的计算1970年,第24卷,第23-26页。

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

扩展功能

版本历史

之前介绍过的R2006a

Baidu
map