MATLAB 求函数极值的内置函数一览表(实则优化算法函数汇总)
Posted 陆嵩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB 求函数极值的内置函数一览表(实则优化算法函数汇总)相关的知识,希望对你有一定的参考价值。
MATLAB 求函数极值的内置函数一览表
收集了几乎所有的 MATLAB 内置的优化函数,可收藏,需要时查阅。
简介
优化问题主要包括三个方面:求一个函数的最大值最小值、求函数零点(解方程)、最小二乘问题。这三个问题,本质上看,是一个问题。求极值,就相当于是找导函数的零点。解方程,如果把右端项挪到左边去,本质上也是求函数的零点。最小二乘问题,是一个最小化残值范数的求极值问题,求极值问题,本质是求零点问题。
因此,所有的优化问题,本质就是在解方程,无可厚非。我们再把求极值问题细分一下,如果是带约束的,一般叫约束优化问题,如果不带约束的,一般叫无约束优化问题。如果是线性的优化问题,我们也叫线性规划。如果是非线性的优化问题,我们也叫非线性规划。如此,就把带或者不带约束的求函数极值细化成了最优化与运筹的问题。
我给的标题是,MATLAB 求函数极值的内置函数一览表,这个标题写得不是特别确切。第一,因为下面的内容还包括求零点和最小二乘。第二,求极值在印象里似乎就是求一个函数的最“低”点最“高”点,很少会和约束条件扯上关系,所以不谈规划问题或者说优化问题,似乎有失偏颇。但是,和很多工科的同学聊天,他们似乎并不在意你这个东西叫什么,他给你的问题就是找自变量最小化一个函数,管你是非线性规划,还是无约束优化,能把他的问题解决就好了,并不太在意你的工具叫什么。潜意识里,他们认为 “能抓住老鼠的才是好猫”,你给他们扯优化,扯规划,他们反而并不能很好地理解。所以,我给出这个 “函数极值” 的说法,就很亲民了,更加容易让被人搜索到,从而进来查阅和学习。
相关的数学原理和别的延伸的一些东西在这篇博文中不解释,如有兴趣,请参考我其他的文章,链接如下。
共轭梯度方法(CG)MATLAB编程及其和Gauss_Seidel方法的一个比较
Jacobi迭代、Gauss_Seidel迭代和最佳因子SOR迭代的比较
Matlab使用的一点小体会(不定时扩充修缮,琐碎东西存档)
matlab做三维线性拟合(多元线性回归,准确来说不叫插值)
基于主元素思想的Householder正交法解(矛盾)方程组
概览
我把我能想到的 MATLAB 中这类优化问题相关的函数都列举如下,后面我会一一进行解释。如果有遗漏的,欢迎大家在评论区补充。以下的分类只是我的臆想,前面说了,这三类问题,可以互相转化,所以不要太在意分类的问题。
求函数极值(或最大值最小值)
-
fminbnd
-
fmincon(interior-point、trust-region-reflective、sqp、sqp-legacy、active-set)
-
fminunc(quasi-newton、trust-region)
-
fminsearch
-
fminimax
-
linprog(dual-simplex、interior-point-legacy、interior-point)
-
quadprog(interior-point-convex、trust-region-reflective、active-set)
-
fgoalattain
-
fseminf
-
patternsearch
求零点(解方程)
- fsolve(trust-region-dogleg、trust-region、levenberg-marquardt)
- fzero
- ga
- gamultiobj
- simulannealbnd
最小二乘问题
- lsqcurvefit(trust-region-reflective、levenberg-marquardt)
- lsqlin(interior-point、trust-region-reflective、active-set)
- lsqnonlin (trust-region-reflective、levenberg-marquardt)
- lsqcurvefit
- Isqnonneg
求极值
fminbnd:单变量
查找单变量函数在定区间上的最小值
用法示例:
fun = @sin;
x1 = 0;
x2 = 2*pi;
x = fminbnd(fun,x1,x2)
这个函数可以自定义。
fmincon:约束、非线性、多变量
寻找约束非线性多变量函数的最小值。非线性规求解器。求次下问题的最小值:
min
x
f
(
x
)
such that
{
c
(
x
)
≤
0
c
e
q
(
x
)
=
0
A
⋅
x
≤
b
A
e
q
⋅
x
=
b
e
q
l
b
≤
x
≤
u
b
,
\\min _{x} f(x) \\text { such that }\\left\\{\\begin{aligned} c(x) & \\leq 0 \\\\ c e q(x) &=0 \\\\ A \\cdot x & \\leq b \\\\ A e q \\cdot x &=b e q \\\\ l b & \\leq x \\leq u b, \\end{aligned}\\right.
xminf(x) such that ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧c(x)ceq(x)A⋅xAeq⋅xlb≤0=0≤b=beq≤x≤ub,
用法示例:
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
x0 = [-1,2];
A = [1,2];
b = 1;
x = fmincon(fun,x0,A,b)
算法选择
fmincon 有五个算法选项:
- ‘interior-point’(默认值)
- ‘trust-region-reflective’
- ‘sqp’
- ‘sqp-legacy’
- ‘active-set’
‘interior-point’ 处理大型稀疏问题以及小型稠密问题。该算法在所有迭代中都满足边界,并且可以从 NaN 或 Inf 结果中恢复。‘sqp’ 在所有迭代中都满足边界。该算法可以从 NaN 或 Inf 结果中恢复。‘sqp-legacy’ 类似于 ‘sqp’,但通常速度更慢且占用的内存更多。‘active-set’ 可以采用大步长,从而提高速度。该算法对一些具有非平滑约束的问题很有效。 ‘trust-region-reflective’ 要求您提供梯度,并且只允许边界或线性等式约束,但不能同时使用两者。在这些限制下,该算法可以高效处理大型稀疏问题和小型稠密问题。该算法可以使用特殊方法来节省内存使用量,例如 Hessian 矩阵乘法函数。
fminunc:无约束、多变量
求无约束多变量函数的最小值。
用法示例:
fun = @(x)3*x(1)^2 + 2*x(1)*x(2) + x(2)^2 - 4*x(1) + 5*x(2);
x0 = [1,1];
[x,fval] = fminunc(fun,x0)
算法选择
fminunc 有两种算法:
- ‘quasi-newton’(默认值)
- ‘trust-region’
如果您的目标函数包括梯度,请使用 ‘Algorithm’ = ‘trust-region’,并将 SpecifyObjectiveGradient 选项设置为 true。否则,请使用 ‘Algorithm’ = ‘quasi-newton’。
fminsearch:无约束、多变量、无导数
使用无导数法计算无约束多变量函数的最小值。
用法示例:
fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
x0 = [-1.2,1];
x = fminsearch(fun,x0)
linprog:线性规划
求解线性规划问题。求以下问题的最小值:
min
x
f
T
x
such that
{
A
⋅
x
≤
b
,
A
e
q
⋅
x
=
b
e
q
,
l
b
≤
x
≤
u
b
.
\\min _{x} f^{T} x \\text { such that }\\left\\{\\begin{aligned} A \\cdot x & \\leq b, \\\\ A e q \\cdot x &=b e q, \\\\ l b & \\leq x \\leq u b . \\end{aligned}\\right.
xminfTx such that ⎩⎪⎨⎪⎧A⋅xAeq⋅xlb≤b,=beq,≤x≤ub.
用法示例:
A = [1 1
1 1/4
1 -1
-1/4 -1
-1 -1
-1 1];
b = [2 1 2 1 -1 2];
f = [-1 -1/3];
x = linprog(f,A,b)
线性规划指的是约束是线性的,目标函数也是线性的。
算法选择
linprog 有三种算法:
- ‘dual-simplex’,默认值
- ‘interior-point-legacy’
- ‘interior-point’
首先使用 ‘dual-simplex’ 算法或 ‘interior-point’ 算法。通常,‘dual-simplex’ 和 ‘interior-point’ 算法速度快且占用的内存最少。‘interior-point-legacy’ 算法类似于 ‘interior-point’,但 ‘interior-point-legacy’ 可能速度较慢、稳健性较差或占用内存较多。
quadprog:二次规划
二次规划。quadprog 求由下式指定的问题的最小值
min x 1 2 x T H x + f T x such that { A ⋅ x ≤ b , A e q ⋅ x = b e q , l b ≤ x ≤ u b . \\min _{x} \\frac{1}{2} x^{T} H x+f^{T} x \\text { such that }\\left\\{\\begin{aligned} A \\cdot x \\leq b, \\\\ A e q \\cdot x &=b e q, \\\\ l b & \\leq x \\leq u b . \\end{aligned}\\right. xmin21xTHx+fTx such that ⎩⎪⎨⎪⎧A⋅x≤b,Aeq⋅xlb=beq,≤x≤ub.
用法示例:
H = [1 -1; -1 2];
f = [-2; -6];
A = [1 1; -1 2; 2 1];
b = [2; 2; 3];
[x,fval,exitflag,output,lambda] = ...
quadprog(H,f,A,b);
算法选择
quadprog 有三种算法:
- ‘interior-point-convex’(默认值)
- ‘trust-region-reflective’
- ‘active-set’
如果您遇到凸问题,或不知道您的问题是否为凸问题,请使用 ‘interior-point-convex’。当您的 Hessian 矩阵 H 包含大量非零项时,为了获得更好的性能,请将 H 指定为普通的双精度矩阵。同样,为了在 H 的非零项相对较少时获得更好的性能,请将 H 指定为稀疏矩阵。如果您的非凸问题只有边界或只有线性等式约束,请使用
以上是关于MATLAB 求函数极值的内置函数一览表(实则优化算法函数汇总)的主要内容,如果未能解决你的问题,请参考以下文章
请教matlab,已知优化目标函数表达式和约束条件,如何求一个使目标极值的参数对应的一般表达式!
PSO粒子群算法(鸟群算法)计算二元函数极值(C语言实现matlab工具箱实现)
优化求解基于matlab遗传算法求解函数极值问题含Matlab源码 1198期