Matlab中的非线性规划


Matlab中的非线性规划

目录
  • Matlab中的非线性规划
    • 非线性规划的定义
    • 非线性规划的Matlab标准形式
      • 语法及说明
      • 输入参数
        • fun——要计算最小值的函数
        • x0——初始点
        • A——线性不等式约束;b——线性不等式约束
        • Aeq——线性等式约束;beq——线性等式约束
        • lb——下界;ub——上界
        • nonlcon——非线性约束
        • problem——问题结构体
      • 输出参数
        • x——解
        • fval——解处的目标函数值
        • grad——解处的梯度
    • 示例
      • 线性不等式约束
      • 线性不等式和等式约束
      • 具有边界约束的最小化
      • 非线性约束
      • 获取目标函数值

非线性规划的定义

如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。

非线性规划的Matlab标准形式

fmincon:寻找非线性多变量函数的最小值。

语法及说明

x = fmincon(fun,x0,A,b)
% 从 x0 开始,尝试在满足线性不等式 A*x ≤ b 的情况下寻找 fun 中所述的函数的最小值点 x。x0 可以是标量、向量或矩阵。
x = fmincon(fun,x0,A,b,Aeq,beq)
%在满足线性等式 Aeq*x = beq 以及不等式 A*x ≤ b 的情况下最小化 fun。如果不存在不等式,则设置 A = [] 和 b = []。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
% 对 x 中的设计变量定义一组下界和上界,使解始终在 lb ≤ x ≤ ub 范围内。如果不存在等式,请设置 Aeq = [] 和 beq = []。如果 x(i) 无下界,请设置 lb(i) = -Inf,如果 x(i) 无上界,请设置 ub(i) = Inf。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
%执行最小化时,满足 nonlcon 所定义的非线性不等式 c(x) 或等式 ceq(x)。fmincon 进行优化,以满足 c(x) ≤ 0 和 ceq(x) = 0。如果不存在边界,请设置 lb = [] 和/或 ub = []。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
%使用 options 所指定的优化选项执行最小化。使用 optimoptions 可设置这些选项。如果没有非线性不等式或等式约束,请设置 nonlcon = []。
x = fmincon(problem)
%求 problem 的最小值,它是 problem 中所述的一个结构体。
[x,fval] = fmincon(___)
%对上述任何语法,返回目标函数 fun 在解 x 处的值。
[x,fval,exitflag,output] = fmincon(___)
%还返回描述 fmincon 的退出条件的值 exitflag,以及提供优化过程信息的结构体 output。
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(___)
% 还返回:lambda - 结构体,其字段包含解 x 处的拉格朗日乘数。grad - fun 在解 x 处的梯度。essian - fun 在解 x 处的 Hessian 矩阵。请参阅 

非线性规划求解器。

求以下问题的最小值:

\[\min _{x} f(x) ~~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. \]

b 和 beq 是向量,A 和 Aeq 是矩阵,c(x) 和 ceq(x) 是返回向量的函数,f(x) 是返回标量的函数。f(x)、c(x) 和 ceq(x) 可以是非线性函数。

x、lb 和 ub 可以作为向量或矩阵传递。

输入参数

fun——要计算最小值的函数

要最小化的函数,指定为函数句柄或函数名称。fun 接受向量或数组 x,并返回实数标量 f,即在 x 处计算的目标函数值。

将 fun 指定为文件的函数句柄:

x = fmincon(@myfun,x0,A,b)

其中 myfun 是一个 MATLAB 函数,例如

function f = myfun(x)
f = ...            % Compute function value at x

您还可以为匿名函数指定 fun 作为函数句柄:

x = fmincon(@(x)norm(x)^2,x0,A,b);

例如:

fun = @(x)sin(x(1))*cos(x(2))

x0——初始点

初始点,指定为实数向量或实数数组。求解器使用 x0 的大小以及其中的元素数量确定 fun 接受的变量数量和大小。

例如:

x0 = [1,2,3,4]

A——线性不等式约束;b——线性不等式约束

? A 是 M×N 矩阵,其中 M 是不等式的数目,而 N 是变量的数目(x0 中的元素数)。对于大型问题,将 A 作为稀疏矩阵传递。

A 以如下形式编写 M 个线性不等式

A*x <= b,

其中,x 是由 N 个变量组成的列向量 x(:),b 是具有 M 个元素的列向量。

? b 是与 A 矩阵相关的包含 M 个元素的向量。如果将 b 作为行向量传递,求解器会在内部将 b 转换为列向量 b(:)。对于大型问题,将 b 作为稀疏向量传递。

b 以如下形式编写 M 个线性不等式

A*x <= b,

其中,x 是由 N 个变量组成的列向量 x(:),A 是大小为 M×N 的矩阵。

例如:

\[x_1 +2x_2 ≤10\\ 3x_1 +4x_2 ≤20\\ 5x_1 +6x_2 ≤30, \]

输入以下约束:

A = [1,2;3,4;5,6];
b = [10;20;30];

Aeq——线性等式约束;beq——线性等式约束

? Aeq 是 Me×N 矩阵,其中 Me 是等式的数目,而 N 是变量的数目(x0 中的元素数)。对于大型问题,将 Aeq 作为稀疏矩阵传递。

Aeq 以如下形式编写 Me 个线性等式

Aeq*x = beq,

其中,x 是由 N 个变量组成的列向量 x(:),beq 是具有 Me 个元素的列向量。

? beq 是与 Aeq 矩阵相关的包含 Me 个元素的向量。如果将 beq 作为行向量传递,求解器会在内部将 beq 转换为列向量 beq(:)。对于大型问题,将 beq 作为稀疏向量传递。

beq 以如下形式编写 Me 个线性等式

Aeq*x = beq,

其中,x 是由 N 个变量组成的列向量 x(:),Aeq 是大小为 Me×N 的矩阵。

例如:

\[x_1 + 2x_2 + 3x_3 = 10\\ 2x_1 + 4x_2 + x_3 = 20。 \]

输入以下约束:

Aeq = [1,2,3;2,4,1];
beq = [10;20];

lb——下界;ub——上界

? 如果 x0 中的元素数等于 lb 中的元素数,则 lb 指定

x(i) >= lb(i)(对于全部 i)。

如果 numel(lb) < numel(x0),则 lb 指定

x(i) >= lb(i) (1 <= i <= numel(lb))。

如果 lb 中的元素数少于 x0 中的元素数,求解器会发出警告。

? 如果 x0 中的元素数等于 ub 中的元素数,则 ub 指定

x(i) <= ub(i)(对于全部 i)。

如果 numel(ub) < numel(x0),则 ub 指定

x(i) <= ub(i) (1 <= i <= numel(ub))。

如果 ub 中的元素数少于 x0 中的元素数,求解器会发出警告。

例如:

要指定所有 x 分量为正,请使用 lb = zeros(size(x0))。

要指定 x 的所有分量小于 1,请使用 ub = ones(size(x0))。

nonlcon——非线性约束

nonlcon 是一个函数,接受向量或数组 x,并返回两个数组 c(x) 和 ceq(x)。

  • c(x) 是由 x 处的非线性不等式约束组成的数组。fmincon 尝试满足

    对于 c 的所有项,有 c(x) <= 0。

  • ceq(x) 是 x 处的非线性等式约束的数组。fmincon 尝试满足

    对于 ceq 的所有项,有 ceq(x) = 0。

例如,

x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon)

其中 mycon 是一个 MATLAB 函数,例如

function [c,ceq] = mycon(x)
c = ...     % Compute nonlinear inequalities at x.
ceq = ...   % Compute nonlinear equalities at x.

problem——问题结构体

问题结构体,指定为含有以下字段的结构体:

字段名称 条目
objective 目标函数
x0 x 的初始点
Aineq 线性不等式约束的矩阵
bineq 线性不等式约束的向量
Aeq 线性等式约束的矩阵
beq 线性等式约束的向量
lb 由下界组成的向量
ub 由上界组成的向量
nonlcon 非线性约束函数
solver 'fmincon'
options 用 optimoptions 创建的选项

您必须在 problem 结构体中至少提供 objective、x0、solver 和 options 字段。

输出参数

x——解

解,以实数向量或实数数组形式返回。x 的大小与 x0 的大小相同。通常情况下,当 exitflag 为正时,x 是该问题的局部解

fval——解处的目标函数值

解处的目标函数值,以实数形式返回。通常,fval = fun(x)。

grad——解处的梯度

解处的梯度,以实数向量形式返回。grad 给出 fun 在 x(:) 点处的梯度。

示例

线性不等式约束

在具有线性不等式约束的情况下求 Rosenbrock 函数的最小值。

将目标函数 fun 设置为 Rosenbrock 函数。众所周知,Rosenbrock 函数很难实现最小化。它在点 (1,1) 处的最小目标值为 0。

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

从点 [-1,2] 开始求最小值,约束为 x1+2x2≤1。以 A = [1,2] 和 b = 1 为条件,以 Ax <= b 形式表达此约束。请注意,此约束意味着解不会在无约束解 (1,1) 处,因为在此点处 x1+2x2=3>1。

x0 = [-1,2];
A = [1,2];
b = 1;
x = fmincon(fun,x0,A,b)

运行脚本得到

x =

    0.5022    0.2489

线性不等式和等式约束

在既有线性不等式约束又有线性等式约束的情况下求 Rosenbrock 函数的最小值。

将目标函数 fun 设置为 Rosenbrock 函数。

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

从点 [0.5,0] 开始求最小值,约束为 x1+2x2≤1 和 2x1+x2=1。

  • 以 A = [1,2] 和 b = 1 为条件,以 A*x <= b 形式表达线性不等式约束。
  • 以 Aeq = [2,1] 和 beq = 1 为条件,以 Aeq*x = beq 形式表达线性等式约束。
x0 = [0.5,0];
A = [1,2];
b = 1;
Aeq = [2,1];
beq = 1;
x = fmincon(fun,x0,A,b,Aeq,beq)

运行脚本得到

x =

    0.4149    0.1701

具有边界约束的最小化

在存在边界约束的情况下,求目标函数的最小值。

目标函数是具有两个变量的简单代数函数。

fun = @(x)1+x(1)/(1+x(2)) - 3*x(1)*x(2) + x(2)*(1+x(1));

关注 x 为正值且满足 x1≤ 1 和 x2 ≤ 2 的区域。

lb = [0,0];
ub = [1,2];

该问题没有线性约束,因此将这些参数设置为 []。

A = [];
b = [];
Aeq = [];
beq = [];

尝试使用一个位于区域中部的初始点

x0 = (lb + ub)/2;

求解

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)

运行脚本得到

x =

    1.0000    2.0000

如果使用另一个初始点会得到不同的解

x0 = x0/5;
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
x =

   1.0e-06 *

    0.4000    0.4000

要确定哪个解更好,请参阅获得目标函数值。

非线性约束

在非线性约束下求函数的最小值

在边界约束下求 Rosenbrock 函数在圆内最小的点。

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

在区域0\(\leqslant\)x1$\leqslant\(0.5、0.2\)\leqslant\(x~2~\)\leqslant$0.8内寻找。

lb = [0,0.2];
ub = [0.5,0.8];

同时在以 [1/3,1/3] 为圆心、半径为 1/3 的圆内寻找。将以下代码复制到您的 MATLAB路径上名为 circlecon.m 的文件中。

function [c,ceq] = circlecon(x)
c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;
ceq = [];

没有线性约束,因此将这些参数设置为 []。

A = [];
b = [];
Aeq = [];
beq = [];

选择一个满足所有约束的初始点。

nonlcon = @circlecon;
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

运行脚本得到

x =

    0.5000    0.2500

获取目标函数值

带 fval 输出调用 fmincon,以获得解处的目标函数值。

具有边界约束的最小化示例给出了两个解。哪个更好?运行以下示例,它请求 fval 输出和解。

fun = @(x)1+x(1)./(1+x(2)) - 3*x(1).*x(2) + x(2).*(1+x(1));
lb = [0,0];
ub = [1,2];
A = [];
b = [];
Aeq = [];
beq = [];
x0 = (lb + ub)/2;
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)

运行脚本得到

x = 

    1.0000    2.0000

fval = -0.6667

使用另一个起点x0运行问题。

x0 = x0/5;
[x2,fval2] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)

运行脚本得到

x =

   1.0e-06 *

    0.4000    0.4000

fval2 = 1.0000

此解的目标函数值 fval2 = 1,高于第一个值 fval = –0.6667。第一个解 x 具有较低的目标函数局部最小值。

相关