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
可以更快和更可靠的当你提供衍生品。
写一个目标函数梯度的函数返回值。使用描述的条件化形式包括梯度和麻布。目标函数。函数,
的梯度
。
的代码与梯度出现在目标函数这个例子。
创建选项使用目标函数的梯度。同时,设置算法“信赖域”
。
选择= optimoptions (“fminunc”,“算法”,“信赖域”,“SpecifyObjectiveGradient”,真正的);
设置初始点[1,2
]。然后调用fminunc
。
x0 = [1, 2];有趣= @rosenbrockwithgrad;x = fminunc(有趣,x0,选项)
局部最小值。优化完成因为梯度的大小小于最优值的宽容。
x =1×21.0000 - 1.0000
下面的代码创建rosenbrockwithgrad
功能,包括梯度作为第二个输出。
函数(f, g) = rosenbrockwithgrad (x)% f计算目标f = 100 * (x (2) - (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)];结束结束
使用问题的结构
在解决相同的问题供应梯度使用问题的结构,而不是单独的参数。
写一个目标函数梯度的函数返回值。使用描述的条件化形式包括梯度和麻布。目标函数。函数,
,
的梯度
。
的代码与梯度出现在目标函数这个例子。
创建选项使用目标函数的梯度。同时,设置算法“信赖域”
。
选择= optimoptions (“fminunc”,“算法”,“信赖域”,“SpecifyObjectiveGradient”,真正的);
创建一个问题结构包括起始点x0 = [1, 2]
。在这个结构所需的字段,明白了问题。
问题。选项=选项;问题。x0=[1,2];问题。目标= @rosenbrockwithgrad;问题。解算器=“fminunc”;
解决这个问题。
x = fminunc(问题)
局部最小值。优化完成因为梯度的大小小于最优值的宽容。
x =1×21.0000 - 1.0000
下面的代码创建rosenbrockwithgrad
功能,包括梯度作为第二个输出。
函数(f, g) = rosenbrockwithgrad (x)% f计算目标f = 100 * (x (2) - (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)];结束结束
获得最优目标函数值
找到一个非线性函数的最小的位置和价值函数的最小值。目标函数是
。
有趣= @ (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,选项)
一阶迭代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 stepsize: 2.9343 e-04 lssteplength: 1 firstorderopt: 7.9721 e-07算法:“拟牛顿”的信息:“局部最小值发现....”
出口标志
1
表明,该解决方案是一个局部最优。的
输出
结构显示了迭代次数,数量评估函数,和其他信息。迭代显示还显示了迭代的数量和功能评价。
使用“lbfgs”
黑森近似为大问题
当你的问题大量的变量,默认值的HessianApproximation
可能会导致fminunc
使用大量内存和运行缓慢。使用更少的内存,运行得更快,指定HessianApproximation = " lbfgs "
。
例如,如果您试图最小化multirosenbrock
函数(如下所示)与1 e5变量使用默认参数,fminunc
一个错误的问题。
N = 1 e5;x0 = 2 * 1 (N, 1);x0 (2:2: N) = 2;[x, fval] = fminunc (x0 @multirosenbrock)
错误使用眼睛请求100000 x100000 (74.5 gb)数组超过最大数组大小的偏好(63.9 gb)。这可能导致MATLAB变得反应迟钝。错误optim.internal.fminunc.AbstractDenseHessianApproximation(21行)。值=眼睛(据nvar);错误optim.internal.fminunc.BFGSHessianApproximation(第14行)= this@optim.internal.fminunc.AbstractDenseHessianApproximation(据nvar);错误fminusub(第73行)HessApprox = optim.internal.fminunc.BFGSHessianApproximation (sizes.nVar);错误fminunc(第488行)[x, FVAL,校友,黑森、EXITFLAG输出]= 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,错误(“输入向量,是空的。”);结束如果国防部(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-by-3数组,那么fminunc
通过x
来有趣的
作为一个5-by-3数组。
指定有趣的
作为一个函数处理一个文件:
x = fminunc (x0 @myfun)
在哪里myfun
MATLAB是一种®等功能
函数f = myfun f (x) =…在x %计算函数值
您还可以指定有趣的
作为一个匿名函数的函数处理:
x = fminunc (@ (x)规范(x) ^ 2, x0);
如果你能计算的梯度有趣的
和的SpecifyObjectiveGradient
选项设置为真正的
设定的,
选择= optimoptions (“fminunc”,“SpecifyObjectiveGradient”,真正的)
有趣的
梯度向量必须返回呢g (x)
在第二个输出参数。
如果你也可以计算海赛矩阵和的HessianFcn
选项设置为“目标”
通过选择= optimoptions (“fminunc”、“HessianFcn”,“客观”)
和的算法
选项设置为“信赖域”
,有趣的
必须返回黑森的值H (x)
对称矩阵,在第三输出参数。有趣的
能给一个稀疏的麻绳。看到海赛为fminunc信赖域或fmincon trust-region-reflective算法获取详细信息。
的信赖域
算法允许您提供一个黑森乘法函数。这个函数给出的结果Hessian-times-vector产品没有直接计算的麻绳。这可以节省内存。看到黑森乘法函数。
例子:有趣= @ (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 |
指定一个或多个用户定义的函数,每个迭代的优化函数调用。通过一个函数处理或处理单元阵列的功能。默认是没有( |
PlotFcn |
情节在算法执行时进步的各种措施;从预定义的情节或编写自己的选择。通过一个内置的函数名,函数处理,或单元阵列的内置函数名或函数处理。自定义绘制函数,通过函数处理。默认是没有(
自定义函数使用相同的语法作为输出函数。看到输出函数优化工具箱和输出函数和情节函数的语法。 为 |
SpecifyObjectiveGradient |
由用户定义的目标函数的梯度。看到的描述 为 |
StepTolerance |
终止上公差 为 |
TypicalX |
典型的 的 |
信赖域 算法 |
|
FunctionTolerance |
终止公差函数值,一个积极的标量。默认值是 为 |
HessianFcn |
如果设置为 如果设置为 为 |
HessianMultiplyFcn |
黑森乘法函数,指定为一个函数处理。大规模的结构性问题,这个函数计算海赛矩阵产品 W = hmfun (Hinfo, Y) 在哪里 第一个参数是一样的第三个参数返回的目标函数 [f, g, Hinfo] =乐趣(x)
请注意 使用 例如,看到的最小化茂密的结构化的麻绳,线性等式。 为 |
HessPattern | 稀疏的黑森有限差分模式。集 使用 当结构是未知的,不确定 |
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
。该算法是一个子空间信赖域方法和基于interior-reflective牛顿方法中描述[2]和[3]。每个迭代都包括近似解大型线性系统使用条件共轭梯度法(PCG)。看到fminunc信赖域算法,信赖域方法非线性最小化和预处理共轭梯度法。
选择功能
应用程序
的优化住编辑任务提供了一个可视化界面fminunc
。
引用
[1]Broyden, c . g .“Double-Rank最小化算法的收敛类的。”本月》杂志上。数学。品6卷,1970年,页76 - 90。
[2]科尔曼,t·f·李和y。“内部,信赖域方法对非线性最小化范围。”暹罗杂志上优化》第六卷,1996年,页418 - 445。
[3]科尔曼,t·f·李和y。“大规模非线性最小化的反光牛顿方法的收敛范围。”数学规划2号,卷。67年,1994年,页189 - 224。
[4]Davidon, w . c .“变量指标最小化的方法。”A.E.C.研发报告1959年,退火- 5990。
[5]弗莱彻,r .变量度量算法的新方法。电脑杂志13卷,1970年,页317 - 322。
[6]弗莱彻,>实用的优化方法。“卷1,。无约束最优化1980年,约翰·威利和儿子。
[7]弗莱彻、r、m·j·d·鲍威尔。“快速收敛的后裔最小化的方法。”电脑杂志》第六卷,1963年,页163 - 168。
[8]戈德法布,d .“家庭变量指标更新派生通过变分方法。”数学的计算24卷,1970年,页23日。
[9]Shanno, d . f .”条件的拟牛顿方法函数最小化。”数学的计算24卷,1970年,页647 - 656。
扩展功能
自动并行支持金宝app
加速代码通过自动运行并行计算使用并行计算工具箱™。
版本历史
之前介绍过的R2006a
MATLAB命令
你点击一个链接对应MATLAB命令:
运行该命令通过输入MATLAB命令窗口。Web浏览器不支持MATLAB命令。金宝app
你也可以从下面的列表中选择一个网站:
表现最好的网站怎么走吗
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。