MATLAB与优化设计书中Matlab源程序 (2)

2018-11-14 21:54

书中Matlab源程序 第1 章 绪论

【例1-1】有一名学生,期末有5门功课要考试,可用的复习时间有18小时。假定这五门课程分别是数学、英语、计算机基础、画法几何和专业概论。如果不复习直接参加考试,这五门功课预期的考试成绩分别为65分、60分、70分、60分和65分。复习以1小时为一单元,每增加1小时复习时间,各门功课考试成绩就有可能提高,每复习1小时各门功课考试成绩提高的分数分别为3分、4分、5分、4分和6分。问如何安排各门功课的复习时间可使平均成绩不低于80分,并且数学和英语成绩分别不低于70分和75分。

解:设分配在数学、英语、计算机基础、画法几何和专业概论这五门功课的复习时间分别为x1,x2,x3,x4,x5,则可列出如下的目标函数和限制条件为:

f(x)?x1?x2?x3?x4?x5 x1?x2?x3?x4?x5?18

(3x1?4x2?5x3?4x4?6x5?320)/5?80

3x1?65?70

本例具体程序如下:

%li_1_1 f=[1 1 1 1 1];

A=[1 1 1 1 1; -3 -4 -5 -4 -6; -3 0 0 0 0; 0 -4 0 0 0; 3 0 0 0 0; 0 4 0 0 0; 0 0 5 0 0; 0 0 0 4 0; 0 0 0 0 6]; b=[18;-80;-5;-15;35;40;30;40;35]; lb=zeros(4,1)

[x,fval]=linprog(f,A,b,[],[],lb)

计算结果为:

x = 1.6667 3.7500 5.0000 0.0000 5.8333 fval =

16.2500

1

【例1-2】某工厂要生产两种规格的电冰箱,分别用Ⅰ和Ⅱ表示。生产电冰箱需要两种原材料A和B,另外需设备C。生产两种电冰箱所需原材料、设备台时、资源供给量及两种产品可获得的利润如表1-1所示。问工厂应分别生产Ⅰ、Ⅱ型电冰箱多台,才能使工厂获利最多?

表1.1 资源需求与限制

资源 设备 原料A 原料B 单位产品获利 产品Ⅰ用原料限制 Ⅰ 1 2 0 220元 Ⅱ 1 1 1 250元 资源限制 1200台时 1800千克 1000千克 求最大收益 ?800千克 解:设生产Ⅰ、Ⅱ两种产品的数量分别为x1,x2。则可获得的最大收益为

maxf(x)? 220 x1 ? 250 x2 ,x?R2

s.. tx1 ? x2 ? 1200 2 x1 ? x2 ? 1800 x1 ? 800x2 ? 1000 x1 , x2 ? 0 Matlab求解程序如下:

%li_1_2 clc; close all; f=-[220 250]; A=[1 1;2 1;1 0;0 1]; b=[1200;1800;800;1000]; xl=[0 0];

[x,fval]=linprog(f,A,b,[ ],[ ],xl) x1=[0:1800]; x2=[0:2000];

[xm1,xm2]=meshgrid(x1,x2); x21=1200-x1; x22=1800-2*x1; x23=(-fval-220*x1)/250;

2

plot(x1,x21,x1,x22,[0:1:1000],1000,800,[0:1:1500],x1,x23,'r') axis([0,1400,0,2000]) xlabel('x1'); ylabel('x2'); hold on

z=200*xm1+250*xm2; [C,h]=contour(xm1,xm2,z); text_handle = clabel(C,h);

set(text_handle,'BackgroundColor',[1 1 .6],'Edgecolor',[.7 .7 .7]); hold off

【例1-3】绘制下面函数的曲线。

y(x)?2sin(x)?ln(x)

解:应用plot()函数绘制该函数曲线的程序如下:

%li_1_3

f=inline('2*sin(x)+log(x)','x') x=linspace(0.1,2*pi,15); y=feval(f,x);

plot(x,y,'-rs','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g', 'MarkerSize',10) xlabel('0.1\\leq \\Theta \\leq 2\\pi') ylabel('2sin(\\Theta)+ln(\\Theta)'); title('Plot of 2sin(\\Theta)+ln(\\Theta)')

text(pi/4,sin(-pi/4),'\\leftarrow 2sin(\\Theta)+ln(\\Theta)','HorizontalAlignment','left') legend('-') grid on

【例1-4】用图形表示如下优化模型,并求解。 minf(x)?4x1?x2?12

2s.t.x12?xx?2532(x1?5)?(x2?5)?16?022

解:该绘制目标函数曲面、约束函数曲线及求解程序如下:

(1)绘制目标函数曲面的程序

%li_1_4_1 function li_1_4_1() clc; clear all; close all; n=20;

3

x1=linspace(0,2,n); x2=linspace(0,6,n);

[xm1,xm2]=meshgrid(x1,x2); for i=1:n for j=1:n

xx=[xm1(i,j),xm2(i,j)]; zm(i,j)=fun_obj(xx); end end figure(1)

meshc(xm1,xm2,zm) xlabel('x1'); ylabel('x2'); zlabel('zm')

(2)绘制约束函数曲线及求解的程序

%li_1_4_2 function li_1_4_2() clc; clear all; close all; x0=[1,1];

[x,fval,exitflag,output]=fmincon(@fun_obj,x0,[ ],[ ],[ ],[ ],[ ],[ ],@fun_cons) n=20;

x1=linspace(0,6,n); x2=linspace(0,10,n); [xm1,xm2]=meshgrid(x1,x2); for i=1:n for j=1:n

xx=[xm1(i,j),xm2(i,j)]; zm(i,j)=fun_obj(xx); end end figure(1)

f1=inline('sqrt(25-x.^2)','x'); f2=inline('sqrt(16-(x-5).^2)+5','x'); y1=feval(f1,x1); y2=feval(f2,x1);

y3=sqrt((4*x1.^3)-12-fval+0.01)

4

plot(x1,y1,x1,y2); hold on

plot(x1(1:8),y3(1:8),'--r') hold on

[c,h]=contour(xm1,xm2,zm,20); clabel(c,h); xlabel('x1'); ylabel('x2');

function f=fun_obj(x) f=4*x(1)^3-x(2)^2-12; function [c,ceq]=fun_cons(x)

c=[x(1)^2+x(2)^2-10*x(1)-10*x(2)+34 -x(1) -x(2)];

ceq=[x(1)^2+x(2)^2-25];

5

第2章 优化设计的数学基础

【例2-11】 用图解法分析下面面优化问题的凸性,并求其最小值。

2minf(x)?(x1?3)2?x2s..tg1(x)?x12?x2?4?0 (2-28)

g2(x)??x1?0g3(x)??x2?0解:根据所给目标函数和约束函数函数,编制如下程序:

function kt_test1_plot1 clc; clear all; close all;

x=linspace(0,2.5,30); [xm,zm1]=meshgrid(x,[0,6]); y=4-x.^2;

ym=meshgrid(y,[0,20]); mesh(xm,ym,zm1); hold on r=2;

t=linspace(0,2*pi,45); x=r*cos(t)+3; y=r*sin(t);

[xm,ym]=meshgrid(x,y); zm2=(xm-3).^2+ym.^2; mesh(xm,ym,zm2); hold on

xx=linspace(-1,6,30); yy=linspace(-2,5,30);

[xxm,zzm]=meshgrid(0*xx,[0,6]); [yym]=meshgrid(yy,[-10,0]); mesh(xxm,yym,zzm); hold on

[yym,zzm]=meshgrid(0*yy,[0,6]); [xxm]=meshgrid(xx,[-10,0]); mesh(xxm,yym,zzm); axis([-1,6,-3,5,-2,12])

6

xlabel('x');ylabel('y');zlabel('z'); hold off figure(2)

x=linspace(0,6,30); y=linspace(0,5,30); [xm,ym]=meshgrid(x,y); zm3=(xm-3).^2+ym.^2; y1=4-x.^2; plot(x,y1,'k'); hold on

[c,h]=contour(xm,ym,zm3,10); text=clabel(c); hold off

xlabel('x');ylabel('y'); axis([0 6 0 5 ]);

【例2-12】分析式(2-29)和式(2-30)所示非线性有约束最小值问题。

minf(x)??(x1?1)2?(x2?10)2?102s..tg1(x)?x12?x2?1?0?x1?0?x2?0 (2-29)

minf(x)?(x1?1)2?(x2?10)2?102s..tg1(x)?x12?x2?1?0?x1?0?x2?0 (2-30)

解:首先绘制目标函数和约束函数曲面和曲线。以式(2-29)为例,绘制函数曲面和曲线的程序如下:

function kt_test1_plot2 clc;

thita=linspace(0,2*pi,50); r=1;

x=r*cos(thita); y=r*sin(thita);

[xm,zm1]=meshgrid(x,[-5,10]); [ym]=meshgrid(y,[0,20]); figure(1);

7

mesh(xm,ym,zm1); hold on

[xm,ym]=meshgrid(linspace(-2,2,30),linspace(-2,2,30)); zm2=(-(xm-1).^2-(ym-2).^2+10); mesh(xm,ym,zm2); hold on

axis([-2,2,-2,2,-15,12]) xlabel('x');ylabel('y');zlabel('z'); hold off figure(2)

x=linspace(-1,1,30); y1=sqrt(1-x.^2); y2=-sqrt(1-x.^2); plot(x,y1,'k',x,y2,'-r'); hold on

[c,h]=contour(xm,ym,zm2,20); text=clabel(c); hold on yy=[-2:0.1:2]

plot(zeros(length(yy)),yy,'--'); hold on

plot(yy,zeros(length(yy)),'--') hold off

xlabel('x');ylabel('y'); axis([-2 2 -2 2 ]);

8

第 3 章 线性规划

【例3-1】用单纯形法求解下面的线性规划问题。

maxf(x)?2x1?x2?2x3s.t.x1?x2?2x3?5x1?3x2?x3?3x1,x2,x3?0解:

(1)先用MATLAB线性规划函数求解,其计算程序如下:

%ch31_li1 clc; close all; f=-[2 1 -2]; A=[1 1 2;1 3 -1]; b=[5 3]; xl=[0 0 0];

[x,fval]=linprog(f,A,b,[ ],[ ],xl)

3.3 单纯形法的Matlab程序及实例

程序清单如下:

function [x,fmax]=linear_pro_max(cf,cb,A,b,indexb1) n=length(cf); max_sigma=1; m=length(cb); indexb=indexb1; theta=zeros(size(m,1)); while max_sigma>0 for j=1:n

sigma(j)=cf(j)-sum(cb(:).*A(:,j));

end

max_sigma=max(sigma); if(max_sigma>0)

pvj=find(sigma==max_sigma); theta=b./A(:,pvj); min_theta=min(theta); max_sigma min_theta

9

pvi=find(theta==min_theta); cb(pvi)=cf(pvj); indexb(pvi)=pvj; pvi pvj cb cf for i=1:m if(i~=pvi) for j=1:n

AA(i,j)=A(i,j)-A(i,pvj)*A(pvi,j)/A(pvi,pvj); end

bb(i)=b(i)-A(i,pvj)*b(pvi)/A(pvi,pvj); else

AA(i,:)=A(i,:)/A(pvi,pvj); bb(i)=b(i)/A(pvi,pvj); end end end

A=AA;b=bb'; end s=1:n; x=zeros(n,1); for i=1:m

k=find(s==indexb(i)); if(k~=0) x(k)=b(i); end end fmax=cf*x;

【例3-4】用单纯形法Matlab程序求解例1-2。

解:为方便起见,重新列出所给问题线性规划的标准形:

maxf(x)? 220 x1 ? 250 x2 ?0x3?0x4?0x5?0x6

s.. tx1 ? x2 +x3? 1200 2 x1 ? x2 +x4? 1800 x1 ?x5= 800x2 +x6= 1000

10

xj?0,j?1,2,?6

编写用户程序。cf为目标函数中变量系数行向量;cb为初选基变量行向量;indexb1为初始基变量下标索引;A为等式约束方程系数矩阵;b为等式约束方程右端项。应户程序为:

function linear_pro_max_test1 clc clear all;

cf=[220 250 0 0 0 0]; cb=[cf(3),cf(4),cf(5),cf(6) ]; indexb1=[3 4 5 6]; A=[1 1 1 0 0 0 2 1 0 1 0 0 1 0 0 0 1 0

0 1 0 0 0 1]; b=[1200;1800;800;1000];

[x,fmax]=linear_pro_max(cf,cb,A,b,indexb1)

计算结果:

x=[200 1000]。

3.5改进的单纯形法的Matlab程序及实例

根据修正的单纯形法计算步骤,应用Matlab语言编写计算程序,程序清单如下。

function [x fmax]=linear_promax_rev(cf,cb,A,b,indexa1,indexb1) cf1=cf; n=length(cf); m=length(cb); indexa=indexa1; indexb=indexb1; x0=b; for j=1:n A1(j)={A(:,j)}; end

e0=[A1{m:n}]; e0inv=inv(e0); xe0=e0inv*x0; r0=1; kk=0; while r0>0

11

fprintf('===========================================================') kk=kk+1 indexa,indexb cb e0inv for i=1:n-m k=indexa(i); cc=A1{k};

r(i)=cf(k)-cb*e0inv*cc; end r0=min(r); max_sigma=max(r); pvj=find(r==max_sigma); rr=e0inv*A1{pvj}; theta=x0./rr;

min_theta=min(theta); pvi=find(theta==min_theta); temp=cb(pvi); cb(pvi)=cf(pvj); cf(pvj)=temp;

indexa(pvj)=indexb(pvi); indexb(pvi)=pvj; e=A1{pvj}; e1=e0; for i=1:m e1(i,pvi)=e(i); end

e1inv=inv(e1); xe1=e1inv*b; e0=e1; e0inv=e1inv; x0=xe1;

max_sigma,min_theta,pvi,pvj e1 e1inv

fprintf('===========================================================') end s=1:n; x=zeros(n,1);

12

for i=1:m

k=find(s==indexb(i)); if(k~=0) x(k)=xe1(i); end end fmax=cf1*x;

【例3-6】 应用单纯形法Matlab程序计算例3-5。

解:将线性规划问题写成标准型,编写用户程序。cf为目标函数中变量系数行向量;

cb为初选基变量行向量;indexa1为初始非基变量下标索引;indexb1为初始基变量下标索

引;A为等式约束方程系数矩阵;b等式约束方程右端项。

用户程序如下:

function linear_promax_rev_test2 clc; clear all; cf=[50 100 0 0 0]; A=[1 1 1 0 0 2 1 0 1 0 0 1 0 0 1];

b=[300;400;250]; cb=[cf(3),cf(4) cf(5)]; indexa1=[1 2]; indexb1=[3 4 5];

[x fmax]=linear_promax_rev(cf,cb,A,b,indexa1,indexb1)

计算结果为:

x=[50 250 0 50 0],fmax=27500。

13

第 4 章 一维搜索方法

2. 进退法的MATLAB程序

该程序是按照寻找最佳步长编写的,其数学模型为式(4-2)。 程序说明如下:

函数opt_range_serach(xk0,dir0,th)中输入参数; xk0:初始点;

dir0:给定的搜索方向; th:步长增量。

%opt_range_serach1.m

function [opt_step,fo,xx] = opt_range_serach1(f,xk0,dir0,th)

%用进退法搜索三个点,使中点函数值最小;输出步长,函数值,设计变量值 %xk0:初始点 %th:步长 t1=0;t2=th;

xk1=xk0;xk2=xk1+t2*dir0; x0=xk1; f1=feval(f,x0); x0=xk2; f2=feval(f,x0); if f2

th=-2*th;t3=t1;f3=f1;t1=t2;f1=f2;t2=t3;f2=f3; t3=th;

xk3=xk1+t3*dir0; x0=xk3;

f3=feval(f,x0); end ii=0;

while f2>f3 t1=t2;f1=f2;t2=t3;f2=f3; t3=t2+th; xk3=xk1+t3*dir0; x0=xk3;

14

f3=feval(f,x0); end

xx1=xk1+t1*dir0; xx2=xk1+t2*dir0; xx3=xk1+t3*dir0; if th<0

opt_step=[t3 t2 t1]; xx=[xx3 xx2 xx1]; fo=[f3 f2 f1]; else

opt_step=[t1 t2 t3]; xx=[xx1 xx2 xx3]; fo=[f1 f2 f3]; end end

【例4-1】用进退法计算函数

f(x)?2?x2

的单峰区间,初始点x0?2。 解:用户程序如下:

%range_search_test1 clc;

f=inline('2+x^2','x'); xk0=2;th=0.5;dir0=1;

[opt_step,fo,xx] = opt_range_serach1(f,xk0,dir0,th) opt_step =

结果为:

opt_step=[-3 -2 -1] xo=[-1 0 1] fo=[3 2 3]

1. 黄金分割法的计算框图

图4.5是黄金分割法的计算框图。图中?1,?2为给定的任意小的精度,k为区间缩短的次数。

2. MATLAB程序

%golden_search

function [xo,fo] =golden_search(f,a,b,r,TolX,TolFun,k) kk=1;

15

while kk>0

h = b - a; rh = r*h; c = b - rh; d = a + rh; fc = feval(f,c); fd = feval(f,d);

if k <= 0 || abs(h) < TolX && abs(fc - fd)

xo = d;fo = fd; kk=0; end

if k == 0;fprintf('达到计算次数');kk=0; end else if fc < fd b=d;k=k-1; else a=c;k=k-1; end end end

【例4-2】计算目标函数

f(x)?2?x2

在区间[?2,2]内的极小点。

解:用户程序如下:

%golden_s_test1.m function golden_s_test1 clc; clear all;

gs_fun = inline('2+x^2','x');

a =-2; b = 2; r =(sqrt(5)-1)/2; TolX =1e-7; TolFun = 1e-7; MaxIter =50; [xo,fo]=fminbnd(gs_fun,a,b)

[xo,fo] =golden_search(gs_fun,a,b,r,TolX,TolFun,MaxIter)

计算结果:

xo= 1.4142e-0082; fo=2

2. 二次函数插值法的迭代过程与程序框图

16

MATLAB程序如下:

function [opt_step,fo,xo]=opt_step_quad2(f,xk0,dir0,th,TolX,TolFun,MaxIter) %opt_step_quad.m

[t012,fo,xx] = opt_range_serach1(f,xk0,dir0,th);

%search for the optimum step corresponding to minimum f(x) by quadratic approximation method k=MaxIter; while k>0 k=k-1;

t0=t012(1);t1=t012(2);t2=t012(3);

x0 = xk0+t012(1)*dir0; x1 =xk0+ t012(2)*dir0; x2 =xk0+t012(3)*dir0; f0 =feval(f,x0); f1 =feval(f,x1); f2 =feval(f,x2); nd = [f0 - f2 f1 - f0 f2 - f1]*[t1*t1 t2*t2 t0*t0; t1 t2 t0]'; t3 = nd(1)/2/nd(2); x3=xk0+t3*dir0;f3 = feval(f,x3); if k <= 0 | abs(t3 - t1) < TolX | abs(f3 - f1) < TolFun opt_step=t3;

xo=xk0+opt_step*dir0; fo=f3; return else if t3 < t1

if f3 < f1, t012 = [t0 t3 t1]; f012 = [f0 f3 f1]; else t012 = [t3 t1 t2]; f012 = [f3 f1 f2]; end else

if f3 <= f1, t012 = [t1 t3 t2]; f012 = [f1 f3 f2]; else t012 = [t0 t1 t3]; f012 = [f0 f1 f3]; end end end end opt_step=t3;

xo=xk0+opt_step*dir0; fo=f3; end

【例4-3】用二次插值法计算目标函数

f(x)?2?x2

在区间[?2,2]内的极小点及最佳步长。

17

解:用户程序如下:

%opt_step_quad_test1 clc;

f=inline('2+x^2','x');

xk0=2;th=0.5;dir0=1;TolX=1e-4;TolFun=1e-4;MaxIter=50; [opt_step,fo,xx]=opt_step_quad2(f,xk0,dir0,th,TolX,TolFun,MaxIter)

结果为: opt_step=[-2] xo=[0] fo=[2]

【例4-5】根据Lagrange插值公式,用MATLAB编程计算ln(x)在x?1.5的的值,差值区间x?[1,20]。

%int_lagrange function int_lagrange clc; x=1:0.5:20; y=log(x); xx=1.5; n=length(x); ff=0; for i=1:n p=1; for j=1:n if j~=i

p=p*(xx-x(j))/(x(i)-x(j)); end end ff=ff+p*y(i); end [xx,ff] log(1.5)

计算结果为

x=1.5000,f(x)=0.4055。

3)牛顿迭代法的MATLAB程序

function [x,fx] = root_newton(f,x0,TolX,MaxIter) %root_newton.m

18

TolFun=eps;

xx = x0; fx = feval(f,x0) for k = 1: MaxIter

dfdx =fun_dff1(f,xx) %numerical drv dx = -fx/dfdx; xx = xx+dx; fx = feval(f,xx);

if norm(fx)

if k == MaxIter, fprintf('达到最大迭代次数’), end function g=fun_dff1(f,x,dh) if nargin < 3, dh=1e-4;end

h2 = 2*dh; M=length(f);N = length(x(1,:));I = eye(N); for n = 1:N

g(:,n) = (feval(f,x + I(n,:)*dh)-feval(f,x - I(n,:)*dh))/h2; end

改进的牛顿迭代法的MATLAB程序如下。

function [xk1,fk1] =root_broyden(f,x0,TolX,MaxIter)

%root_broyden.m to minimize an objective ftn f(x) by the broyden method. N=length(x0(1,:)); TolFun=TolX; ak=eye(N); n=0;

while n<=MaxIter n=n+1; fk=feval(f,x0); xk1=x0-fk/ak; sk=xk1-x0; fk1=feval(f,xk1); yk=fk1-fk;

deltak=(yk'-ak*sk')*sk/(sk*sk'+1e-7); ak1=ak+deltak; ak=ak1; x0=xk1;

if norm(fk1)

if n == MaxIter, fprintf('The best in %d iterations\\n',MaxIter), end

19

end

2)对分法的MATLAB程序 对分法的MATLAB程序如下。

function [alpha,fc]=root_bisect(f,a,b,x0,dir,TolFun) % root_bisect.m

a1=x0+a*dir;b1=x0+b*dir; fa=feval(f,a1);fb=feval(f,b1); while norm(fb-fa)>TolFun fa=feval(f,a1);fb=feval(f,b1); c1=(a1+b1)/2; fc=feval(f,c1); if fa*fc<0 b1=c1;

else a1=c1;

end end

alpha=(c1(1)-x0(1))/dir(1);

20

c=c+(g(i)<0)*log(abs(g(i)));

end fc=f+r*c;

计算结果为:

xo =

fc =

1.00014459741663

1.00010436403355 1.99984323680675

例8-3的Matlab程序如下。

function pen_ex_test %外点罚函数法 clc; global r format long; x0=[0.5 0.5]; r=1e-6; c=1; k=0 TolX=1e-3 while c>1e-6 k=k+1; r=r*1.1

[x fc]=fminsearch(@fpen_in,x0) [fc f c]=fpen_in_sjm1(x) x0=x; end

function [fc f c]=fpen_in_sjm1(x) global r

f=x(1)^2+2*x(2)^2; c=-x(1)-x(2)+1; fc=f+r*(c>0)*c^2;

计算结果如下:

x =

fc =

0.66666599488580

0.66679835346354 0.33320078985086

【例8-4】用混合罚函数法求下面的优化问题。

46

2minf(x)?4x1?x2?12

2 s.t. g1(x)?-10x1?x1-10x2?x22?20?0

g2(x)??x1?0 g3(x)??x2?0

22 h1(x)?x1?x2?25?0

解:构造罚函数为

2?(x)?4x1?x2?122?r(1/(-10x1?x1-10x2?x22?20)?1/x1?1/x2) 2?1/r(x12?x2?25)2MATLAB程序如下:

function pen_hy_fmtest2 clc; clear all; close all; format long; x0=[2,3]; r=1e8; df=1e10;; k=0;

while df>0.00001 k=k+1; r=r*0.999;

[x fc]=fminsearch(@fpen_hyfun,x0,[ ],r); [fc f c]=fpen_hyfun(x,r); df=abs(f-fc) x0=x; end k x,f

function [fc f c]=fpen_hyfun(x,r) f=4*x(1)-x(2)^2-12;

47

c=[-10*x(1)+x(1)^2-10*x(2)+x(2)^2+20 -x(1) -x(2)]; ceq=25-x(1)^2-x(2)^2; fc=0; for i=1:3

fc=fc+(c(i)<0)*(1/c(i)); end

fc=f-r*fc+1/sqrt(r)*(ceq)^2;

计算结果为:x=[4.158?10 5.000],f = -36.998

-4

48

第9 章 多目标函数优化设计

【例9-1】 现有现金70元,可用来可用来购买菠萝和苹果。菠萝5元/kg,苹果3元/kg,要求总斤数不少于15kg,菠萝不少于5kg。

问:(1) 购买菠萝和苹果各多少斤,才能在满足要求的条件下花钱最少?(2) 购买菠萝和苹果各多少斤,才能在满足要求的条件下所买的菠萝和苹果最多?

解:通俗地说,这是一个如何安排资金,少花钱多办事的问题。设购买菠萝x1kg,苹果x2kg。可以列出如下的优化数学模型:

minf1(x)?5x1?3x2,x?R maxf2(x)?x1?x2,x?R

22s..t5x1?3x2?70

x1?x2?15 x1?5 x2?0

(1)如果只考虑目标函数minf1(x)?5x1?3x2,则应用Matlab求解的程序为:

%li9_1 f=[5 3];

A=[5 3;-1 -1;-1 0]; b=[70;-15;-5]; xl=[0;0];

[x,f,exitflag]=linprog(f,A,b,[ ],[ ],xl)

最优解为:x=[5 10], f1(x)?55元,f2(x)?15kg。

(2)如果只考虑目标函数maxf2(x)?x1?x2,则应用Matlab求解的程序为:

f=-[1 1];

A=[5 3;-1 -1;-1 0]; b=[70;-15;-5]; xl=[0;0];

[x,f,exitflag]=linprog(f,A,b,[ ],[ ],xl)

最优解为:x=[5 15], f1(x)?70元,f2(x)?20kg。 【例9-5】用线性加权法求解例9-1。

49

解:取两组权系数:1)w1?0.5,w2?0.5;2)w1?0.2,w2?0.8。相应的MATLAB计算程序如下:

%li9_5 function li9_5 clc; clear all;

A=[5 3;-1 -1;-1 0]; b=[70;-15;-5]; xl=[0,0];x0=[0,0]; w(1,1)=0.5;w(1,2)=0.5; w(2,1)=0.2;w(2,2)=0.8; for i=1:2 i

[x,f,exitflag]=fmincon(@(x)fun_obj(x,w(i,:)),x0,A,b,[ ],[ ],xl) f1=5*x(1)+3*x(2) f2=x(1)+x(2) end

f1=inline('(70-5*x)/3','x'); f2=inline('15-x','x'); x=0:0.1:20;

plot(x,f1(x),x,f2(x),5*ones(length(x)),0:0.1:20) axis([0,16,0,25])

function f1f2=fun_obj(x,ww)

f1f2=ww(1)*(5*x(1)+3*x(2))-ww(2)*(x(1)+x(2));

50


MATLAB与优化设计书中Matlab源程序 (2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:普洱茶产业的SWOT战略分析

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: