1.非线性规划函数
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 可以作为向量或矩阵传递
2.线性不等式约束
目标函数为:
约束条件为从点[-1,2]为起点求最小值,约束方程为
最后的Matlab代码为:
m=@(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2;%匿名函数
x0=[-1,2];
a=[1,2];
b=1;
[x,y]=fmincon(m,x0,a,b)
运行结果为:
3.线性不等式与等式约束
Matlab代码为:
clc
clear all
m=@(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(m,x0,a,b,Aeq,Beq)
运行结果为:
4.带有非线性约束的求最值
目标函数与约束条件为:
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)。
5.非线性约束
在边界约束下求目标函数在圆内最小的点。目标函数与约束条件为:
同时在以[1/3,1/3]为圆心、半径为1/3的圆内对结果进行寻找,从而得出Matlab代码为:
clc
clear all
%%主函数
m=@(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(m,x0,A,b,Aeq,beq,lb,ub,nonlcon)
%%非线性约束条件
function [c,ceq]=circle(x)
c=(x(1)-1/3)^2+(x(2)-1/3)^2-(1/3)^2;
ceq=[];
end
运行结果为: