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.
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.
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.
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.
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.
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 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
— 要计算最小值的函数
函数句柄 | 函数名称
要计算最小值的函数,指定为函数句柄或函数名称。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
— 初始点
实数向量 | 实数数组
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 的输出函数和输出函数和绘图函数语法。 对于 |
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)
problem
— 问题结构体
结构体
问题结构体,指定为含有以下字段的结构体:
字段名称 | 条目 |
---|---|
| 目标函数 |
| x 的初始点 |
| 'fminunc' |
| 用 optimoptions 创建的选项 |
数据类型: struct
输出参量
fval
— 解处的目标函数值
实数
解处的目标函数值,以实数形式返回。通常,fval
= fun(x)
。
exitflag
— fminunc
停止的原因
整数
fminunc
停止的原因,以整数形式返回。
| 梯度的模小于 |
|
|
| 目标函数值的变化小于 |
| 目标函数的预测下降小于 |
| 迭代次数超出 |
| 算法已被输出函数终止。 |
| 当前迭代的目标函数低于 |
output
— 有关优化过程的信息
结构体
有关优化过程的信息,以包含下列字段的结构体形式返回:
iterations | 执行的迭代次数 |
funcCount | 函数计算次数 |
firstorderopt | 一阶最优性的测度 |
algorithm | 使用的优化算法 |
cgiterations | PCG 迭代总数(仅适用于 |
lssteplength | 相对于搜索方向的线搜索步的步长(仅适用于 |
stepsize |
|
message | 退出消息 |
grad
— 解处的梯度
实数向量
解处的梯度,以实数向量形式返回。grad
给出 fun
在 x(:)
点处的梯度。
hessian
— 逼近黑塞矩阵
实矩阵
逼近黑塞矩阵,以实矩阵形式返回。有关 hessian
的含义,请参阅黑塞矩阵输出。
如果 HessianApproximation
选项是 "lbfgs"
或 {"lbfgs" n}
,则返回的 hessian
是 []
。
数据类型: double
算法
拟牛顿算法
信赖域算法
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
函数。
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:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
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)