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 矩阵。请参阅
非线性规划求解器。
求以下问题的最小值:
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
的矩阵。
例如:
输入以下约束:
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
的矩阵。
例如:
输入以下约束:
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\leqslantx1$\leqslant0.5、0.2\leqslantx~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
具有较低的目标函数局部最小值。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步