matlab中fseminf函数,建模算法(三)——非线性规划

一、非线性规划和线性规划不同之处

1、含有非线性的目标函数或者约束条件

2、如果最优解存在,线性规划只能存在可行域的边界上找到(一般还是在顶点处),而非线性规划的最优解可能存在于可行域的任意一点达到。

二、非线性规划的Matlab解法

1、Matlab中非线性规划的数学模型为:

ec1c4a727c5c2a36e1581529eb924b26.png

其中f(x)是标量函数,A,B,Aeq,Beq是相应维数的矩阵和向量,C(x),Ceq(X)是非线性向量函数。

e9d2b8f85d81d47c9c5c61861a7df299.png

然后我们通过一个例子来加深印象

549daff8e70270d85e6c8f3161b8003f.png

e0b0a339b9f016e8e6910489bde67775.png

MATLAB实现:

function f=fun1(x) %定义目标函数

f=sum(x.^2)+8;

function [g,h]=fun2(x) %非线性约束条件

g=[-x(1)^2+x(2)-x(3)^2x(1)+x(2)^2+x(3)^3-20];

h=[-x(1)-x(2)^2+2x(2)+2*x(3)^2-3];

options = optimset(‘largescale‘,‘off‘);

[x,y]=fmincon(‘fun1‘,rand(3,1),[],[],[],[],zeros(3,1),[],‘fun2‘,options) %初始值是个随意的数字

2、求解线性规划的基本迭代格式

(1) 这一块主要是一些概念,认识了这些概念,才能继续理解下面的思想,不得不看,不要觉得烦,就想学加减乘除,我们必须定下’+’就是加这个规则一样,所以我们要理解这些概念。

eccdaf24299f7b522e3d15db1ea98e8a.png

(2)对于NP问题(非线性规划),可以采用迭代方法求它的最优解。基本思想就是:

从一个选定的初始点18e7b500f015e8091ccf2bf0bc8bd74a.png出发,按照某一特定的迭代规则产生一个点列59a7816086fa65b98229131b4f62049d.png,使得当88a35c3cc2c066d3cef9ac650f7e8c76.png时有穷点列时,其最后一个是NP的最优解;当e4b5cd7aacb73d3efee6ae6ce62ff81f.png时无穷点列是,它存在极限,并且极限点就是NP的最优解

d271c3490393bfab90a823bad75bec64.png

0bc8a76c073e261c8853e148e18d408c.png

(3)求解NP问题的一般步骤

在列出步骤之前,我们要先理解一个概念(用来决定搜索的最佳方向)

9d2c086e81e480d487b9ed2c6af4a095.png

一般步骤为:

a、选取初始点8dda8fa36e07ea106aadc65dd455c40b.png,令k:=0

b、构造搜索方向,按照一定的规划,构造f在点002d4329435a19968fa411f9108c5535.png处关于K的可行下降方向作为搜索方向。

c、求出下一个迭代点,按迭代格式求出

3cf59529fb78aca0bf60248fbe0f83a4.png

若满足了某种终止条件,就停止迭代

d、用7cdfae734ce7101e93a273905dbd9c29.png代替e3f8b2bd01b34c658b9b54c00acecb72.png,继续迭代。

(4)凸函数、凸规划

355e7e84103f18a0d98fc987bdf936a6.png

这种规划的特点在于,他的局部最优解就是全局最优解,这是很棒的特性,说明这一类的NP问题很容易进行求解。

(二)无约束问题

一、一维搜索方法

例如一维极小化问题,若f(t)是[a,b]区间上的下单峰函数,通过不断地缩短[a,b]的长度,来搜索得到近似最优解。

就是找到关于这个区间对称的2点,然后比较这两点的大小,那么t*肯定将大的那边回缩,构造一个更小的区间来求解,这样的话最后就取到极限值,就可以得到最优解。

1、斐波那契数列法

f2a064e531b8b20e2a0af4a33c0eeb41.png

这个方法就是用来确定步长是如何取得一种方式,是采用斐波那契分数来刻画每次区间的差值。

然后就是经过一系列的探索之后,使最后的探索点和最优解之间的距离不超过精度f0bf249b0d059afeedbee27b3d8123d8.png,也就是最后的区间长度不能超过这个66a00c6ec59078387ae14866c7850c70.png,这样子的话,我们可以通过精度,反过来确定需要探索的次数N,进行N次停下来,最终的就是最优解。

b0f171cc72fb1aa3ba2df152c2160f3c.png

下面是算法的整体思路(编程思路)

6964641673cce56ef0facf32138f722d.png

2、0.618法(黄金分割法)e89f5eeef2b4ecda4ebb22f2fcb8db95.png

只是将比值改为了0.618,这样子的话,编程实现起来更加的简单,只要将上述的第三部中的斐波那契比值改为0.618即可。

3、二次插值法(暂时略过)

4、无约束极值问题的解法

(1)一般格式为:3fb871817841f0c43d976f02691e8a77.png

(2)解析法——梯度法

对于基本的迭代格式,我们首先要确定的是搜索方向,那么由微积分的知识可得,沿着负梯度的方向是f下降最快的方向,所以我们作为我们以为搜索的方向。

这个方法的特点就是每次搜索的方向都是下降最快的方向,于是乎我们的停止条件为:9704191df17fb1fc78db55de9f7c421e.png

具体步骤如下:

a438c1079178b5e6d110794d3213d8ee.png

在此举出一个例题

2528ae68fbaec1443e4866820b7bdaa8.png

MATLAB实现

function [f,df]=detaf(x)

f=x(1)^2+25*x(2)^2;

df=[2*x(1)50*x(2)];

x=[2;2];

[f0,g]=detaf(x);while norm(g)>1e-6p=-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

x,f0

最后极值趋近于0,差不多= =。

(3)解析法——牛顿法

其实就是用二次展开式逼近,确定出一个搜索的方向。至于中间的计算(呵呵了- -)

752296aca30388903c96aef0d1e9dad2.png

2f60c255fdec200067a5570c585cefec.png

然后一般步骤(编程思路)

0f1334c5b17295fdb96e49fc4adddb34.png

然后举一题例题

068b42d793ab43e0c85048c0eb065cc9.png

我们可以通过计算得到

19b9b069d96a22015c42d8c6d1539cde.png

d8b7998ee1058091960413f1d45a130f.png

然后使用MATLAB编程求解(其实用C也可以。。)

function [f,df,d2f]=nwfun(x)

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

100*x(2)^3+2*x(1)^2*x(2)];

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];

x=[2;2];

[f0,g1,g2]=nwfun(x);while norm(g1)>0.00001p=-inv(g2)*g1;

x=x+p;

[f0,g1,g2]=nwfun(x);

end

x,f0

然后如果目标函数不是二次函数,那么一般来说Newton法不能保证求得最优解。

为了提高计算精度,我们在迭代的时候依旧可以使用变步长的方法。

x=[2;2];

[f0,g1,g2]=nwfun(x);while norm(g1)>0.00001p=-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

x,f0

(3)解析法——变尺度法

这是用来解决Newton法求逆矩阵太耗时而研究出的一种解决的方法。推到我们可以直接略过吧。

直接写出一般步骤

9e3281f8f0c01367aa685bf52f3897f3.png

0e012573a136c81ad811554e0a1819d1.png

(4)直接法——Powell方法

29f3913b4aa0285fbff6f0d51a8acc60.png

a4e61dd29ba22eb647d05d446411fc57.png

5、无约束问题的MATLAB方法。。(= =,早说,我都不写了)

1、无约束问题的MATLAB格式

12bb48ec51f7b9c1c2ff5d2d8a9395de.png

(1)fminunc命令

00bf002052c020bad55ee2841ca2162f.png

例子如下

24ade6ed21abc9d7ac729466101f9050.png

MATLAB调用解题

9f097e60aa2d7ff8350382c2886cbdc0.png

5d742ba596d7c086bb5023402c33906d.png

(2)fminsearch命令

6ae62869c41508692089a5761af2826c.png

(三)约束极值问题

一、二次规划

1、定义:目标函数是x的二次函数,而且约束条件都是线性的。

2、一般数学模型

62a7031ecdb1de5d4bdda13084b47a45.png

3、MATLAB的求解函数

4b3f561e519b6f5c3ec7d61283e3bbfb.png

二、外罚函数法

38f287001b86bc44cd0003d5644cf1d6.png

例题:

f42b1100862c232da0b96ccafd536fc2.png

求解

f3747657fa2b4661f1321f413fe9cdab.png

4cdfa894f10dcb7d5525e2977c72bb40.png

三、MATLAB求约束极值问题

1、fminbnd函数

1b0941a4f063c587462364c503b6609d.png

2、fseminf函数

e46f05baf1d25a1b0722b3f6945797b8.png

0183b107a77a9cd5919330881b64c7f9.png

3、fseminf函数

98ca2495ca43bdb1bd8cc7b540ce103d.png

原文:http://www.cnblogs.com/BlueMountain-HaggenDazs/p/4265697.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值