非线性规划还没有适用于各种问题的一般算法,各个方法都有自己特定的适用范围。
对一个实际问题把它归结为非线性规划问题时,一般要注意以下几点:
- 确认供选方案:收集与问题有关的资料,全面熟悉问题后,确认供选方案,并用一组变量表示它们
- 提出追求目标:极小化或者极大化目标,用数学关系式表示
- 给出价值标准:要确立所考虑的目标“好”或“坏”的价值标准
- 寻求限制条件:用等式或者不等式表示
非线性规划的MATLAB解法:
MATLAB中的命令是:
X = FMINCON(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON,OPTIONS)
A,B,Aeq,Beq定义了线性约束,
NONLCON是用M文件定义的非线性向量函数C(X),Ceq(X)。
求解非线性规划的基本迭代格式
对于非线性规划模型(NP),可以采用迭代方法求解它的最优解。
设是某迭代方法的第k轮迭代点,是第k+1轮迭代点,记:
(求解非线性规划模型的基本迭代格式)
这里,,,并且的方向是从点向着点的方向。
无约束极值问题的解法:
无约束极值问题可表述为:,求解该问题的迭代法分为两点:
1、解析法:用到函数的一阶导数或者二阶导数
1.1、梯度法(最速下降法)
每轮从点出发沿最速下降的方向作一维搜索,来建立求解无约束极值问题的方法。
具体步骤:
1)、选取初始数据。选取初始点x0,给定终止误差,令k=0
2)、求梯度方向,若,停止迭代,输出,否则进入第三部
3)、构造负梯度方向。
4)、进行一维搜索。求,使得
令,k=k+1,到第二步
function [ f,df ] = detaf(x)
%UNTITLED3 此处显示有关此函数的摘要
% 此处显示详细说明
f = x(1)^2+25*x(2)^2;
df = [2*x(1)
50*x(2)];
end
clear all;clc;
x=[2;2];
[f0,g] = detaf(x);
while norm(g)>0.000001
p = -g/norm(g);
t=1.0;f = detaf(x+t*p);
while f>f0
t=t/2;
f=detaf(x+t*p);
end
x=x+t*p;
[f0,g] = detaf(x);
end
1.2、Newton法
,并去步长。
通常,把方向叫做从点出发的Newton方向
具体步骤:
1)、选取初始数据。选取初始点x0,给定终止误差,令k=0
2)、求梯度方向,若,停止迭代,输出,否则进入第三部
3)、构造Newton方向,取,计算
4)、进行一维搜索。求,使得
令,k=k+1,到第二步
function [ f,df ,d2f] = nwfun(x)
%UNTITLED3 此处显示有关此函数的摘要
% 此处显示详细说明
f = x(1)^4+25*x(2)^4+x(1)^2*x(2)^2;
df = [ 4*x(1)^3 + 2*x(1)*x(2)^2;2*x(1)^2*x(2) + 100*x(2)^3];
d2f = [12*x(1)^2+2*x(2)^2,4*x(1)*x(2)
4*x(1)*x(2),300*x(2)^2+2*x(1)^2];
end
clear all;clc;
x = [2;2];
[f0,g1,g2] = nwfun(x);
while norm(g1)>0.00001
p = -inv (g2)*g1;
x = x+p;
[f0,g1,g2] = nwfun(x);
end
%-----------------------------优化
%为了提高精度,可以采用变步长计算
clear all;clc;
x = [2;2];
[f0,g1,g2] = nwfun(x);
while norm(g1)>0.00001
p = -inv(g2)*g1;
p = p/norm(p);
t=1.0;
f = nwfun(x+t*p);
while f>f0
t=t/2;f = nwfun(x+t*p);
end
x = x+t*p;
[f0,g1,g2] = nwfun(x);
end
2、直接法:仅用到函数值
MATLAB求无约束极值问题
[X,FVAL]=FMINUNC(FUN,X0,OPTIONS,P1,P2......)
返回的X是所求的极小值点,FVAL是函数的极小值。
FUN是一个M文件。
当FUN只有一个返回值时,它的返回值是函数f(x);
当FUN只有两个返回值时,它的第二个返回值是函数f(x)的梯度向量;
当FUN只有三个返回值时,它的第三个返回值是f(x)的二阶导数阵;
X0是向量x的初始值,OPTIONS是优化参数,可以使用缺省参数,P1,P2是传递给FUN的一些参数。
function [f,df,d2f] = fun3( x )
%UNTITLED8 此处显示有关此函数的摘要
% 此处显示详细说明
f = 100*(x(2)-x(1)^2)^2+(1-x(1))^2;
df = [-400*x(1)*(x(2)-x(1)^2)-2*(1-x(1));200*(x(2)-x(1)^2)];
d2f = [-400*x(2)+1200*x(1)^2+2,-400*x(1)
-400*x(1),200];
end
[x,y] = fminunc('fun3',rand(1,2))
求多元函数的极值也可以使用MATLAB的fminsearch
[X,FVAL,EXITFLAG,OUTPUT]=FMINSEARCH(FUN,X0,OPTIONS,P1,P2...)
function f = fun(x)
%UNTITLED11 此处显示有关此函数的摘要
% 此处显示详细说明
f = sin(x)+3
end
clear all;
clc;
x0 = 2;
[x,y] = fminsearch(@fun,x0);
约束极值问题
带有约束条件的极值问题称为约束极值问题,也叫做规划问题。可以将约束问题化为无约束问题;将非线性规划问题,化为线性规划问题;将复杂问题变为较简单问题的其他方法。
1.1 二次规划:目标函数为自变量x的二次函数,约束条件全是线性的。
MATLAB中求解二次规划的命令:
H是实对称矩阵,f,b是列向量,A是相应维数的矩阵。
[X,FVAL]=QUADPROG(H,f,A,b,Aeq,Beq,LB,UB,X0,OPTIONS)
h=[4,-4;-4,8];
f=[-6;-3];
a=[1,1;4,1];
b=[3;9];
[x,value]=quadprog(h,f,a,b,[],[],zeros(2,1))
x =
1.9500
1.0500
value =
-11.0250
1.2 罚函数法(序列无约束最小化技术/SUMT):将非线性规划问题的求解,转化为求解一系列无约束极值问题
主要有两种形式:外罚函数法,内罚函数法。下面介绍外罚函数法:
考虑问题:
取一个充分大的数M>0,构造函数
或者
这里
以增广目标函数P(x,M)为目标函数的无约束极值问题
最后在MATLAB命令框窗口输入:
[x,y]=fminunc('函数名',rand(2,1))(2为未知数的个数)
MATLAB求解约束极值问题
1、fminbnd函数
非线性函数f(x)在区间上的极小值
[X,FVAL]=FMINBND(FUN,x1,x2,OPTIONS) (区间为[x1,x2])
2、fseminf函数
求
X=FSEMINF(FUN,X0,NTHETA,SEMINFCON,A,B,Aeq,Beq)
FUN是用于定义目标函数F(x)
X0为初始值
NTHETA半无穷约束PHI(x,w)的个数
函数SEMINFCON用于定义非线性约束不等式C(x),非线性等式约束Ceq(x)和半无穷约束PHI(x,w)的每一个分量函数
3、fminimax函数
求解
其中
MATLAB命令为
X=FMINIMAX(FUN,X0,A,b,Aeq,Beq,LB,UB,NONLCON)
function f=fun(x)
%UNTITLED14 此处显示有关此函数的摘要
% 此处显示详细说明
f=[2*x(1)^2+x(2)^2-48*x(1)-40*x(2)+304
-x(1)^2-3*x(2)^2
x(1)+3*x(2)-18
-x(1)-x(2)
x(1)+x(2)-8]
end
[x,y]=fminimax(@fun,rand(2,1))
x
x =
4.0000
4.0000
y
y =
0.0000
-64.0000
-2.0000
-8.0000
-0.0000