实验设计四交通事故分析Word格式.docx
《实验设计四交通事故分析Word格式.docx》由会员分享,可在线阅读,更多相关《实验设计四交通事故分析Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
直线1的截距(b1)
直线2的斜率(m2)
直线2的截距(b2)
事。
。
。
故。
数。
量
车辆密度(每100m的车辆数量)
图4-1事故数量与车辆密度的关系
3.课程设计要求:
(1)问题描述
对于特定长度的高速公路,公路上的车辆密度(每100米车辆的数目)与事故发生的数量有关。
一般认为,事故的数量随某一点的车辆密度的增加而增加。
然而,当车辆密度超过某一特定值时,由于拥挤,车辆平均速度下降,事故的数量也随之下降。
为了预测事故发生频率,并帮助改进高速公路设计,我们希望由观测数据来推导车辆密度及事故数量之间的关系。
(2)解决方案
在此给出最佳直线的斜率及截距的方程。
n=numberofpoints
c=∑i=1nxi
d=∑i=1nyi
e=∑i=1nxi2
f=∑i=1nyixi
注意,c为所有数据点的x坐标值的和,d为所有数据点的y坐标值的和。
变量e为x坐标值的平方和,f为数据点的xy积的和。
最佳直线的斜率(m)和截距(b)为:
m=(nf-cd)/(ne-c2)
b=(de-cf)/(ne-c2)
(3)具体示例
12月份数据如表4-1所示。
利用该数据进行计算。
表4-112月份的数据
数据点
车辆密度(x)
事故数量(y)
1.4
3
1
2.0
6
2
2.3
4
4.5
7
6.2
10
5
6.7
15
7.0
11
8.5
18
8
9.0
13
9
12.7
17
13.1
17.7
16
12
18.5
20.3
注意,事故数量的最大值为18(在第7个点)。
因此,我们用点0-7来创建第一条直线,用点7-13来创建另一条直线。
对于第一条直线:
c=sumofthexvalue=1.4+2.0+…+7.0+8.5=38.6
d=sumoftheyvalue=3+6+…+11+18=74
为获取e的值,将x值的平方求和:
e=1.42+2.02+…+7.02+8.52=236.08
为了获取f的值,首先求每x,y的积,然后求和:
f=1.4(3)+2.0(6)+…7.0(11)+8.5(18)=449.4
对于第二条直线:
c=8.5+9.0+…+18.5+20.3=99.8
d=18+13+…+11+5
e=8.52+9.02+…+18.52+20.32=1553.78
f=8.5(18)+9.0(13)+…18.5(11)+20.3(5)=1270.6
将这些值带入给出的求m及b的方程:
m1=1.853
b1=0.3087
m2=-0.6403
b2=22.70
这样,最佳直线y=mx+b的方程为:
直线1:
y=1.853x+0.3087从x=1.4到x=8.5
直线2:
y=-0.6403x+22.70从x=8.5到x=20.3
(4)类及对象
程序分析:
首先,在交通事故分析中,分为事故数据(Traffic)的计算类及线形衰减(Linear_regress)类两部分。
其次,类应该由什么组成。
如:
Traffic类由数据点组成。
另外,我们需要事故数量最大值的数组下标及数据点的数量。
函数成员应能通过读输入文件来初始化这些数据、
找出事故数量最大值的数组下标,并且与Linear_regress类交互以获得两条直线。
Linear_regress类需知道它使用的点的数量,它需访问这些被计算的点,它需要通过这些点的线的数据。
所以,其数据成员应为数据点(或数据点数组的起始地址)、数据点的数据及创建的直线的斜率和截距。
在此,Linear_regress类仅需要由数据创建最佳直线,为简单起见,我们仅使用一个函数成员。
注意,这些数据使用了点和直线。
在程序application4.cpp中,我们描述了简单的仅包含数据成员的Point及Line结构。
在这个程序中,我们将其用作类,这意味Point及Line对象可作为Linear_regress及Traffic的数据成员。
第三,这些数据应如何交互?
Linear_regress类包含类型为Line的普通数据成员,及可被Traffic用来执行衰减的成员函数。
Traffic包含Point类型的数组,及指向Linear_regress类对象的指针。
4.实验条件:
(1)主要设备:
586或更高机型,256MB或更高的内存,40G或更大的硬盘。
(2)主要软件:
①操作系统可为Windows9X、WinMe、Win2000或更高版本等;
②开发环境为VC++6.0或者TC++3.0。
(3)参考书目:
①C++课堂教学与编程演练作者:
(美)奥瑞兹(DOrazio,T.B)著,侯普秀译清华大学出版社
②《数据结构及应用算法教程》严蔚敏等编著清华大学出版社2001年2月第1版
5.实验方法与步骤:
实验界面:
(1)使用内置的数据:
课设中提供的数据
显示如上图;
(2)使用手动输入:
结果为:
6.实验总结:
通过这次课设的实验,学会了cout中的精度的控制,并且对于c++stl中的vector容器的概念有了一定的了解,并且对于面向对象的操作有了很深的领悟!
附录:
代码如下:
#include<
iostream>
string>
#include<
algorithm>
vector>
cmath>
iomanip>
usingnamespacestd;
structpoint//点的结构体
{
floatx;
inty;
};
boolcmp(pointa,pointb)//判断函数
returna.x<
b.x;
}
boolcmp1(pointa,pointb)//判断函数
returna.y<
b.y;
structlr//直线的结构体
floatm,b;
classtraf//具体的分析类
private:
vector<
point>
pp;
intn,d;
floatc,e,f;
lr>
linder;
public:
traf(vector<
p)
{
pp=p;
}
voiddeal()
d=0;
c=0;
e=0;
f=0;
n=0;
sort(pp.begin(),pp.end(),cmp);
//排序函数
vector<
:
iteratorir=max_element(pp.begin(),pp.end(),cmp1);
//找出最大值的点
cout<
<
"
最大点:
(*ir).x<
"
(*ir).y<
endl;
----------------------------------------"
for(vector<
iteratorip=pp.begin();
ip!
=ir+1;
ip++)
{
n++;
c+=(*ip).x;
d+=(*ip).y;
e+=pow((*ip).x,2);
f+=((*ip).x*(*ip).y);
}
lrlr1;
lr1.m=(n*f-c*d)/(n*e-c*c);
lr1.b=(d*e-c*f)/(n*e-c*c);
linder.push_back(lr1);
iteratorip=ir;
=pp.end();
voiddisplay()
iteratorio=linder.begin();
io!
=linder.end();
io++)
cout<
斜率:
fixed<
setprecision(4)<
(*io).m<
截距:
(*io).b<
直线方程为:
y="
x+"
------------------------------"
classoperate
pt;
operate(vector<
xx)
pt=xx;
voidprint()
inty,k,i,o;
floatx;
pointpn;
/*vector<
*/
boolmybool=true;
pointpi[14]={1.4,3,2.0,6,2.3,4,4.5,7,6.2,10,6.7,15,7.0,11,8.5,18,9.0,13,12.7,17,13.1,15,17.7,16,18.5,11,20.3,5};
do
pt.clear();
co