求无约束多变量函数的最小值
全页折叠
语法
x = fminunc(fun,x0)
x = fminunc(fun,x0,options)
x = fminunc(problem)
[x,fval] = fminunc(___)
[x,fval,exitflag,output] = fminunc(___)
[x,fval,exitflag,output,grad,hessian] = fminunc(___)
说明
非线性规划求解器。
求以下问题的最小值:
其中,f(x) 是返回标量的函数。
x 是向量或矩阵;请参阅矩阵参量。
示例
x = fminunc(fun,x0)
在点 x0
处开始并尝试求 fun
中描述的函数的局部最小值 x
。点 x0
可以是标量、向量或矩阵。
注意
传递额外参数说明如何将额外的参数传递给目标函数和非线性约束函数(如有必要)。
fminunc
适用于无约束非线性问题。如果您的问题有约束,通常使用 fmincon。请参阅优化决策表。
示例
x = fminunc(fun,x0,options)
使用 options
中指定的优化选项最小化 fun
。使用 optimoptions 可设置这些选项。
示例
x = fminunc(problem)
求 problem
的最小值,它是 problem 中所述的一个结构体。
示例
[x,fval] = fminunc(___)
对上述任何语法,返回目标函数 fun
在解 x
处的值。
示例
[x,fval,exitflag,output] = fminunc(___)
还返回描述 fminunc
的退出条件的值 exitflag
,以及提供优化过程信息的结构体 output
。
[x,fval,exitflag,output,grad,hessian] = fminunc(___)
还返回:
grad
-fun
在解x
处的梯度。hessian
-fun
在解x
处的黑塞矩阵。请参阅 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 thanthe value of the optimality tolerance.
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 thanthe value of the optimality tolerance.
x = 1×2 1.0000 1.0000
以下代码创建 rosenbrockwithgrad
函数,该函数包含梯度作为第二个输出。
function [f,g] = rosenbrockwithgrad(x)% Calculate objective ff = 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)];endend
使用问题结构体
打开实时脚本
使用问题结构体而不是单独的参量来求解与提供梯度中相同的问题。
编写返回梯度和函数值的目标函数。使用包括梯度和黑塞函数 中所述的条件化形式。目标函数是罗森布罗克函数,
,
它有梯度
.
具有梯度的目标函数的代码出现在此示例的末尾。
创建使用目标函数的梯度的选项。此外,将算法设置为 '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 thanthe value of the optimality tolerance.
x = 1×2 1.0000 1.0000
以下代码创建 rosenbrockwithgrad
函数,该函数包含梯度作为第二个输出。
function [f,g] = rosenbrockwithgrad(x)% Calculate objective ff = 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)];endend
获得最佳目标函数值
打开实时脚本
求非线性函数最小值的位置和该最小值处的函数值。目标函数是
.
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 thanthe value of the optimality tolerance.
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 thanthe value of the optimality tolerance.
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....'
退出标志
1
表明该解是局部最优解。output
结构体显示迭代次数、函数计算次数和其他信息。迭代输出还会提供迭代次数和函数计算次数。
使用 "lbfgs"
黑塞矩阵逼近求解大型问题
如果您的问题涉及诸多变量,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 eyeRequested 100000x100000 (74.5GB) array exceeds maximum array size preference (63.9GB). This might cause MATLAB to becomeunresponsive.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 thanthe 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 sizen = length(x); if n == 0, error('Input vector, x, is empty.'); endif mod(n,2) ~= 0 error('Input vector, x ,must have an even number of components.');end% Evaluate the vector functionodds = 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);endend
输入参数
全部折叠
fun
— 要计算最小值的函数
函数句柄 | 函数名称
要计算最小值的函数,指定为函数句柄或函数名称。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
options
— 优化选项
optimoptions
的输出 | 结构体,例如 optimset
返回的结构体
优化选项,指定为 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 的输出函数和Output Function and Plot Function Syntax。 对于 |
SpecifyObjectiveGradient | 用户定义的目标函数梯度。请参阅 fun 的说明,了解如何在 对于 |
StepTolerance |
对于 |
TypicalX | 典型的
|
trust-region 算法 | |
FunctionTolerance | 函数值的终止容差,非负标量。默认值为 对于 |
HessianFcn | 如果设置为 如果设置为 对于 |
HessianMultiplyFcn | 黑塞矩阵乘法函数,指定为函数句柄。对于大规模结构问题,此函数计算黑塞矩阵乘积 W = hmfun(Hinfo,Y) 其中 上述第一个参量与目标函数 [f,g,Hinfo] = fun(x)
注意 要使用 有关示例,请参阅Minimization with Dense Structured Hessian, Linear Equalities。 对于 |
HessPattern | 用于有限差分的黑塞矩阵稀疏模式。如果存在 ∂2 如果不方便在 当结构未知时,不要设置 |
MaxPCGIter | 预条件共轭梯度 (PCG) 迭代的最大次数,正标量。默认值为 |
PrecondBandWidth | PCG 的预条件子上带宽,非负整数。默认情况下, |
SubproblemAlgorithm | 确定迭代步的计算方式。与 |
TolPCG | PCG 迭代的终止容差,正标量。默认值为 |
quasi-newton 算法 | |
HessianApproximation | 指定
选择项 对于 注意 通常情况下, |
ObjectiveLimit | 容差(停止条件),标量。如果迭代中的目标函数值小于或等于 |
UseParallel | 此选项为 |
示例: options = optimoptions('fminunc','SpecifyObjectiveGradient',true)
problem
— 问题结构体
结构体
问题结构体,指定为含有以下字段的结构体:
字段名称 | 条目 |
---|---|
| 目标函数 |
| x 的初始点 |
| 'fminunc' |
| 用 optimoptions 创建的选项 |
数据类型: struct
输出参量
全部折叠
exitflag
— fminunc
停止的原因
整数
fminunc
停止的原因,以整数形式返回。
| 梯度的模小于 |
|
|
| 目标函数值的变化小于 |
| 目标函数的预测下降小于 |
迭代次数超出 | |
| 算法已被输出函数终止。 |
| 当前迭代的目标函数低于 |
output
— 有关优化过程的信息
结构体
有关优化过程的信息,以包含下列字段的结构体形式返回:
iterations | 执行的迭代次数 |
funcCount | 函数计算次数 |
firstorderopt | 一阶最优性的测度 |
algorithm | 使用的优化算法 |
cgiterations | PCG 迭代总数(仅适用于 |
lssteplength | 相对于搜索方向的线搜索步的步长(仅适用于 |
stepsize |
|
message | 退出消息 |
hessian
— 逼近黑塞矩阵
实矩阵
逼近黑塞矩阵,以实矩阵形式返回。有关 hessian
的含义,请参阅黑塞矩阵输出。
如果 HessianApproximation
选项是 "lbfgs"
或 {"lbfgs" n}
,则返回的 hessian
是 []
。
数据类型: double
算法
全部折叠
拟牛顿算法
默认情况下,quasi-newton
算法使用具有三次线搜索过程的 BFGS 拟牛顿法。这种拟牛顿法使用 BFGS([1]、[5]、[8] 和 [9])公式来更新黑塞矩阵的逼近。您还可以将低内存 BFGS 算法 ("lbfgs"
) 指定为 HessianApproximation
选项。您可以通过将选项设置为 'dfp'
来指定逼近逆黑塞矩阵的 DFP([4]、[6] 和 [7])公式,但不推荐这种做法。您可以通过将选项设置为 'steepdesc'
来指定最陡下降法,尽管此设置通常效率不高。请参阅fminunc quasi-newton 算法。
信赖域算法
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.
扩展功能
自动并行支持
通过使用 Parallel Computing Toolbox™ 自动运行并行计算来加快代码执行。
要并行运行,请将 'UseParallel'
选项设置为 true
。
options = optimoptions('
solvername
','UseParallel',true)
有关详细信息,请参阅在 Optimization Toolbox 中使用并行计算。
版本历史记录
在 R2006a 之前推出
全部展开
R2023b: CheckGradients
选项将被删除
以后的版本中将会删除 CheckGradients
选项。要检查目标函数或非线性约束函数的一阶导数,请使用 checkGradients 函数。
另请参阅
fmincon | fminsearch | optimoptions | 优化
主题
- 基于求解器的非线性优化
- 基于求解器的优化问题设置
- 无约束非线性优化算法
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 简体中文
- English
- 日本 (日本語)
- 한국 (한국어)
Contact your local office