fminunc
求无约束多变量函数的最小值
语法
说明
示例
最小化函数:。
为此,编写用于计算目标的匿名函数 fun。
fun = @(x)3*x(1)^2 + 2*x(1)*x(2) + x(2)^2 - 4*x(1) + 5*x(2);
调用 fminunc 以在 [1,1] 附近处求 fun 的最小值。
x0 = [1,1]; [x,fval] = fminunc(fun,x0)
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance. <stopping criteria details>
x = 1×2
2.2500 -4.7500
fval = -16.3750
当您提供导数时,fminunc 可以执行得更快、也更可靠。
编写返回梯度和函数值的目标函数。使用包括梯度和黑塞函数 中所述的条件化形式。目标函数是罗森布罗克函数,
它有梯度
.
具有梯度的目标函数的代码出现在此示例的末尾。
创建使用目标函数的梯度的选项。此外,将算法设置为 'trust-region'。
options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);
将初始点设置为 [-1,2]。然后调用 fminunc。
x0 = [-1,2]; fun = @rosenbrockwithgrad; x = fminunc(fun,x0,options)
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance. <stopping criteria details>
x = 1×2
1.0000 1.0000
以下代码创建 rosenbrockwithgrad 函数,该函数包含梯度作为第二个输出。
function [f,g] = rosenbrockwithgrad(x) % Calculate objective f f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2; if nargout > 1 % gradient required g = [-400*(x(2)-x(1)^2)*x(1) - 2*(1-x(1)); 200*(x(2)-x(1)^2)]; end end
使用问题结构体而不是单独的参量来求解与提供梯度中相同的问题。
编写返回梯度和函数值的目标函数。使用包括梯度和黑塞函数 中所述的条件化形式。目标函数是罗森布罗克函数,
,
它有梯度
.
具有梯度的目标函数的代码出现在此示例的末尾。
创建使用目标函数的梯度的选项。此外,将算法设置为 'trust-region'。
options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);
创建包括初始点 x0 = [-1,2] 的问题结构体。有关此结构体中的必填字段,请参阅problem。
problem.options = options;
problem.x0 = [-1,2];
problem.objective = @rosenbrockwithgrad;
problem.solver = 'fminunc';求解。
x = fminunc(problem)
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance. <stopping criteria details>
x = 1×2
1.0000 1.0000
以下代码创建 rosenbrockwithgrad 函数,该函数包含梯度作为第二个输出。
function [f,g] = rosenbrockwithgrad(x) % Calculate objective f f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2; if nargout > 1 % gradient required g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)); 200*(x(2)-x(1)^2)]; end end
求非线性函数最小值的位置和该最小值处的函数值。目标函数是
.
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(fun,x0)
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance. <stopping criteria details>
x = 1×2
-0.6691 0.0000
fval = -0.4052
选择 fminunc 选项和输出来检查求解过程。
设置选项以获取迭代输出并使用 'quasi-newton' 算法。
options = optimoptions(@fminunc,'Display','iter','Algorithm','quasi-newton');
目标函数是
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,output] = fminunc(fun,x0,options)
First-order
Iteration Func-count f(x) Step-size optimality
0 3 0.256738 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.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
Local minimum found.
Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
<stopping criteria details>
x = 1×2
-0.6691 0.0000
fval = -0.4052
exitflag = 1
output = struct with fields:
iterations: 9
funcCount: 42
stepsize: 2.9343e-04
lssteplength: 1
firstorderopt: 7.9721e-07
algorithm: 'quasi-newton'
message: 'Local minimum found.↵↵Optimization completed because the size of the gradient is less than↵the value of the optimality tolerance.↵↵<stopping criteria details>↵↵Optimization completed: The first-order optimality measure, 6.796073e-07, is less ↵than options.OptimalityTolerance = 1.000000e-06.'
退出标志
1表明该解是局部最优解。output结构体显示迭代次数、函数计算次数和其他信息。迭代输出还会提供迭代次数和函数计算次数。
如果您的问题涉及诸多变量,HessianApproximation 的默认值会导致 fminunc 使用大量内存并且运行缓慢。要减少内存使用并加快运行速度,请指定 HessianApproximation="lbfgs"。
例如,如果您尝试使用默认参数最小化具有 1e5 变量的 multirosenbrock 函数(如下所列),fminunc 会引发错误。
N = 1e5; x0 = -2*ones(N,1); x0(2:2:N) = 2; [x,fval] = fminunc(@multirosenbrock,x0)
Error using eye
Requested 100000x100000 (74.5GB) array exceeds maximum array size preference (63.9GB). This might cause MATLAB to become
unresponsive.
Error in optim.internal.fminunc.AbstractDenseHessianApproximation (line 21)
this.Value = eye(nVars);
Error in optim.internal.fminunc.BFGSHessianApproximation (line 14)
this = this@optim.internal.fminunc.AbstractDenseHessianApproximation(nVars);
Error in fminusub (line 73)
HessApprox = optim.internal.fminunc.BFGSHessianApproximation(sizes.nVar);
Error in fminunc (line 488)
[x,FVAL,GRAD,HESSIAN,EXITFLAG,OUTPUT] = fminusub(funfcn,x, ...要求解此问题,请将 HessianApproximation 选项设置为 "lbfgs"。要加速求解,请设置选项以使用提供的梯度。
N = 1e5; x0 = -2*ones(N,1); x0(2:2:N) = 2; options = optimoptions("fminunc",HessianApproximation="lbfgs",... SpecifyObjectiveGradient=true); [x,fval] = fminunc(@multirosenbrock,x0,options);
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.
对于所有 i,理论解是 x(i) = 1。检查返回的解的精确度。
max(abs(x-1))
ans = 1.3795e-04
使用以下代码创建 multirosenbrock 函数。
function [f,g] = multirosenbrock(x) % Get the problem size n = length(x); if n == 0, error('Input vector, x, is empty.'); end if mod(n,2) ~= 0 error('Input vector, x ,must have an even number of components.'); end % Evaluate the vector function odds = 1:2:n; evens = 2:2:n; F = zeros(n,1); F(odds,1) = 1-x(odds); F(evens,1) = 10.*(x(evens)-x(odds).^2); f = sum(F.^2); if nargout >= 2 % Calculate gradient g = zeros(n,1); g(evens) = 200*(x(evens)-x(odds).^2); g(odds) = -2*(1 - x(odds)) - 400*(x(evens)-x(odds).^2).*x(odds); end end
输入参数
要最小化的函数,指定为函数句柄或函数名称。fun 函数接受向量或数组 x,并返回实数标量 f,即在 x 处计算的目标函数值。
fminunc 以 x0 参量的形状将 x 传递给目标函数。例如,如果 x0 是 5×3 数组,则 fminunc 将 x 以 5×3 数组的形式传递给 fun。
将 fun 指定为文件的函数句柄:
x = fminunc(@myfun,x0)
其中 myfun 是一个 MATLAB® 函数,例如
function f = myfun(x) f = ... % Compute function value at x
您还可以为匿名函数指定 fun 作为函数句柄:
x = fminunc(@(x)norm(x)^2,x0);
如果您可以计算 fun 的梯度且 SpecifyObjectiveGradient 选项设置为 true,设置如下
options = optimoptions('fminunc','SpecifyObjectiveGradient',true)
fun 必须在第二个输出参量中返回梯度向量 g(x)。如果您还可以计算黑塞矩阵,并通过 options = optimoptions('fminunc','HessianFcn','objective') 将 HessianFcn 选项设置为 'objective',且将 Algorithm 选项设置为 'trust-region',则 fun 必须在第三个输出参量中返回黑塞值 H(x),即一个对称矩阵。fun 可以给出稀疏黑塞矩阵。有关详细信息,请参阅适用于 fminunc 信赖域或 fmincon 信赖域反射算法的黑塞函数。
trust-region 算法允许您提供黑塞矩阵乘法函数。此函数给出黑塞乘以向量的乘积结果,而不直接计算黑塞矩阵。这可以节省内存。请参阅黑塞矩阵乘法函数。
示例: fun = @(x)sin(x(1))*cos(x(2))
数据类型: char | function_handle | string
初始点,指定为实数向量或实数数组。求解器使用 x0 中的元素数量和 x0 的大小来确定 fun 接受的变量数量和大小。
示例: x0 = [1,2,3,4]
数据类型: double
优化选项,指定为 optimoptions 的输出或 optimset 等返回的结构体。
一些选项适用于所有算法,其他选项则与特定算法相关。有关详细信息,请参阅优化选项参考。
optimoptions 显示中缺少某些选项。这些选项在下表中以斜体显示。有关详细信息,请参阅查看优化选项。
| 所有算法 | |
| 选择
|
| CheckGradients | 将用户提供的导数(目标的梯度)与有限差分导数进行比较。选项是 对于 以后的版本中将会删除 |
| Diagnostics | 显示关于要最小化或求解的函数的诊断信息。选项是 |
| DiffMaxChange | 有限差分梯度变量的最大变化(正标量)。默认值为 |
| DiffMinChange | 有限差分梯度变量的最小变化(正标量)。默认值为 |
Display | 显示级别(请参阅迭代输出):
|
FiniteDifferenceStepSize | 有限差分的标量或向量步长因子。当您将
sign′(x) = sign(x)(例外是 sign′(0) = 1)。中心有限差分是
FiniteDifferenceStepSize 扩展为向量。对于正向有限差分,默认值为 sqrt(eps);对于中心有限差分,默认值为 eps^(1/3)。 仅当 对于 |
FiniteDifferenceType | 用于估计梯度的有限差分是 对于 |
| FunValCheck | 检查目标函数值是否有效。默认设置 |
MaxFunctionEvaluations | 允许的最大函数计算次数,非负整数。默认值为 对于 |
MaxIterations | 允许的最大迭代次数,非负整数。默认值为 对于 |
OptimalityTolerance | 一阶最优性的终止容差(非负标量)。默认值为 对于 |
OutputFcn | 指定优化函数在每次迭代中调用的一个或多个用户定义的函数。传递函数句柄或函数句柄的元胞数组。默认值是“无”( |
PlotFcn | 对算法执行过程中的各种进度测量值绘图,可以选择预定义的绘图,也可以自行编写绘图函数。传递内置绘图函数名称、函数句柄或由内置绘图函数名称或函数句柄组成的元胞数组。对于自定义绘图函数,传递函数句柄。默认值是“无”(
自定义绘图函数使用与输出函数相同的语法。请参阅Optimization Toolbox 的输出函数和输出函数和绘图函数语法。 对于 |
SpecifyObjectiveGradient | 用户定义的目标函数梯度。请参阅 对于 |
StepTolerance |
对于 |
TypicalX | 典型的
|
trust-region 算法 | |
FunctionTolerance | 函数值的终止容差,非负标量。默认值为 对于 |
HessianFcn | 如果设置为 如果设置为 对于 |
HessianMultiplyFcn | 黑塞矩阵乘法函数,指定为函数句柄。对于大规模结构问题,此函数计算黑塞矩阵乘积 W = hmfun(Hinfo,Y) 其中 上述第一个参量与目标函数 [f,g,Hinfo] = fun(x)
注意 要使用 有关示例,请参阅使用密集结构 Hessian 和线性等式进行最小化。 对于 |
| HessPattern | 用于有限差分的黑塞矩阵稀疏模式。如果存在 ∂2 如果不方便在 当结构未知时,不要设置 |
| MaxPCGIter | 预条件共轭梯度 (PCG) 迭代的最大次数,正标量。默认值为 |
| PrecondBandWidth | PCG 的预条件子上带宽,非负整数。默认情况下, |
SubproblemAlgorithm | 确定迭代步的计算方式。与 |
| TolPCG | PCG 迭代的终止容差,正标量。默认值为 |
quasi-newton 算法 | |
HessianApproximation | 指定
选择项 对于 注意 通常情况下, |
ObjectiveLimit | 容差(停止条件),标量。如果迭代中的目标函数值小于或等于 |
UseParallel | 此选项为 |
示例: options = optimoptions('fminunc','SpecifyObjectiveGradient',true)
问题结构体,指定为含有以下字段的结构体:
| 字段名称 | 条目 |
|---|---|
| 目标函数 |
| x 的初始点 |
| 'fminunc' |
| 用 optimoptions 创建的选项 |
数据类型: struct
输出参量
解处的目标函数值,以实数形式返回。通常,fval = fun(x)。
fminunc 停止的原因,以整数形式返回。
| 梯度的模小于 |
|
|
| 目标函数值的变化小于 |
| 目标函数的预测下降小于 |
| 迭代次数超出 |
| 算法已被输出函数终止。 |
| 当前迭代的目标函数低于 |
有关优化过程的信息,以包含下列字段的结构体形式返回:
iterations | 执行的迭代次数 |
funcCount | 函数计算次数 |
firstorderopt | 一阶最优性的测度 |
algorithm | 使用的优化算法 |
cgiterations | PCG 迭代总数(仅适用于 |
lssteplength | 相对于搜索方向的线搜索步的步长(仅适用于 |
stepsize |
|
message | 退出消息 |
解处的梯度,以实数向量形式返回。grad 给出 fun 在 x(:) 点处的梯度。
逼近黑塞矩阵,以实矩阵形式返回。有关 hessian 的含义,请参阅黑塞矩阵输出。
如果 HessianApproximation 选项是 "lbfgs" 或 {"lbfgs" n},则返回的 hessian 是 []。
数据类型: double
详细信息
接下来的几项列出了可能增强的退出消息 fminunc。增强的退出消息在消息的第一句中给出了详细信息的链接。
求解器找到一个点,它似乎是 局部最小值,因为 一阶最优性测度 小于 OptimalityTolerance容差。
有关如何继续的建议,请参阅求解成功后。
初始点似乎是一个局部最小值,因为 一阶最优性测度 小于 OptimalityTolerance容差。
有关如何继续的建议,请参阅终点等于初始点。
求解器可能已经达到了 局部最小值,但不能确定,因为 一阶最优性测度 不小于 OptimalityTolerance容差。
有关如何继续的建议,请参阅可能是局部最小值。
求解器停止,因为它在将目标函数最小化至要求的容差之前达到了迭代或函数计算次数的限制。
有关如何继续的建议,请参阅迭代或函数计算次数太多。
求解器到达一个可行点,其目标函数值小于或等于 ObjectiveLimit 容差。问题是无界的,或缩放不当,或 ObjectiveLimit 选项太高。
有关如何继续的建议,请参阅问题无界。
'trust-region' 算法要求您在目标函数中提供梯度,并将 SpecifyObjectiveGradient 选项设置为 true。
要继续,请执行以下操作之一:
将
Algorithm选项设置为'quasi-newton'。确保您的目标函数提供梯度并将
SpecifyObjectiveGradient选项设置为true。请参阅包括梯度和黑塞函数。
接下来的几项包含以下术语的定义 fminunc 退出消息。
一般来说,容差是一个阈值,超过阈值时将终止求解器的迭代。有关容差的详细信息,请参阅容差和停止条件。
函数的局部最小值是指这样的一个点:其函数值小于附近的点,但可能大于远处的点。
全局最小值是函数值小于所有其他可行点的点。

求解器尝试找到局部最小值。该结果也可能是全局最小值。有关详细信息,请参阅局部最优与全局最优。
一阶最优性测度是梯度向量分量绝对值的最大值(也称为梯度的无穷范数)。在最小化点处,此值应为零。
有关详细信息,请参阅一阶最优性测度。
梯度大小是梯度向量分量绝对值的最大值(也称为无穷范数)。在最小化点处,此值应为零。
有关详细信息,请参阅一阶最优性测度。
称为 OptimalityTolerance 的容差与一阶最优性测度相关。当一阶最优性测度小于 OptimalityTolerance 时,迭代结束。
无约束问题的一阶最优性测度是梯度向量分量绝对值的最大值(也称为梯度的无穷范数)。在最小化点处,此值应为零。
有关详细信息,请参阅一阶最优性测度。
FunctionTolerance 是一个容差 为目标函数值最新变化的大小。

StepTolerance 是一个 容差 表示最后一步的大小,即评估目标函数的位置变化的大小。

当前步长的范数是计算目标函数时的位置的变化大小。
有关详细信息,请参阅容差和停止条件。
求解器到达一个可行点,其目标函数值小于或等于 ObjectiveLimit 容差。问题是无界的,或缩放不当,或 ObjectiveLimit 选项太高。
有关如何继续的建议,请参阅问题无界。
线搜索区间是沿搜索方向的线段,求解器尝试在该线段上最小化目标函数。如果此区间太小,求解器将退出。求解器根据无约束非线性优化算法中所述的各种算法计算搜索方向和此区间的大小。
求解器的每次迭代都会对输出函数(或绘图函数)进行一次计算。它可以在求解器的运行过程中报告许多优化量,并可以停止求解器的运行。
有关详细信息,请参阅Optimization Toolbox 的输出函数或绘图函数。
搜索方向是从当前点开始的向量,求解器沿该向量寻找改进。Optimization Toolbox™ 求解器通过各种算法计算搜索方向,如无约束非线性优化算法中所述。
算法
trust-region 算法要求您在 fun 中提供梯度,并使用 optimoptions 将 SpecifyObjectiveGradient 设置为 true。此算法是一种子空间信赖域方法,基于 [2] 和 [3] 中所述的内部反射牛顿法。每次迭代都涉及使用预条件共轭梯度法 (PCG) 来近似求解大型线性系统。请参阅fminunc trust-region 算法、非线性最小化信赖域方法和预条件共轭梯度法。
替代功能
App
优化实时编辑器任务为 fminunc 提供了一个可视化界面。
参考
[1] Broyden, C. G. “The Convergence of a Class of Double-Rank Minimization Algorithms.” Journal Inst. Math. Applic., Vol. 6, 1970, pp. 76–90.
[2] Coleman, T. F. and Y. Li. “An Interior, Trust Region Approach for Nonlinear Minimization Subject to Bounds.” SIAM Journal on Optimization, Vol. 6, 1996, pp. 418–445.
[3] Coleman, T. F. and Y. Li. “On the Convergence of Reflective Newton Methods for Large-Scale Nonlinear Minimization Subject to Bounds.” Mathematical Programming, Vol. 67, Number 2, 1994, pp. 189–224.
[4] Davidon, W. C. “Variable Metric Method for Minimization.” A.E.C. Research and Development Report, ANL-5990, 1959.
[5] Fletcher, R. “A New Approach to Variable Metric Algorithms.” Computer Journal, Vol. 13, 1970, pp. 317–322.
[6] Fletcher, R. “Practical Methods of Optimization.” Vol. 1, Unconstrained Optimization, John Wiley and Sons, 1980.
[7] Fletcher, R. and M. J. D. Powell. “A Rapidly Convergent Descent Method for Minimization.” Computer Journal, Vol. 6, 1963, pp. 163–168.
[8] Goldfarb, D. “A Family of Variable Metric Updates Derived by Variational Means.” Mathematics of Computing, Vol. 24, 1970, pp. 23–26.
[9] Shanno, D. F. “Conditioning of Quasi-Newton Methods for Function Minimization.” Mathematics of Computing, Vol. 24, 1970, pp. 647–656.
扩展功能
要并行运行,请将 'UseParallel' 选项设置为 true。
options = optimoptions('solvername','UseParallel',true)
有关详细信息,请参阅在 Optimization Toolbox 中使用并行计算。
版本历史记录
在 R2006a 之前推出以后的版本中将会删除 CheckGradients 选项。要检查目标函数或非线性约束函数的一阶导数,请使用 checkGradients 函数。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)