fminunc
求无约束多元函数的最小值
语法
描述
例子
减少一个多项式
最小化函数 .
为此,编写一个匿名函数有趣的
这就计算出了目标。
有趣= @ (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函数,
的梯度
.
带有梯度的目标函数的代码出现在此示例结束.
创建选项来使用目标函数的渐变。同时,将算法设置为“信赖域”
.
选择= 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函数,
,
的梯度
.
带有梯度的目标函数的代码出现在此示例结束.
创建选项来使用目标函数的渐变。同时,将算法设置为“信赖域”
.
选择= 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)];结束结束
获得最优目标函数值
找出一个非线性函数的最小值的位置和该函数在最小值处的值。目标函数是
.
有趣= @ (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,“显示”,“通路”,“算法”,“拟牛顿”);
目标函数是
有趣= @ (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
说明该解是一个局部最优解。的
输出
结构显示迭代次数、函数计算次数和其他信息。迭代显示还显示迭代次数和函数计算。
使用“lbfgs”
大问题的Hessian近似
当您的问题有大量变量时,的默认值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)
在哪里myfun
MATLAB是一种®等功能
函数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
- - - - - -初始点
真正的向量|真正的数组
选项
- - - - - -优化选项
的输出optimoptions
|结构如optimset
返回
优化选项,指定为的输出optimoptions
或者一个结构,比如optimset
的回报。
一些选项适用于所有算法,而其他选项则与特定算法相关。看到优化选择参考的详细信息。
的选项中缺少一些选项optimoptions
显示。这些选项在下表中以斜体显示。有关详细信息,请参见视图选项.
所有的算法 | |
|
选择 的 |
CheckGradients |
比较用户提供的导数(目标梯度)和有限差分导数。的选择是 为 |
诊断 | 显示关于要最小化或解决的功能的诊断信息。的选择是 |
DiffMaxChange | 有限差分梯度(一个正标量)变量的最大变化量。默认值是 |
DiffMinChange | 有限差分梯度(一个正标量)变量的最小变化。默认值是 |
显示 |
显示水平(参见迭代显示):
|
FiniteDifferenceStepSize |
有限差分的标量或向量步长因子。当您设置
符号“(x) =符号(x) 除了标志' (0)= 1 .中心有限差分为
FiniteDifferenceStepSize 展开成一个向量。默认值是sqrt (eps) 对于正向有限差分,和eps ^ (1/3) 对于中心有限差分。信任域算法使用 为 |
FiniteDifferenceType |
有限差分,用来估计梯度,是其中之一 为 |
FunValCheck | 检查目标函数值是否有效。默认设置, |
MaxFunctionEvaluations |
允许的最大函数求值数,一个正整数。默认值为 为 |
MaxIterations |
允许的最大迭代次数,一个正整数。默认值为 为 |
OptimalityTolerance |
一阶最优性(一个正标量)上的终止公差。默认值是 为 |
OutputFcn |
指定优化函数在每次迭代时调用的一个或多个用户定义函数。传递函数句柄或函数句柄的单元格数组。默认值是none ( |
PlotFcn |
在算法执行时绘制各种进度度量;从预定义的情节中选择或编写自己的情节。传递内置plot函数名、函数句柄或内置plot函数名或函数句柄的单元格数组。对于自定义plot函数,传递函数句柄。默认值是none (
自定义plot函数使用与输出函数相同的语法。看到优化工具箱的输出函数而且输出函数和图函数语法. 为 |
SpecifyObjectiveGradient |
用户定义的目标函数的梯度。参见 为 |
StepTolerance |
终止上公差 为 |
TypicalX |
典型的 的 |
信赖域 算法 |
|
FunctionTolerance |
函数值上的终止公差为正标量。默认值是 为 |
HessianFcn |
如果设置为 如果设置为 为 |
HessianMultiplyFcn |
Hessian乘法函数,指定为函数句柄。对于大规模的结构化问题,该函数计算Hessian矩阵积 W = hmfun (Hinfo, Y) 在哪里 第一个参数与目标函数返回的第三个参数相同 [f, g, Hinfo] =乐趣(x)
请注意 使用 示例请参见密集结构Hessian线性方程的极小化. 为 |
HessPattern | 有限差分的Hessian稀疏模式。集 使用 当结构未知时,不要设置 |
MaxPCGIter | 预条件共轭梯度(PCG)迭代的最大次数,一个正标量。默认值是 |
PrecondBandWidth | PCG预处理器的上带宽,非负整数。默认情况下, |
SubproblemAlgorithm |
确定如何计算迭代步骤。默认的, |
TolPCG | PCG迭代上的终止公差为正标量。默认值是 |
拟牛顿 算法 |
|
HessianApproximation |
指定如何
选择 为 请注意 通常, |
ObjectiveLimit |
一个标量的公差(停止标准)。如果目标函数值在迭代时小于或等于 |
UseParallel |
当 |
例子:选择= optimoptions(‘fminunc’,‘SpecifyObjectiveGradient’,真的)
问题
- - - - - -问题的结构
结构
输出参数
fval
-目标函数解的值
实数
目标函数在解处的值,作为实数返回。一般来说,fval
=有趣的(x)
.
exitflag
- - -原因fminunc
停止
整数
原因fminunc
停止,作为整数返回。
|
梯度的大小小于 |
|
的变化 |
|
目标函数值的变化小于 |
|
预测的目标函数下降小于 |
|
超过的迭代次数 |
|
算法被输出函数终止。 |
|
当前迭代的目标函数为 |
输出
—优化流程信息
结构
关于优化过程的信息,作为带字段的结构返回:
迭代 |
迭代次数 |
funcCount |
函数求值的次数 |
firstorderopt |
一阶最优性的度量 |
算法 |
优化算法 |
cgiterations |
PCG迭代的总次数( |
lssteplength |
直线搜索步长相对于搜索方向的大小( |
stepsize |
最终位移 |
消息 |
退出消息 |
研究生
-解处的梯度
真正的向量
在解处的梯度,作为实向量返回。研究生
的梯度有趣的
在点x (:)
.
黑森
——近似黑森
真正的矩阵
算法
拟牛顿算法
信赖域算法
的信赖域
算法要求你提供梯度有趣的
并设置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页。
扩展功能
自动并行支持
通过使用并行计算工具箱™自动并行运行计算来加速代码。
若要并行运行,请设置“UseParallel”
选项真正的
.
选择= optimoptions ('
solvername
”、“UseParallel’,真的)
有关更多信息,请参见在优化工具箱中使用并行计算.
版本历史
之前介绍过的R2006a
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。