https://i.loli.net/2019/07/25/5d39b5315c60935716.jpg

Matlab中的非线性规划

Matlab中的非线性规划

非线性规划的定义

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

非线性规划的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——线性不等式约束

AM×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——线性等式约束

AeqMe×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 结构体中至少提供 objectivex0solveroptions 字段。

输出参数

x——解

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

fval——解处的目标函数值

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

grad——解处的梯度

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

示例

线性不等式约束

在具有线性不等式约束的情况下求 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 具有较低的目标函数局部最小值。

posted @ 2022-07-16 18:30  plzplz  阅读(1291)  评论(0编辑  收藏  举报
https://i.loli.net/2019/07/25/5d39c1d4c249939054.jpg