主要内容

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”“算法”“信赖域”“SpecifyObjectiveGradient”,对);

设置初始点为[1,2].然后调用fminunc

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

下面的代码创建罗森布罗克维斯格拉德函数,其中包括梯度作为第二个输出。

函数(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”“算法”“信赖域”“SpecifyObjectiveGradient”,对);

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

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

解决这个问题。

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

下面的代码创建罗森布罗克维斯格拉德函数,其中包括梯度作为第二个输出。

函数(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(有趣,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步长:2.9343e-04 lssteplength:1 firstorderopt:7.9721e-07算法:“拟牛顿”消息:“…”
  • 出口标志1证明了解是一个局部最优解。

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

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

输入参数

全部折叠

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

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

x=fminunc(@myfun,x0)

哪里我的乐趣MATLAB是一种®等功能

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

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

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

如果你能计算出有趣的SpecifyObjectiveGradient选项设置为符合事实的按规定

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

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

信赖域算法允许您提供一个Hessian乘法函数。这个函数给出了一个Hessian-time -vector乘积的结果,而不直接计算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,正有限差分希腊字母表的第4个字母

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

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

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

标量FiniteDifferenceStepSize展开为向量。默认值为sqrt (eps)对于正向有限差分,以及eps ^ (1/3)对于中心有限差分。

信任区域算法使用FiniteDifferenceStepSize只有当CheckGradients被设置为符合事实的

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

有限差分类型

用于估计梯度的有限差分是“前进”(默认),或“中央”(中心)。“中央”需要两倍的函数求值,但应该更精确有限差分类型只有当CheckGradients被设置为符合事实的

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

欢乐支票

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

MaxFunctionEvaluations

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

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

MaxIterations

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

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

最佳耐受性

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

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

OutputFcn

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

PlotFcn

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

  • “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.看到当前和遗留选项名称

黑森

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

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

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

HessianMultiplyFcn

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

W=hmfun(Hinfo,Y)

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

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

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

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

请注意

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

例如,请参见稠密结构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))。有关详细信息,请参阅信赖域算法

预带宽

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

SubproblemAlgorithm

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

TolPCG

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

拟牛顿算法
HessUpdate

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

ObjectiveLimit

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

UseParallel

符合事实的fminunc平行估计梯度。通过设置为默认值来禁用,信赖域在物镜上需要一个梯度,所以UseParallel不适用。看到并行计算

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

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

字段名 条目

客观的

目标函数

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

一阶最优性的度量

算法

使用的优化算法

CG迭代

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

lssteplength

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

步长

最终位移x

消息

退出消息

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

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

算法

全部折叠

拟牛顿算法

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

信赖域算法

信赖域算法要求你提供梯度有趣的设定SpecifyObjectiveGradient符合事实的使用optimoptions该算法是一种子空间信赖域方法,基于中描述的内部反射牛顿法[2][3].每次迭代都涉及到使用预条件共轭梯度(PCG)方法求解一个大线性系统的近似解。看到fminunc信赖域算法非线性极小化的信赖域方法预条件共轭梯度法

选择功能

应用程序

优化活动编辑器任务为fminunc

参考文献

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

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

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

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

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

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

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

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

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

扩展功能

在R2006a之前引入