MATLB数学实验胡良剑第十十一十二章部分答案.docx
《MATLB数学实验胡良剑第十十一十二章部分答案.docx》由会员分享,可在线阅读,更多相关《MATLB数学实验胡良剑第十十一十二章部分答案.docx(17页珍藏版)》请在冰点文库上搜索。
MATLB数学实验胡良剑第十十一十二章部分答案
第十章
第一题
f=[-3;4;-2;5];A=[1,1,3,-1;2,-3,1,-2];
b=[14;-2];Aeq=[4,-1,2,-1];beq=-2;
i=1:
3;lb(i)=zeros(3,1);
lb(4)=-inf;
[x,feval]=linprog(f,A,b,Aeq,beq,lb)
Optimizationterminated.
x=
0.0000
8.0000
0.0000
-6.0000
feval=
2.0000
第二题
f=[5;4;8];A=[2,-1,0;5,3,0];
b=[4;15];Aeq=[1,2,1];beq=6;lb=[0,0,0];
[x,feval]=linprog(f,A,b,Aeq,beq,lb)
Optimizationterminated.
x=
0.0000
3.0000
0.0000
feval=
12.0000
第五题
clear
f=-[7,12];A=[9,5;4,5;3,10];b=[360;200;300];
lb=[0;0];[x,feval]=linprog(f,A,b,[],[],lb)
Optimizationterminated.
x=
20.0000
24.0000
feval=
-428.0000
在对求出的最小值取反既可以得出最大值为428
第六题
%%变量x1,x2,x3,x4,x5,x6;分别代表x11,x12,x13,x21,x22,x23
%%xij表示是煤场i对于居民地j的出生煤量。
f=[10,5,6,4,8,12];lb=zeros(6,1);
Aeq=[1,1,1,0,0,0;0,0,0,1,1,1;1,0,0,1,0,0;0,1,0,0,1,0;0,0,1,0,0,1;];
beq=[60;100;50;70;40];[x,fval]=linprog(f,[],[],Aeq,beq,lb)
Optimizationterminated.
x=
0.0000
20.0000
40.0000
50.0000
50.0000
0.0000
fval=
940.0000
第十一题
编写函数
functionf=ex11fun(x);
f=x
(1)+x
(2);
%编写约束函数M函数
function[c,ceq]=confun(x)
%非线性不等式约束
c=[1.805-(4+(x
(2)-7)/x
(1))*(1-(4-x
(2))/x
(1));0.9025-(4-(7-x
(2)))/(3*x
(1));0.9025-(1-(4-x
(2)))/(2*x
(1)/3)];
%非线性等式的约束
ceq=[];
最后在窗口运行:
[x,feval]=fmincon(@newch11_fun,[1,1],[],[],[],[],[0,0],[],@newch11_confun)
Warning:
Large-scale(trustregion)methoddoesnotcurrentlysolvethistypeofproblem,
switchingtomedium-scale(linesearch).
>Infminconat260
Optimizationterminated:
first-orderoptimalitymeasureless
thanoptions.TolFunandmaximumconstraintviolationisless
thanoptions.TolCon.
Activeinequalities(towithinoptions.TolCon=1e-006):
lowerupperineqlinineqnonlin
1
2
x=
0.67814.8359
feval=
5.5140
第十二题
首先
%编写目标函数M函数
functionf=ch12_fun(x)
%目标函数
f=-x
(1)*x
(2)*x(3)
其次
%编写约束函数M函数
function[c,ceq]=ch12_confun(x)
%非线性不等式约束
c=[];
%非线性等式的约束
ceq=[];
最后窗口运行
A=[1,-2,-2;1,2,2];b=[0;72];Aeq=[1,-1,0];beq=10;
[x,fval]=fmincon(@ch12_fun,[25,15,8],A,b,Aeq,beq,[0,10,0],[Inf,20,Inf],@ch12_confun)
第十一章
第一题:
先编写Matlab程序枚举法IntLp.m:
function[x,y]=IntLp(f,G,h,Geq,heq,lb,ub,x,id,options)
%整数线性规划分支定界法,可求解全整数线性或混合整数线性规划
%y=minf'*xsubjectto:
G*x<=hGeq*x=heqx为全整数
%数或混合整数列向量
%用法
%[x,y]=IntLp(f,G,h)
%[x,y]=IntLp(f,G,h,Geq,heq)
%[x,y]=IntLp(f,G,h,Geq,heq,lb,ub)
%[x,y]=IntLp(f,G,h,Geq,heq,lb,ub,x)
%[x,y]=IntLp(f,G,h,Geq,heq,lb,ub,x,id)
%[x,y]=IntLp(f,G,h,Geq,heq,lb,ub,x,id,options)
%参数说明
%x:
最优解列向量;y:
目标函数最小值;f:
目标函数系数列向量
%G:
约束不等式条件系数矩阵;h:
约束不等式条件右端列向量
%Gep:
约束等式条件系数矩阵;heq:
约束等式条件右端列向量
%lb:
解的下界列向量(Default:
-inf)
%ub:
解得上界列向量(Default:
inf)
%x:
迭代初值列向量;
%id:
整数变量指标列向量,1—整数,0—实数(default:
1)
%options的设置请参见optimset或linprog
%例minz=x1+4x2
%s.t.2x1+x2<=8
%x1+2x2>=6
%x1,x2>=0且为整数
%先将x1+x2>=6化为-x1-2x2<=-6
%[x,y]=IntLp([1;4],[21;-1-2],[8;-6],[],[],[0;0])
globalupperoptcx0AbAeqbeqIDoptions;
ifnargin<10,options=optimset({});options.Display='off';
options.LargeScale='off';end
ifnargin<9,id=ones(size(f));end
ifnargin<8,x=[];end
ifnargin<7|isempty(ub),ub=inf*ones(size(f));end
ifnargin<6|isempty(lb),lb=zeros(size(f));end
ifnargin<5,heq=[];end
ifnargin<4,Geq=[];end
upper=inf;c=f;x0=x;A=G;b=h;Aeq=Geq;beq=heq;ID=id;
ftemp=IntLp(lb(:
),ub(:
));
x=opt;y=upper;
%以下为子函数
functionftemp=IntLp(vlb,vub)
globalupperoptcx0AbAeqbeqIDoptions;
[x,ftemp,how]=linprog(c,A,b,Aeq,beq,vlb,vub,x0,options);
ifhow<=0
return;
end;
ifftemp-upper>0.00005%inordertoavoiderror
return;
end;
ifmax(abs(x.*ID-round(x.*ID)))<0.00005
ifupper-ftemp>0.00005%inordertoavoiderror
opt=x';upper=ftemp;
return;
else
opt=[opt;x'];
return;
end;
end;
notintx=find(abs(x-round(x))>0.00005);
%inordertoavoiderror
intx=fix(x);tempvlb=vlb;tempvub=vub;
ifvub(notintx(1,1),1)>=intx(notintx(1,1),1)+1
tempvlb(notintx(1,1),1)=intx(notintx(1,1),1)+1;
ftemp=IntLp(tempvlb,vub);
end;
ifvlb(notintx(1,1),1)<=intx(notintx(1,1),1)
tempvub(notintx(1,1),1)=intx(notintx(1,1),1);
ftemp=IntLp(vlb,tempvub);
end;
第六题:
先编写Matlab程序枚举法BintLp_E.m:
function[x,f]=BintLp_E(c,A,b,N)
%[x,f]=BintLp_E(c,A,b,N)用枚举法求解下列
%0-1线性规划问题
%minf=c'*x,s.t.A*x=b,x的分量全为整数0或1,
%其中N表示约束条件Ax≤b中的前N个是等式,N=0时可以省略。
%程序中用到命令B=de2bi(D),其作用是将10进制数向量D转换
%为相应二进制数按位构成的以0,1为元素的矩阵B。
%此命令在toolboxcommunication中。
%返回结果x是最优解,f是最优解处的函数值。
ifnargin<4,N=0;end
c=c(:
);b=b(:
);
[m,n]=size(A);x=[];f=abs(c')*ones(n,1);i=1;
whilei<=2^n
B=de2bi(i-1,n)';
t=A*B-b;t11=find(t(1:
N,:
)~=0);
t12=find(t(N+1:
m,:
)>0);t1=[t11;t12];
ifisempty(t1)
f=min([f,c'*B]);
ifc'*B==f,x=B;end
end
i=i+1;
end
f
>>c=[4,3,2];
a=[2,-5,3;-4,-1,-3;0,-1,-1];b=[4,-3,-1];x0=BintLp_E(c,a,b)
f=
2
x0=
0
0
1
>>
第七题:
调用枚举法程序BintLp_E.m
>>c=[2,5,3,4];
a=[4,-1,-1,-1;2,-4,-2,-4;-1,-1,1,-1];b=[0,-4,-1];
x0=BintLp_E(c,a,b)
f=
4
x0=
0
0
0
1
>>
第十二章
第一题
先编写程序Dijkstra算法
minRoute(i,m,W,opt)
function[S,D]=minroute(i,m,W,opt)
ifnargin<4
opt=0;
end
dd=[];tt=[];
ss=[];ss(1,1)=i;
V=1:
m;V(i)=[];
dd=[0;i];
kk=2;
[mdd,ndd]=size(dd);
while~isempty(V)
[tmpd,j]=min(W(i,V));
tmpj=V(j);
fork=2:
ndd
[tmp1,jj]=min(dd(1,k)+W(dd(2,k),V));
tmp2=V(jj);
tt(k-1,:
)=[tmp1,tmp2,jj];
end
tmp=[tmpd,tmpj,j;tt];
[tmp3,tmp4]=min(tmp(:
1));
iftmp3==tmpd
ss(1:
2,kk)=[i;tmp(tmp4,2)];
else
tmp5=find(ss(:
tmp4)~=0);
tmp6=length(tmp5);
ifdd(2,tmp4)==ss(tmp6,tmp4)
ss(1:
tmp6+1,kk)=[ss(tmp5,tmp4);tmp(tmp4,2)];
else
ss(1:
3,kk)=[i;dd(2,tmp4);tmp(tmp4,2)];
end
end
dd=[dd,[tmp3;tmp(tmp4,2)]];
V(tmp(tmp4,3))=[];
[mdd,ndd]=size(dd);
kk=kk+1;
end
ifopt==1
[tmp,t]=sort(dd(2,:
));
S=ss(:
t);
D=dd(1,t);
else
S=ss;
D=dd(1,:
);
end
>>clearall
w=inf*ones(8);
w(1,[3,5,6])=[10,30,100];
w(2,[3])=[5];
w(3,[4])=[50];
w(4,[6])=[10];
w(5,[4,6])=[20,60];
[s,d]=minroute(1,6,w,1)
s=
111111
023555
000404
000006
d=
0Inf10503060
>>
最短距离分别为:
10;30;50;60
第三题:
>>clearall
w=inf*ones(11);
w(1,[2,3])=[2,8];
w(2,[3,5])=[6,1];
w(3,[4])=[7];
w(4,[1,7])=[1,9];
w(5,[3,9])=[5,1];
w(6,[3,5,7,9])=[1,3,4,6];
w(7,[3,10])=[2,1];
w(8,[5,11])=[2,9];w(9,[8])=[7];
w(10,[9])=[1];
w(11,[9,10])=[2,6];[s,d]=minroute(1,11,w,1)
s=
11111111111
02332632232
00045045545
00000079979
000000080108
000000000011
d=
028153Inf241142520
>>
最短距离分别为:
0,2,3,4,8,11,15,20,24,25,Inf
第四题
最短距离:
>>clearall
w=inf*ones(6);
w(1,[2,3])=[1,3];
w(2,[3,4,5])=[2,1,3];
w(3,[5,6])=[1,4];
w(4,[5,6])=[6,7];
w(5,[6])=[5];
[s,d]=minroute(1,6,w,1)
s=
111111
023223
000456
d=
013247
>>
最短时间
>>clearall
w=inf*ones(6);
w(1,[2,3])=[3,4];
w(2,[3,4,5])=[7,5,20];
w(3,[5,6])=[2,10];
w(4,[5,6])=[8,12];
w(5,[6])=[15];
[s,d]=minroute(1,6,w,1)
s=
111111
023233
000456
d=
0348614
>>
两条路线均为a-c-f距离为7个单位,所需的时间为14个单位;
第五题:
先编写MATLAB程序:
Minterrk.m
function[Wt,Pp]=mintreek(n,W)
%图论中最小生成树Kruskal算法及画图程序M-函数
%格式[Wt,Pp]=mintreek(n,W):
n为图顶点数,W为图的带权邻接矩
%阵,不构成边的两顶点之间的权用inf表示。
显示最小生成树的边及
%顶点,Wt为最小生成树的权,Pp(:
1:
2)为最小生成树边的两顶点,
%Pp(:
3)为最小生成树的边权,Pp(:
4)为最小生成树边的序号;
%附图,红色连线为最小生成树的图;
%例如
%n=6;w=inf*ones(6);
%w(1,[2,3,4])=[6,1,5];w(2,[3,5])=[5,3];
%w(3,[4,5,6])=[5,6,4];w(4,6)=2;w(5,6)=6;
%[a,b]=mintreek(n,w)
%ByX.D.DingJune2000
tmpa=find(W~=inf);[tmpb,tmpc]=find(W~=inf);
w=W(tmpa);e=[tmpb,tmpc];%w是W中非inf元素按列构成的向量
%e的每一行元素表示一条边的两个顶点的序号
[wa,wb]=sort(w);E=[e(wb,:
),wa,wb];[nE,mE]=size(E);
temp=find(E(:
1)-E(:
2));E=E(temp,:
);
P=E(1,:
);k=length(E(:
1));
while(rank(E)>0)
temp1=max(E(1,2),E(1,1));temp2=min(E(1,2),E(1,1));
fori=1:
k;
if(E(i,1)==temp1),E(i,1)=temp2;end;
if(E(i,2)==temp1),E(i,2)=temp2;end;
end;
a=find(E(:
1)-E(:
2));E=E(a,:
);
if(rank(E)>0),P=[P;E(1,:
)];k=length(E(:
1));end;
end;
Wt=sum(P(:
3));Pp=[e(P(:
4),:
),P(:
3:
4)];
fori=1:
length(P(:
3));%显示顶点vi与边ej
disp(['','e',num2str(P(i,4)),'','(v',...
num2str(P(i,1)),'','v',num2str(P(i,2)),')']);
end;
%以下是画图程序
axisequal;holdon
[x,y]=cylinder(1,n);xm=min(x(1,:
));ym=min(y(1,:
));
xx=max(x(1,:
));yy=max(y(1,:
));
axis([xm-abs(xm)*0.15,xx+abs(xx)*0.15,ym-abs(ym)*0.15,yy+abs(yy)*0.15]);plot(x(1,:
),y(1,:
),'ko')
fori=1:
n;temp=['v',int2str(i)];
text(x(1,i),y(1,i),temp);end;
fori=1:
nE;plot(x(1,e(i,:
)),y(1,e(i,:
)),'b');end;
fori=1:
length(P(:
4));
plot(x(1,Pp(i,1:
2)),y(1,Pp(i,1:
2)),'r');end;
text(-0.35,-1.2,['最小生成树的权为','',num2str(Wt)]);
title('红色连线为最小生成树');axis('off');holdoff
>>clearall;n=8;
w=inf*ones(8);
w(1,[2,3,4,5,6,7,8])=[1.3,2.1,0.9,0.7,1.8,2.0,1.5];
w(2,[3,4,5,6,7,8])=[0.9,1.8,1.2,2.6,2.3,1.1];
w(3,[4,5,6,7,8])=[2.6,1.7,2.5,1.9,1.0];
w(4,[5,6,7,8])=[0.7,1.6,1.5,0.9];
w(5,[6,7,8])=[0.9,1.1,0.8];
w(6,[7,8])=[0.6,1.0];
w(7,[8])=[0.5];[a,b]=mintreek(n,w)
e28(v7v8)
e21(v6v7)
e7(v1v5)
e10(v4v1)
e26(v1v6)
e3(v2v3)
e24(v2v1)
a=
5.2000
b=
7.00008.00000.500028.0000
6.00007.00000.600021.0000
1.00005.00000.70007.0000
4.00005.00000.700010.0000
5.00008.00000.800026.0000
2.00003.00000.90003.0000
3.00008.00001.000024.0000
>>
如图红线铺设输油管长度最短则得出最短长度为5+5.2=10.2KM