【Matlab】非线性规划问题

定义

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

m i n f ( x ) s . t . h j ( x ) ≤ 0 , j = 1 , ⋯   , q g i ( x ) = 0 , i = 1 , ⋯   , p \begin{array}{l} \hspace*{1.5cm}min{\rm{ }}f{\rm{ }}\left( x \right){\rm{ }}\\ s.t.\hspace*{1cm}{\rm{ }}{h_j}\left( x \right){\rm{ }} \le {\rm{ }}0,{\rm{ }}j{\rm{ }} = {\rm{ }}1, \cdots ,{\rm{ }}q\\ \hspace*{1.5cm}{g_i}\left( x \right){\rm{ }} = {\rm{ }}0,{\rm{ }}i{\rm{ }} = {\rm{ }}1, \cdots ,{\rm{ }}p{\rm{ }} \end{array} minf(x)s.t.hj(x)0,j=1,,qgi(x)=0,i=1,,p
其中 x = [ x 1 ⋯ x n ] T x=[x_1 \cdots x_n ]^T x=[x1xn]T称为模型(NP)的决策变量,f 称为目标函数, g i ( i = 1 , ⋯   , p ) g_i (i = 1,\cdots, p) gi(i=1,,p) h j ( j = 1 , ⋯   , q ) h _j(j = 1,\cdots, q) hj(j=1,,q)称为约束函数。另外, g i ( x ) = 0 ( i = 1 , ⋯   , p ) g_i(x) = 0 (i = 1,\cdots, p) gi(x)=0(i=1,,p) 称为等式约束,
h j ( x ) ≤ 0 ( j = 1 , ⋯   , q ) h_j(x) ≤ 0 ( j = 1,\cdots,q) hj(x)0(j=1,,q) 称为不等式的约束。
在这里插入图片描述
其中 f (x)是标量函数, A, B, Aeq, Beq是相应维数的矩阵和向量,C(x),Ceq(x) 是非线性向量函数。

matlab命令:

X=FMINCON(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON,OPTIONS)
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,options) 使用 options 所指定的优化选项执行最小化。使用 optimoptions 可设置这些选项。如果没有非线性不等式或等式约束,请设置 nonlcon = []

返回值是向量 x x x ,其中 FUN 是用 M 文件定义的函数 f (x);X0 是 x 的初始值;A,B,Aeq,Beq 定义了线性约束 A* X ≤ B, Aeq * X = Beq ,如果没有线性约束,则A=[],B=[],Aeq=[],Beq=[];LB 和 UB 是变量 x 的下界和上界,如果上界和下界没有约束,则 LB=[],UB=[],如果 x 无下界,则 LB 的各分量都为-inf,如果 x 无上界,则 UB的各分量都为 inf;NONLCON 是用 M 文件定义的非线性向量函数C(x),Ceq(x) ;OPTIONS定义了优化参数,可以使用 Matlab 缺省的参数设置。

实例

min ⁡ f ( x ) = x 1 2 + x 2 2 + x 3 2 + 8 s . t . x 1 2 − x 2 + x 3 2 ⩾ 0 x 1 + x 2 2 + x 3 3 ⩽ 20 − x 1 − x 2 2 + 2 = 0 x 2 + 2 x 3 2 = 3 x 1 , x 2 , x 3 ⩾ 0 \begin{aligned} & \min {\kern 1pt} {\kern 1pt} f\left( x \right) = x_1^2 + x_2^2 + x_3^2 + 8 \\ s.t. \hspace*{1cm}& x_1^2 - {x_2} + x_3^2 \geqslant 0 \\ &{x_1} + x_2^2 + x_3^3 \leqslant 20 \\ & {-x_1} - x_2^2 + 2 = 0 \\ &{x_2} + 2x_3^2 = 3 \\ & {x_1},{x_2},{x_3} \geqslant 0 \\ \end{aligned} s.t.minf(x)=x12+x22+x32+8x12x2+x320x1+x22+x3320x1x22+2=0x2+2x32=3x1,x2,x30

%fun1目标函数
function f=fun1(x);
f=sum(x.^2)+8
%fun2约束函数
function [g,h]=fun2(x); 
g=[-x(1)^2+x(2)-x(3)^2 x(1)+x(2)^2+x(3)^3-20]; %非线性不等式约束
h=[-x(1)-x(2)^2+2 x(2)+2*x(3)^2-3]; %非线性等式约束
%main主函数
options=optimset('largescale','off'); 
[x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[], ... 
'fun2', options) 

运行结果:
在这里插入图片描述
在这里插入图片描述
或者可以下面的方法:

clc
clear all
%% 主函数
options=optimset('largescale','off');
[x,y] = fmincon(@fun,rand(3,1),[],[],[],[],zeros(3,1),[], @nonlcon, options)
 
%% 目标函数
function f=fun(x)
f=sum(x.^2)+8;
end
 
%% 非线性约束条件
function [c,ceq]=nonlcon(x)
c=[-x(1)^2+x(2)-x(3)^2
    x(1)+x(2)^2+x(3)^3-20];  %非线性不等式约束
ceq=[-x(1)-x(2)^2+2
   x(2)+2*x(3)^2-3]; %非线性等式约束
end

结果同上.

这样就可以解出当 x1 = 0.5522, x2 =1.2033, x3 = 0.9478 时,最小值 y =10.6511。

线性不等式约束

目标函数:

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

约束条件:从点[-1,2]为起点求最小值,约束方程 x ( 1 ) + 2 x ( 2 ) ⩽ 1 x(1)+2x(2) \leqslant 1 x(1)+2x(2)1
matlab代码:

clear
clc
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;%匿名函数使用
x0 = [-1,2];%起点可以更改,似乎没影响
A = [1,2];
b = 1;
[x,y] = fmincon(fun,x0,A,b)%套用函数

运行结果:
在这里插入图片描述

线性不等式和等式约束条件

在这里插入图片描述
matlab代码:

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

x0 = [1,1];%初始点设置自行不同
A = [1,-2];
b = 1;
Aeq = [2,1];
beq = 1;
[x,y] = fmincon(fun,x0,A,b,Aeq,beq)

运行结果:
在这里插入图片描述

非线性约束

在边界约束下求目标函数在圆内最小的点:

%目标函数fun =   (x)100*(x(2)-x(1)^2)^2+(1-x(1))^2

得匿名函数:

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

约束条件:

 0x (1)0.5 0
 0.2x(2)0.8

可得:

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

同时在以[1/3, 1/3]题心、半径为1/3的圆内寻找:

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

无约束条件设为[]

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

总代码:
函数代码:

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

主代码:

clc 
clear all
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
lb = [0,0.2];
ub = [0.5,0.8];
A = [];
b = [];
Aeq = [];
beq = [];
x0 = [1/4,1/4];


nonlcon = @circle;
[x,y] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

运行结果:
在这里插入图片描述

这里留几题来试试手:

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星辰之光.

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值