西农建模实验三.docx
《西农建模实验三.docx》由会员分享,可在线阅读,更多相关《西农建模实验三.docx(12页珍藏版)》请在冰点文库上搜索。
西农建模实验三
西北农林科技大学实验报告
1、继续研究十字路口红绿灯问题
一、实验题目
继续研究十字路口红绿灯问题
二、题目重述
十字路口绿灯亮30秒,最多可以通过多少辆汽车?
继续研究问题:
十字路口绿灯亮t秒,最多可以通过多少辆汽车n=n(t)?
三、实验目的
数学建模是一种数学的思考方法,用数学的语言和方法,通过抽象、简化建立能近似刻画并“解决”实际问题的路径。
因此,建模一般具有明确的应用背景,针对性较强。
为了使所研究的模型有相当的普适性,能解决一类问题,就需要在模型确立之后,进一步分析推广,挖掘出模型更多的理论和实用价值。
四、实验内容
问题要求很明确。
求解的关键是绿灯亮后,汽车才启动,极速驶过路口。
要确定在给定的时间内通过多少辆汽车,就要考虑汽车的加速度,从停车位置到路口的路程,以及城市行车的最高限速要求。
记住在t时刻第n辆汽车的位置为Sn(t),用数轴表示车辆行驶道路,数轴的正向为汽车行驶方向,数轴原点为红绿灯位置。
于是,当Sn(30)>0时,表明在第30秒的n辆车已通过红绿灯,否则,结论相反。
于是,只要确定限速行驶模型Sn(t),就可以确定30秒内通过的汽车数量n。
在单向、单车道、直行、限速等假设下,得到以下模型:
其中Sn(0)=-(n-1)(L-D)表示第n辆车在绿灯亮前的位置,tn=n表示第n辆车的启动时间,tn*=v*/a+tn表示第n辆车达到最大限速的时间。
参数取车长L=5cm,车距D=2cm,加速度a=2m/s2,最大限速v*=11m/s.可以得到结果,绿灯亮30秒,该路口单向,单车道可以通过17辆车。
确定十字路口绿灯亮多长时间是城市交通管理中最基本的一个问题。
直接利用限速行驶模型计算每辆车到达路口的时间,由数值结果可见,绿灯亮后汽车才开始以最高限速穿过路口的时在11秒以后,从第六辆车开始,以后的车都以最高限速穿过路口。
绿灯亮30秒通过路口的17辆车中有11辆汽车以最高限速穿过路口,如果绿灯只亮15秒,则在通过的7辆车中只有2辆车以最高的限速穿过路口。
显然,这样的交通灯控制策略对于路口的利用率是不高的。
如果利用限速行驶模型得到通过的车辆数对绿灯亮的时间长度的依赖关系n=n(t),即得到当绿灯亮t秒时,单向、单车道通过的车辆数,对进一步的研究更方便。
要写出这个分段函数,推导并不困难,虽然有些繁琐,但是在实际问题研究中找到显示表达函数的机会非常少。
借助计算机编程,利用输入输出表达函数关系常常是唯一可取的办法。
一个基本的想法是,在有限时间内只能通过有限车辆,只要计算出n辆车通过路口的时间,在用规定的红绿灯的时间长度作为卡尺,就可以确定通过的车辆数。
算法:
(1)计算每辆汽车达到最大限速时间t0,以加速度通过路口的时间t1和以最大限速通过路口时间t2。
(2)比较t0和t1就可以确定这辆车实际通过路口的时间。
(3)将充分多辆车通过路口的时间列出来,确定通过路口时间小于绿灯亮的时间长度T的所有车号,其中最大的就是能够通过的车辆数。
五、实验结果分析与讨论
只要输入T就会由pass(T)得到通过的车辆数。
确定十字路口绿灯亮多长时间是城市交通管理中最基本的一个问题。
直接利用限速行驶模型计算每辆车到达路口的时间,由数值结果可见,绿灯亮后汽车才开始以最高限速穿过路口的时在11秒以后,从第六辆车开始,以后的车都以最高限速穿过路口。
绿灯亮30秒通过路口的17辆车中有11辆汽车以最高限速穿过路口,如果绿灯只亮15秒,则在通过的7辆车中只有2辆车以最高的限速穿过路口。
显然,这样的交通灯控制策略对于路口的利用率是不高的。
如果利用限速行驶模型得到通过的车辆数对绿灯亮的时间长度的依赖关系n=n(t),即得到当绿灯亮t秒时,单向、单车道通过的车辆数,对进一步的研究更方便。
要写出这个分段函数,推导并不困难,虽然有些繁琐,但是在实际问题研究中找到显示表达函数的机会非常少。
借助计算机编程,利用输入输出表达函数关系常常是唯一可取的办法。
一个基本的想法是,在有限时间内只能通过有限车辆,只要计算出n辆车通过路口的时间,在用规定的红绿灯的时间长度作为卡尺,就可以确定通过的车辆数。
6、实验程序(Matlab或者其它软件语言陈述)
M文件:
functionm=pass(T)
k=50;t=zeros(1,k);
tt=solve('-(n-1)*7+(t-n)^2');
tt1=tt
(1);
ttt=solve('-(n-1)*7+5.5^2+11*(t-n-5.5)');
forn=1:
k;
t0=5.5+n;x=subs(tt1,n);
ifx>t0
t(n)=subs(ttt,n);
elset(n)=x;
end
end
m=max(find(t
二、图形做旧问题
一、实验题目
图形做旧:
二、题目重述
图像做旧是一种图像融合的方法,通过两个矩阵的加权求和来实现将图形做旧。
三、实验目的
数学建模是一种数学的思考方法,用数学的语言和方法,通过抽象、简化建立能近似刻画并“解决”实际问题的路径。
因此,建模一般具有明确的应用背景,针对性较强。
为了使所研究的模型有相当的普适性,能解决一类问题,就需要在模型确立之后,进一步分析推广,挖掘出模型更多的理论和实用价值。
四、实验内容
数值图像是一个函数,f:
Ω?
Rd,确切的说,是定义在矩形区域
的离散网格点(xi,yi)上的函数,称(xi,yi)为像素点,
zij=f(xi,yi)为像素值。
当d=1时,f为灰度图像,当d=3时,f为彩色图像。
五、实验结果分析与讨论
灰色图像就是一个矩阵Z=(zij)。
彩色图像就是3个矩阵,分别表示三个颜色(红、绿、蓝RGB),即三维数组表达。
为解决问题编写程序不仅需要熟悉应用软件的编译特点,而且要密切结合问题的背景,利用其数学特征,才有可能编写出有效程序。
六、实验程序(Matlab或者其它软件语言陈述)
>>loadmask;
>>mm=X;
>>loadface_mos;
>>nn=X;
>>mn1=0.5*mm+0.5*double(nn);
>>mn2=0.8*mm+0.2*double(nn);
>>subplot(2,2,1),imshow(mm,[]);subplot(2,2,2),imshow(nn,[]);subplot(2,2,3),imshow(mn1,[]);subplot(2,2,4),imshow(mn2,[]);
三、画分形树
一、实验题目
画分形树
二、实验问题陈述
数学的分形树是按一定规律构造的的具有自相似特征的集合图案,我们从一个线段生成一个分形树图案开始,学习几何最基本的元素点和直线的矩阵代数表达方式,教计算机绘图。
利用MATLAB指令画双分支树杈,对任意给定一节树段,在其三分之一点处长出一个树杈,向左偏离原树段300角,在其三分之二点处长出一个分叉,向右偏离原树段300角,树杈长度等于原树段的三分之一。
三、实验目的
数学建模是一种数学的思考方法,用数学的语言和方法,通过抽象、简化建立能近似刻画并“解决”实际问题的路径。
因此,建模一般具有明确的应用背景,针对性较强。
为了使所研究的模型有相当的普适性,能解决一类问题,就需要在模型确立之后,进一步分析推广,挖掘出模型更多的理论和实用价值。
4、实验内容
第1步
画一个点P(2.5,3).
>>u=[2.53];
>>plot(u
(1),u
(2),'*')
第2步
画两个点P1(2.5,3),P2(6.5,6)
>>u=[2.53;6.56];
>>plot(u(:
1),u(:
2),'*')
>>axis([2,7,2,7])
第3步
画两个点P1,P2及其连线上的中点。
因为任意两点P1(x1,y1)和P2(x2,y2)之间连线上的点Pα(xα,yα)可以表示为
即
其中0≤α≤1.特别的,当α=1/2时,Pα是连线上的中点。
所以画两个点连线中点指令为
>>u=[2.53;6.56];
>>p0=(u(1,:
)+u(2,:
))/2;
>>u=[u(1,:
);p0;u(2,:
)];
>>plot(u(:
1),u(;,2),'*-'),axis([2,7,2,7])
注意:
两个同阶矩阵相加等于对应元素相加,矩阵除以某数等于每个元素除以这个数
第4步
画一枝树杈。
任意给定一节树段,在其中点长出一个分叉,长度为原树段的一半,向左偏离原树段300角,记原树段起点为P1,终点为P2,中点为P0。
算法:
(1)将向量P1P2平移到原点,并缩小1/2,得到向量OP,P=(P1-P2)/2;
(2)将OP逆时针旋转π/6,再平移到P1与P2连线的中点P0=1/2P1+1/2P2,得到向量P0PL,PL=P0+PA,其中
是旋转变换矩阵;
(3)将P1,P0,PL,P0,P2依序连接起来。
MATLAB指令为:
>>u=[2.53;6.5 6];
>>v=(u(2,:
)-u(1,:
))/2;
>>A=[cos(pi/6) sin(pi/6);-sin(pi/6) cos(pi/6)];
>>lp=p0+v*A;
>>u=[u(1,:
);p0;lp;p0;u(2,:
)];
>>plot(u(:
1),u(:
2),'*-'),axis([2,7,2,7])
第5步
画一棵分形树。
假设树的生长是有规律的,按分杈点可以将树分成有限个树段,每个阶段每个树段必在且只在中点向一个固定方向,例如,向左偏离300,长出一枝新树杈。
新树杈的出现,使得树可以被分成更多的树段,进入下一阶段的生长。
在计算机上实现这个过程。
上一步已将一个树段变成一个树杈,这树杈由3个新树段构成。
为表达清楚,可以将上道例题的输出指令u=[u(1,:
);p0;p1;p0;u(2,:
))]改为u=[u(1,:
);p0;p0;lp;p0;u(2,:
))],
即将每个树段的起点和终点坐标都分别用矩阵u的奇数行和偶数行记录,3个树段由6个点表示。
下一步,在这3个树段的每段上都要长出一个分杈,即在每段上重复上一步的工作。
现将画一枝树杈的指令用函数文件branch.m表达,即
function u=branch(v,theta)
p0=(v(2,:
)+v(1,:
))/2;
v1=(v(2,:
)-v(1,:
))/2;
A=[cos(theta)sin(theta);-sin(theta)cos(theta)];
lp=p0+v1*A;
u=[v(1,:
);p0;p0;lp;p0;v(2,:
)];
只要输入树段端点v和将要长出分杈的偏离角度θ,就会输出长了一个分杈的树杈。
然后,重复执行调用branch.m画出所有树段生成的树杈,这个过程用用函数文件tree.w表达。
function w=tree(u,theta)
uuu=[];
for j=0:
(length(u)/2-1)
u0=u((2*j+1):
(2*j+2),:
);
uu=branch(u0,theta);
uuu=[uuu;uu];
end
w=uuu;
只要输入上阶段已有的树u和规定的树杈偏离角θ,就会输出长了更多树杈的树。
注意到,因为u记录了所有树段的起点和终点,所以树段总数是其行数的一半。
按这种想法,可以设计生长k0个阶段的分形树的算法。
算法
(1)k=0:
给定初始值u0,一个2行2列矩阵表示一根树干两端点的坐标给定参数θ表示树杈的生长角度
(2)第k阶段(k≤1);
(a)从上阶段的树uk-1截出树段vl;
(b)树段vl上长成一枝树杈,记为uul;
(c)依序将uul拼接,构成uk.
(3)如果k<k0,则k=k+1,重复
(2),否则结束运算。
下面指令分别画出了k=0,1,2......8阶段的分形树。
>> u=[0 0,0 1];
subplot(3,3,1),plot(u(:
1),u(:
2)),
axis([-0.5,0.5,0,1]);
for k=1:
8
w=tree(u,pi/6);
u=w;
subplot(3,3,k+1),plot(u(:
1),u(:
2)),
axis([-0.5,0.5,0,1])
end
如图所示,不论k多大,树杈越来越密,但是永远不会充满整个区域,这个特点可以利用MATLAB图形工具栏的放大镜看到。
于是,这棵树的树杈长度总和可无限增大,但是树杈占据的面积永远为0,这就是所谓的二维分形。
分形的一个重要特征是自相似,即局部是整体的相似形,通过图形放大镜可以展现这个特征。
标准的自相似分形数学对现实的抽象,实际分形的形体自相似性大多是统计意义上的。
如果画一棵每阶段在每段树段上长两个分杈的分形树,一个分杈向左,一个分杈向右,就会发现按章上面的思路构造的算法计算速度很慢。
可以在程序开始前加上指令tic,在结尾后加上toc,则程序运行完后会显示运行时间。
在下面的程序中,运,用矩阵运算替换了tree.m中的循环,可以提高运算速度。
>> tic
>> u=[0 0;0 1];
>> subplot(3,3,1),plot(u(:
1),u(:
2)),axis([-0.5,0.5,0.1]);
>> A=[cos(pi/6) sin(pi/6);-sin(pi/6) cos(pi/6)];
>>for k=1:
8
old=u;
s=length(old)/2-1;
diff=(old(2:
2:
end,:
)-old(1:
2:
end-1,:
))/2;
p1=(old(2:
2:
end,:
)+old(1:
2:
end-1,:
))/2;
p0=p1+diff*A;
u(1:
6:
6*s+1,:
)=old(1:
2:
end-1,:
);
u(2:
6:
6*s+2,:
)=p1;
u(3:
6:
6*s+3,:
)=p1;
u(4:
6:
6*s+4,:
)=p0;
u(5:
6:
6*s+5,:
)=p1;
u(6:
6:
6*s+6,:
)=old(2:
2:
end,:
);
subplot(3,3,k+1),plot(u(:
1),u(:
2)),
subplot(3,3,k+1),plot(u(:
1),u(:
2)),
axis([-0.5,0.5,0,1])
end
>>toc
5、实验结果分析与讨论
我们在编写程序画图时要从分析问题入手,改进算法。
如果利用分形的自相似特点,整体由局部构成,每个局部都是整体的相似形,通过改进算法,则有可能大大的缩短运算时间。