文章目录
一、谈谈非线性
前面我们学了线性规划,整数规划,我们可以把整数规划理解为是特殊的线性规划。
在实际生活中,我们更多的认为数据是非线性的,对于线性规划这毕竟会是一些少量,为此我们引入了非线性规划。
如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。
二、非线性规划的模型
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,options) 使用 options 所指定的优化选项执行最小化。使用 optimoptions 可设置这些选项。如果没有非线性不等式或等式约束,请设置 nonlcon = []。
参数什么意思?
b 和 beq 是向量,A 和 Aeq 是矩阵,c(x) 和 ceq(x) 是返回向量的函数,f(x) 是返回标量的函数。f(x)、c(x) 和 ceq(x) 可以是非线性函数。 x、lb 和 ub 可以作为向量或矩阵传递
行了行了,看看就行,看不懂i没事,我们结合具体例子来学会他。
四、线性不等式约束
目标函数:
fun = (x)100*(x(2)-x(1)^2)^2+(1-x(1))^2
约束条件:从点 [-1,2]
为起点求最小值,约束方程 x(1)+2x(2)≤1
matlab代码:
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代码:(参数前面的文章讲过了,就不注释了,唯一强调的fun函数用到了匿名函数,本专栏有讲)
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)
运行:
六、带有非线性约束的求最值
目标函数:
min f (x) = x1^2 + x2^2 + x3^2 + 8
约束条件:
x1^2 − x2 + x3 ^2 ≥ 0 x1 + x2^2 + x3 ^3 ≤ 20 − x1 − x2^2 + 2 = 0 x2 + 2x3^2 = 3x1 x1,x2 , x3 ≥ 0
matlab解法:(具体看我注释)
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
运行:
目标函数为最小化函数,fun是一个函数,fun接受向量或数组 x,并返回实数标量 f,即在 x 处计算的目标函数值。
非线性约束条件,nonlcon是一个函数,接受向量或数组 x,并返回两个数组 c(x) 和 ceq(x)。
七、非线性约束
在边界约束下求 目标函数在圆内最小的点。目标函数:
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;
约束条件:
0 ≤ x (1) ≤ 0.5 0 0.2≤x(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)
运行:
八、作业
下一篇我们还要讲一些关于非线性规划的内容,今天就讲一半即可,请消化理解。
你需要完成的任务:理解本篇文章的内容,代码自己敲一遍,写一篇文章提交,最好你写的博客能加上你自己的理解,如果我有讲的不对的,你可以在提交任务的评论区指正或着谈谈你觉得有什么改进的都可以。