搜索
您的当前位置:首页正文

数学模型与数学建模实验三

来源:榕意旅游网
实验报告三

学院名称:理学院 专业年级: 姓 名: 学 号:

课 程:数学模型与数学建模 报告日期:2015年11月24日

一、实验题目

例1.3.1 继续研究十字路口红绿灯问题 十字路口绿灯亮灯30s,最多可以通过多少辆汽车?继续研究问题:十字路口绿灯亮ts,最多可以通过多少辆汽车nn(t)? 例 1.3.2 图像做旧

练习:改变融合比例,尝试其它做旧效果 例1.3.3 画分形树

二、实验目的

数学建模是一种数学的思考方法,用数学的语言和方法,通过抽象、简化建立能近似的刻画并“解决”实际问题的路径。因此,模型一般具有明确的应用背景,针对性较强。为了使所研究的模型有相当的普适性,能解决一类问题,就需要在模型确立之后,进一步分析推广,挖掘出模型更多的理论和实用的价值。

三、问题陈述

第一题

问题要求很明确,求解的关键是绿灯亮后,汽车才启动,加速是过路口,要确定在给定时间内能通过多少辆车,就要考虑汽车加速度,从停车位置到路口的路程以及城市行车的最高限速要求。 第二题

数值图像是一个函数,f:R4,确切的说,是定义在矩形区域R的离散网格点xi,yi上的函数,称xi,yi为像素点zijfxi,yi为像素值,当d1时,f为灰度图像,当d3时,f为彩色图像,所以灰度图像就是一个矩阵Zzij,彩色图像就是三个矩阵,分别表示三个颜色(红、绿、蓝RGB),即三维数组表达,图像做旧是一种图像融合的方法,可以通过两个矩阵的加权求和来实现。

需要强调的是,为解决问题编写程序不仅需要熟悉软件的变异特点,例如MATLAB的矩阵语言,而且要密切结合问题的背景,利用其数学特征,才有可能编写出有效的程序,下面以编写分形树的绘图为例,说明如何利用分形树的自相似特征,将需要运行十多分时间的程序改进为几秒就能实现的程序。

第三题

分形是对不规则的难以用传统欧式几何描述的几何图形,例如,海岸线和山川形状,多数分形图案的特点之一是从整体到局部的自相似性,从远距离观察,海岸线和山川形状是极不规则的;从近距离观察,其局部形状又和整体形态相似,数学的分形树是按一定规律构造

3的的具有自相似特征的几何图案。我们从一个线段生成一个分形树图案开始,学习几何最基本的元素“点”和“直线”的矩阵代数表达方式。

四、模型及求解结果

第一题

记在时刻t第n辆车的位置为Sn(t),用数轴表示车辆行驶道路,数轴的正向为汽车行驶方向,数轴原点为红绿灯的位置。于是当Sn(30)0时,表明在第30s第n辆车已通过红绿灯,否则,结论相反。于是,只要确定限速行驶模型Sn(t),就可以确定30s内通过的汽车数量n。在单向、单车道、直行、限速等假设下,在《数学模型与数学建模》中给出了这个模型:

Sn(0)a/2(tn*tn)2v(ttn*),ttn*, Sn(t)Sn(0)a/2(ttn)2,tnttn*,S(0),0tt.nn其中Sn(0)(n1)(LD)表示第n辆车在绿灯亮前的位置,tnn表示第n辆车的启动时间,参数驱车长L5m,车距D2m,tn*v*/atn表示第n辆车达到最大限速时间。加速度a2m/s,最大限速v*11m/s。可以得到结果,绿灯亮30s,该路口单向,单车道可以通过17辆车。

这里直接研究限速行驶模型的应用。确定十字路口绿灯亮多长时间是城市交通管理中最基本的一个问题。直接利用限速行驶模型计算每辆车到达路口的时间,有数值结果可见,绿灯亮后汽车开始以最高限速穿过路口的时间在11s以后,从第6辆车开始。以后的车都以最高限速穿过路口。绿灯亮30s通过路口17辆车中有11辆车以最高限速穿过路口,如果绿灯只亮15s,则在通过7辆车中只有两辆车以最高的限速穿过路口,显然这样的交通灯控制策略对于路口的利用率是不高的。

如果是利用限速行驶模型得到通过的车辆数对绿灯亮的时间长度的依赖关系nn(t),即得到当绿灯亮ts时,单向、单车道通过的车辆数,对进一步的研究更方便。要写出这个分段函数,推导并不困难,但是有些繁琐。但是在实际问题研究中找到显示表达式函数的机会非常少,借助计算机编程,;iyong输入输出表达函数关系常常是唯一可取的办法。下面以这个简单问题为例尝试一下。

一个基本的想法是,在有限时间内只能通过有限辆车,只要计算出n辆车通过路口的时间,再用规定的绿灯亮的时间长度为卡尺,就可以确定通过的车辆数。 算法

(1)计算每辆汽车达到最大限速时间t0,以加速度通过路口时间t1和以最大限速通过路口时间t2。

22 (2)比较t0和t1就可以确定这辆车实际通过路口的时间。

(3)将充分多辆车通过路口的时间列出来,(用find)确定通过路口时间小于绿灯亮的时间长度T的所有车号,其中最大者就是能够通过的车辆数,函数以pass.m文件名存储。 于是,只要输入T就会由函数pass(T)得到通过的车辆数。 第二题

1、图像做旧处理所得图像及其拉伸灰度级显示图像结果如下图所示:

上图 (图像做旧)左上为原双精度图,右上为整数型数据的得到的图像,左下为双精度整数型数据各50%的融合比例,右下80%的双精度数据与20%的整数型数据融合后的结果。 2、练习题:改变融合比例

上图 (改变融合比例)左上为原双精度图,右上为整数型数据的得到的图像,左下为40%的双精度数据与60%的整数型数据融合后的结果,右下90%的双精度数据与10%的整数型数据融合后的结果。

第三题

第(1)步:画一个点P(2.5,3)

12.5,3,P26.5,6 第(2)步:画两个点P

1x1,y1,P1x2,y2之1,P2及其连线上的中点,因为任意两点P第(3)步:画两个点P间的连线上的点

Px,y可以表示为

xx11x2yy11y2PP1P12,即: 

P其中01,特别地,当1/2时,是连线上的中点。

注意:两个同阶矩阵相加等于对应元素相加,矩阵除以某数等于每个元素除以这 个数。

第(4)步:一枝树杈,任意给定一节树段,在其中点长出一个分杈,长度等于原树段长的一半,向左偏离原树段30°角,记原树段起点为P1,终点为P2,中点为 算法:

1P2平移到原点,并缩小1/2,得到向量①将向量PP0,如图:

P2P1P0OP,

PP2P1/2

②将

OP1与P2连线的中点逆时针旋转π/6,再平移到PP01/2P11/2P2,得到向量

P0PL,PLP0PA,其中

cos/6sin/6Asin/6cos/6

是旋转变换矩阵;

1,③将PP0,PL,P0,P2依序连接起来。

第(5)步:画一棵分形树。假定树的生长是有规律的,按分杈点可以将树分成有限个树段,每个阶段每个树段必在且只在中点向一个固定方向,例如,向左偏离30°,长出一枝新树杈,新树杈的出现,使得树可以被分为更多的树段,进入下一阶段的生长,在计算机上实现这个过程,上一步已将一个树段变为一个树杈,这树杈由3个新树段构成,为表达清楚,可将上题的的输出指令

u=[u(1,:);p0;Ip;p0;u(2,:)] 改为

u=[u(1,:);p0;p0;lp;p0;u(2,:)]

即将每个树段的起点和终点坐标都分别用矩阵u的奇数行和偶数行记录,3个树段由6个点表示。下一步,在这3个树段的每段上都要长出一个分杈,即在每段上重复上一步工作,为编写代码简洁,先将画一枝树杈的指令用函数文件branch.m表达。

只要输入树段断电坐标v和将要长出分杈的偏离角度,就会输出长了一个分杈的树杈,然后,重复执行调用branch.m画出所有树段生成的树杈,这个过程用函数文件tree.m表达

只要输入上阶段已有的树u和规定的树杈偏离角,就会输出长了更多树杈的树。注意到,因为u记录了所有树段的起点和终点,所以树段总数是其行数的一半。按这种想法,可以设计生长算法

k0个阶段的分形树的算法。

u①k0:给定初始值0,一个2行2列矩阵表示一根树干两端点的坐标,给定参数表示

树杈的生长角度。 ②第k阶段(k1): a.从上阶段的树

luk1截出树段vl;

l b.树段v上长成一枝树杈,记为uu;

c.依序将uu拼接,构成③如果k<

luk

k0,则k=k+1,重复②,否则结束运算。

以下分别画出k=0,1,...,8阶段的分形树。

如图,注意到,不论k多大,也就是不管迭代多少次,树杈越来越密,但是永远不会充满整个区域,这个特点可以利用Matlab同性工具栏的放大镜看到。于是,这棵树的树杈长度综合可无限增大,但是树杈占据的面积永远为零,这就是所谓的二维分形。分形的一个重要特征就是自相似,即局部是整体的相似形,通过图形放大镜可以展现这个特征。标准的自相似分形是数学对现实的抽象,实际分形的形体自相似性大多是统计意义上的。

如果画一颗每阶段在每段数段上长两个分叉的分形树,一个分叉向左,一个分叉向右,就会发现按照上面的思路够早的算法计算速度很慢。可以在程序开始前加上指令tic,在结尾后加上toc,则程序运行完后会显示运行时间。如果你意识到所编的程序运行很慢,需要改进程序,就要注意学习Matlab变成的规范和技巧。例如在下面的程序中,运用矩阵运算替换了tree.m中的循环,可以提高运算速度。 改进后的图:

五、程序代码

第一题

pass.m文件代码

function m=pass(T)

k=50;t=zeros(1,k); %计算k=50辆车,每辆汽车通过路口时间将记录在t中. tt=solve('-(n-1)*7+(t-N)^2'); %此一元二次方程的2个解中的第1个为正. tt1=11(1); %第n辆车以加速度通过路口时间tt1(n). ttt=solve('-(n-1)*7+5.5^2+11*(t-n-5.5)'); %第n辆车以最大限速通过路口时间ttt(n)。 for n=1:k;

t0=5.5+n;x=subs(tt1,n);

if x>t0 %第n辆车以加速度行驶未达到路口前已达到最大限速. t(n)=subs(ttt,n); %它一定以最大限速通过路口. else t(n)=x; %否则,它以加速度过路口. end end

第二题

图像做旧的程序代码

>> load mask;%读取MATLAB本身附带的索引图mask,自动存为x >> mm=X;%mm数据类型是双精度double,数值在(0,1)中

>> load face_mos;%读取MATLAB本身附带的索引图mask,自动存为X >> nn=X;%nn数据类型是整数型,数值去0到255

>> 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,[]);%[]作用是拉伸灰度图示图像

第三题

第(1)步:画一个点P(2.5,3)

u=[2.5 3];%用1行2列矩阵表示一个点的坐标

plot(u(1),u(2),'*')%画点,横坐标在前,纵坐标在后,用*号显示

12.5,3,P26.5,6 第(2)步:画两个点P>> u=[2.5 3;6.5 6];%用两行两列矩阵表示两个点的坐标

plot(u(:,1),u(:,2),'*')%矩阵第一列u(:,1)表示横坐标,第二列u(:,2)表示纵坐标 axis([2,7,2,7])%给定横坐标范围[2,7],纵坐标范围[2,7]

1,P2及其连线上的中点。 第(3)步:画两个点Pu=[2.5 3;6.5 6];

p0=(u(1,:)+u(2,:))/2;%在取中点

u=[u(1,:);p0;u(2,:)];%在原点u中间添入中点坐标 plot(u(:,1),u(:,2),'*-'),axis([2,7,2,7]) 第(4)步:

u=[2.5 3;6.5 6];

v=(u(2,:)-u(1,:))/2;%v表示经平移、缩小后的向量OP的终点坐标 A=[cos(pi/6) sin(pi/6);-sin(pi/6) cos(pi/6)] A =

0.8660 0.5000 -0.5000 0.8660

>> Ip=p0+v*A;%Ip表示经旋转、再平移后的向量P_OP_L的终点坐标 u=[u(1,:);p0;Ip;p0;u(2,:)];

plot(u(:,1),u(:,2),'*-'),axis([2,7,2,7]) 第(5)步

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,:)]; end

tree.m文件代码

function w=tree(u,theta) uuu=[];

for j=0;(length(u)/2-1)%Ê÷¶Î×ÜÊýÊÇuÐÐÊý£¨³¤¶È£©µÄÒ»°ë¡£

u0=u((2*j+1):(2*j+2),:);%ÒÀ´ÎÈ¡¾ØÕóuµÄÁ½Ðй¹³ÉÒ»¸öеģ¨Ê÷¶Î£©¾ØÕóu£¨£©

uu=branch(u0,theta);%µ÷ÓÃÉú³ÉÊ÷è¾µÄ×Ó³ÌÐò£¬Éú³ÉÒ»Ö¦Ê÷è¾ uuu=[uuu;uu];%ÒÀÐò¼Ç¼ËùÓÐÊ÷è¾ end

w=uuu;%µÃµ½±¾½×¶ÎеÄÊ÷¡£ end

分形树代码 >> clear

u=[0 0;0 1];

subplot(3,3,1),plot(u(:,1),u(:,2)),%逐行逐列画出3行3列9幅图,先将u对应的图放在第1位。

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)),%将第k阶段生长的树放在第

k+1位

axis([-0.5,0.5,0,1]) end ans = 0 ans = 2 ans = 2 ans = 2 ans = 2 ans = 2 ans = 2 ans = 2

改进方法 >> clear 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(1:2:end,:);

subplot(3,3,k+1),plot(u(:,1)),axis([-0.5,0.5,0,1]) end toc

Elapsed time is 0.190145 seconds.

因篇幅问题不能全部显示,请点此查看更多更全内容

Top