MATLAB 求函数极值的内置函数一览表(实则优化算法函数汇总)

MATLAB 求函数极值的内置函数一览表

收集了几乎所有的 MATLAB 内置的优化函数,可收藏,需要时查阅。

简介

优化问题主要包括三个方面:求一个函数的最大值最小值、求函数零点(解方程)、最小二乘问题。这三个问题,本质上看,是一个问题。求极值,就相当于是找导函数的零点。解方程,如果把右端项挪到左边去,本质上也是求函数的零点。最小二乘问题,是一个最小化残值范数的求极值问题,求极值问题,本质是求零点问题。

因此,所有的优化问题,本质就是在解方程,无可厚非。我们再把求极值问题细分一下,如果是带约束的,一般叫约束优化问题,如果不带约束的,一般叫无约束优化问题。如果是线性的优化问题,我们也叫线性规划。如果是非线性的优化问题,我们也叫非线性规划。如此,就把带或者不带约束的求函数极值细化成了最优化与运筹的问题。

我给的标题是,MATLAB 求函数极值的内置函数一览表,这个标题写得不是特别确切。第一,因为下面的内容还包括求零点和最小二乘。第二,求极值在印象里似乎就是求一个函数的最“低”点最“高”点,很少会和约束条件扯上关系,所以不谈规划问题或者说优化问题,似乎有失偏颇。但是,和很多工科的同学聊天,他们似乎并不在意你这个东西叫什么,他给你的问题就是找自变量最小化一个函数,管你是非线性规划,还是无约束优化,能把他的问题解决就好了,并不太在意你的工具叫什么。潜意识里,他们认为 “能抓住老鼠的才是好猫”,你给他们扯优化,扯规划,他们反而并不能很好地理解。所以,我给出这个 “函数极值” 的说法,就很亲民了,更加容易让被人搜索到,从而进来查阅和学习。

相关的数学原理和别的延伸的一些东西在这篇博文中不解释,如有兴趣,请参考我其他的文章,链接如下。

数据科学和机器学习中的优化理论与算法(上)

数据科学和机器学习中的优化理论与算法(下)

共轭梯度(CG)算法

共轭梯度方法(CG)MATLAB编程及其和Gauss_Seidel方法的一个比较

Jacobi迭代、Gauss_Seidel迭代和最佳因子SOR迭代的比较

交替方向乘子法(ADMM)的数学基础

方程组求解的直接法与迭代法实现

分布式优化和去中心化优化概述

图像与视频处理中的优化方法

约束优化问题的罚函数求解方法

粒子群优化算法与遗传脚本

求解非约束优化问题的拟牛顿方法(BFGS、DFP)

从矩阵乘法来看-O优化和ijk执行顺序对程序性能的影响

使用MATLAB 进行非线性拟合

遗传算法程序示例

BP神经网络代码示例

方程组求解的切比雪夫半迭代加速方法

使用BP神经网络做预测

数学建模模拟退火法MATLAB程序参考模板

机器学习算法概括

最优控制与深度学习

函数型数据主成分分析(FPCA)

信赖域狗腿(dogleg)方法

函数型数据主成分分析

浅谈大数据和深度学习和计算数学的一点关系

用深度学习求解高维偏微分方程

A*算法:Dijkstra改进算法

深度学习中的一些基本概念

PCA算法的数学推导及其简单算例

keras入门实例:非线性拟合求拟合系数

自然语言处理之情感分析实战(分类问题)

求极小值的线搜索方法应用(SD,Newton)

Matlab使用的一点小体会(不定时扩充修缮,琐碎东西存档)

解方程组的列主元高斯消元法和Cholesky分解

matlab偏最小二乘法及其检验

Cache 结构对程序性能的影响

机器学习入门实战——使用回归技术预测房价

matlab做三维线性拟合(多元线性回归,准确来说不叫插值)

基于主元素思想的Householder正交法解(矛盾)方程组

R语言做回归分析

DEA(数据包络分析)程序模板

从几个lingo的示例来看lingo在运筹学当中的使用

matlab入门练习之杂例二

一个DEA程序模板

matlab中fmincon函数的使用

概览

我把我能想到的 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)AxAeqxlb0=0b=beqxub,

用法示例:

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 AxAeqxlbb,=beq,xub.

用法示例:

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 Axb,Aeqxlb=beq,xub.

用法示例:

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 指定为稀疏矩阵。如果您的非凸问题只有边界或只有线性等式约束,请使用 ‘trust-region-reflective’。如果您有具有大量线性约束而没有大量变量的半正定问题,请尝试 ‘active-set’。

fminimax:minmax 问题

求解 minimax 约束问题。

用法示例:

t = linspace(-pi,pi);
plot(t,sin(t),'r-')
hold on
plot(t,cos(t),'b-');
plot(t,max(sin(t),cos(t)),'ko')
legend('sin(t)','cos(t)','max(sin(t),cos(t))','Location','NorthWest')

fun = @(x)[sin(x);cos(x)];
x0 = 1;
x1 = fminimax(fun,x0)

x0 = -2;
x2 = fminimax(fun,x0)

fgoalattain:目标达到

求解涉及多目标的目标达到问题。fgoalattain 求解目标达到问题,这是多目标优化问题最小化的一种表示。fgoalattain 求以下问题的最小值:

minimize ⁡ x , γ γ  such that  { F ( x ) −  weight  ⋅ γ ≤  goal  c ( x ) ≤ 0 c e q ( x ) = 0 A ⋅ x ≤ b  Aeq  ⋅ x =  beq  l b ≤ x ≤ u b . \underset{x, \gamma}{\operatorname{minimize}} \gamma \text { such that }\left\{\begin{aligned} F(x)-\text { weight } \cdot \gamma & \leq \text { goal } \\ c(x) & \leq 0 \\ c e q(x) &=0 \\ A \cdot x & \leq b \\ \text { Aeq } \cdot x &=\text { beq } \\ l b & \leq x \leq u b . \end{aligned}\right. x,γminimizeγ such that F(x) weight γc(x)ceq(x)Ax Aeq xlb goal 0=0b= beq xub.

用法示例:

fun = @(x)[2+(x-3)^2;5+x^2/4];
goal = [3,6];
weight = [1,1];
x0 = 1;
x = fgoalattain(fun,x0,goal,weight)

fun(x)

fseminf:半无限约束、非线性、多变量

求解半无限约束多变量非线性函数的最小值。求以下问题的最小值:
min ⁡ x f ( x )  such that  { A ⋅ x ≤ b , A e q ⋅ x = b e q , l b ≤ x ≤ u b , c ( x ) ≤ 0 , c e q ( x ) = 0 , K i ( x , w i ) ≤ 0 , 1 ≤ i ≤ n . \min _{x} f(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, \\ c(x) & \leq 0, \\ c e q(x) &=0, \\ K_{i}\left(x, w_{i}\right) & \leq 0,1 \leq i \leq n . \end{aligned}\right. xminf(x) such that AxAeqxlbc(x)ceq(x)Ki(x,wi)b,=beq,xub,0,=0,0,1in.

用法示例:

objfun = @(x)(x-1)^2;
x0 = 0.2;
ntheta = 1;
x = fseminf(objfun,x0,ntheta,@seminfcon)

function [c, ceq, K1, s] = seminfcon(x,s)

% No finite nonlinear inequality and equality constraints
c = [];
ceq = [];

% Sample set
if isnan(s)
    % Initial sampling interval
    s = [0.01 0];
end
t = 0:s(1):1;

% Evaluate the semi-infinite constraint
K1 = (x - 0.5) - (t - 0.5).^2;
end

patternsearch:模式搜索

使用模式搜索寻找最小值。

用法示例:

fun = @psobj;
x0 = [0,0];
x = patternsearch(fun,x0)
function y = psobj(x)
y = exp(-x(1)^2-x(2)^2)*(1+5*x(1) + 6*x(2) + 12*x(1)*cos(x(2)));

ga:遗传算法

使用遗传算法找函数的最小值。

用法示例:

xi = linspace(-6,2,300);
yi = linspace(-4,4,300);
[X,Y] = meshgrid(xi,yi);
Z = ps_example([X(:),Y(:)]);
Z = reshape(Z,size(X));
surf(X,Y,Z,'MeshStyle','none')
colormap 'jet'
view(-26,43)
xlabel('x(1)')
ylabel('x(2)')
title('ps\_example(x)')

rng default % For reproducibility
x = ga(@ps_example,2)

gamultiobj:遗传算法、帕累托前沿

使用遗传算法找到多个适应度函数的帕累托前沿。

用法示例:

fitnessfcn = @(x)[norm(x)^2,0.5*norm(x(:)-[2;-1])^2+2];
rng default % For reproducibility
x = gamultiobj(fitnessfcn,2);
plot(x(:,1),x(:,2),'ko')
xlabel('x(1)')
ylabel('x(2)')
title('Pareto Points in Parameter Space')

simulannealbnd:模拟退火

使用模拟退火法找到函数的最小值。

用法示例:

dejong5fcn

fun = @dejong5fcn;
x0 = [0 0];
x = simulannealbnd(fun,x0)

求零点

fsolve:非线性、方程组

非线性方程组求解器。

用法示例:

fun = @root2d;
x0 = [0,0];
x = fsolve(fun,x0)

function F = root2d(x)
F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;

算法选择

fsolve 有三种算法:

  • ‘trust-region-dogleg’(默认值)
  • ‘trust-region’
  • ‘levenberg-marquardt’

‘trust-region-dogleg’ 是唯一专门设计为用于求解非线性方程的算法。其他算法尝试最小化函数的平方和。‘trust-region’ 算法对稀疏问题有效。对于大规模问题,它可以使用特殊方法,如 Jacobian 矩阵乘法函数。

fzero:非线性函数求根

非线性函数的根。

用法示例:

fun = @sin; % function
x0 = 3; % initial point
x = fzero(fun,x0)

最小二乘

lsqlin:约束、线性最小二乘问题

求解约束线性最小二乘问题。具有边界或线性约東的线性最小二乘求解器。求解以下形式的最小二乘曲线拟合问题

min ⁡ x 1 2 ∥ C ⋅ x − d ∥ 2 2  such that  { A ⋅ x ≤ b , A e q ⋅ x = b e q , l b ≤ x ≤ u b . \min _{x} \frac{1}{2}\|C \cdot x-d\|_{2}^{2} \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. xmin21Cxd22 such that AxAeqxlbb,=beq,xub.

用法示例:

C = [0.9501    0.7620    0.6153    0.4057
    0.2311    0.4564    0.7919    0.9354
    0.6068    0.0185    0.9218    0.9169
    0.4859    0.8214    0.7382    0.4102
    0.8912    0.4447    0.1762    0.8936];
d = [0.0578
    0.3528
    0.8131
    0.0098
    0.1388];
A = [0.2027    0.2721    0.7467    0.4659
    0.1987    0.1988    0.4450    0.4186
    0.6037    0.0152    0.9318    0.8462];
b = [0.5251
    0.2026
    0.6721];


x = lsqlin(C,d,A,b)

算法选择

lsqlin 有三种算法:

  • ‘interior-point’,默认值
  • ‘trust-region-reflective’
  • ‘active-set’

首先尝试 ‘interior-point’。当您的输入矩阵 C 包含大量非零项时,为了获得更好的性能,请将 C 指定为普通的双精度矩阵。同样,为了在 C 的非零项相对较少时获得更好的性能,请将 C 指定为稀疏矩阵。如果您没有约束或只有边界约束,并且需要更高的准确度、更快的速度或要使用 Jacobian Multiply Function with Linear Least Squares,请尝试 ‘trust-region-reflective’。如果您有大量的线性约束而没有大量的变量,请尝试 ‘active-set’。

lsqnonlin:非线性最小二乘问题

求解非线性最小二乘(非线性数据拟合)问题。求解具有以下形式的非线性最小二乘曲线拟合问题

min ⁡ x ∥ f ( x ) ∥ 2 2 = min ⁡ x ( f 1 ( x ) 2 + f 2 ( x ) 2 + … + f n ( x ) 2 ) \min _{x}\|f(x)\|_{2}^{2}=\min _{x}\left(f_{1}(x)^{2}+f_{2}(x)^{2}+\ldots+f_{n}(x)^{2}\right) xminf(x)22=xmin(f1(x)2+f2(x)2++fn(x)2)

用法示例:

rng default % for reproducibility
d = linspace(0,3);
y = exp(-1.3*d) + 0.05*randn(size(d));

fun = @(r)exp(-d*r)-y;

x0 = 4;
x = lsqnonlin(fun,x0)

lsqnonlin有两种算法:

  • ‘trust-region-reflective’(默认值)
  • ‘levenberg-marquardt’

通常,先尝试 ‘trust-region-reflective’。如果您的问题有边界,您必须使用 ‘trust-region-reflective’。如果您的问题没有边界并且欠定(方程数少于维数),请使用 ‘levenberg-marquardt’。

lsqcurvefit:非线性拟合

用最小二乘求解非线性曲线拟合(数据拟合)问题。

用法示例:

xdata = ...
 [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = ...
 [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];

fun = @(x,xdata)x(1)*exp(x(2)*xdata);

x0 = [100,-1];
x = lsqcurvefit(fun,x0,xdata,ydata)

算法选择

lsqcurvefit 有两种算法:

  • ‘trust-region-reflective’(默认值)
  • ‘levenberg-marquardt’

通常,先尝试 ‘trust-region-reflective’。如果您的问题有边界,您必须使用 ‘trust-region-reflective’。如果您的问题没有边界并且欠定(方程数少于维数),请使用 ‘levenberg-marquardt’。

lsqnonneg:最小二乘问题,非负

求解非负线性最小二乘问题。求解文下形式的非负最小二乘曲线拟合问题

KaTeX parse error: Can't use function '$' in math mode at position 33: …t x-d\|_{2}^{2}$̲, where $x \geq…

用法示例:

C = [0.0372    0.2869
     0.6861    0.7071
     0.6233    0.6245
     0.6344    0.6170];
 
d = [0.8587
     0.1781
     0.0747
     0.8405];

x = lsqnonneg(C,d)

xunc = C\d
constrained_norm = norm(C*x - d)
unconstrained_norm = norm(C*xunc - d)

最后的讨论

撤了这么多不相干的,好,现在回归正题,MATLAB 如何求极值?这么多函数选择哪一个呢?

单变量问题直接用 fminbnd。线性规划用 linprog。二次规划用 quadprog。其他约束规划用 fmincon。特殊的问题,用 fminimax、fgoalattain、fseminf、patternsearch、ga、gamultiobj、simulannealbnd。fminunc::无约束、多变量。fminsearch:无约束、多变量、无导数。

我自以为是地画图,如下所示。图画得很辛苦,支持的老铁给个点赞收藏关注三连。

线性规划
二次规划
其他
是否特定问题
其他
minmax
半无限约束
目标达到
遗传,模拟退火,模式搜索
是否单变量
是否有约束
规划问题
linprog
quadprog
fmincon
是否有导数
fminunc
fminsearch
fminbnd
matlab最优化程序包括:无约束一维极值问题、进退法、黄金分割法、斐波那契法、牛顿法基本牛顿法、全局牛顿法、割线法、抛物线法、三次插值法、可接受搜索法、Goidstein法、Wolfe Powell法、单纯形搜索法、Powell法、最速下降法、共轭梯度法、牛顿法、修正牛顿法、拟牛顿法、信赖域法、显式最速下降法、Rosen梯度投影法、罚函数法、外点罚函数法、內点罚函数法、混合罚函数法、乘子法、G-N法、修正G-N法、L-M法、线性规划、单纯形法、修正单纯形法、大M法、变量有界单纯形法、整数规划、割平面法、分支定界法、0-1规划、二次规划、拉格朗曰法、起作用集算法、路径跟踪法、粒子群优化算法、基本粒子群算法、带压缩因子的粒子群算法、权重改进的粒子群算法、线性递减权重法、自适应权重法、随机权重法、变学习因子的粒子群算法、同步变化的学习因子、异步变化的学习因子、二阶粒子群算法、二阶振荡粒子群算法 (matlab optimization process includes Non-binding one-dimensional extremum problems Advance and retreat method Golden Section Fibonacci method of basic Newton s method Newton s method Newton s Law of the global secant method parabola method acceptable to the three interpolation search method Goidstein France Wolfe.Powell France Simplex search method Powell steepest descent method Conjugate gradient method Newton s method Newton s method to amend Quasi-Newton Method trust region method explicitly steepest descent method, Rosen gradient projection method Penalty function method outside the penalty function method within the penalty function method Mixed penalty function multiplier method G-N was amended in G-N method L-M method Of linear programming simplex method, revised simplex method Big M method variables bounded simplex method, Cutting Plane Method integer programming branch and bound method 0-1 programming quadratic programming )
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆嵩

有打赏才有动力,你懂的。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值