版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汽车信号、系统与Py
thon基础汽车信号处理与系统仿真:基于Python的算法与工程实践授课对象车辆工程专业总学时安排共计4学时本章学习目标与课程大纲▍
学习目标
Lear
ning
Objectiv
es理解基本概念掌握汽车信号、数字信号处理及系统建模的基本概念。掌握编程基础熟悉Python环境配置、核心语法及自定义函数定义。学会核心工具熟练使用NumPy进行数值计算和Matplotlib进行数据可视化。实践数据处理能够独立导入、清洗并可视化常见格式的汽车试验数据。0103▍
课程大纲
Cour
se
Sy
llabus汽车信号与系统基础理论信号分类、采样定理、线性时不变系统模型
Python
环境与基础语法 02 环境搭建、变量与数据类型、逻辑控制与函数定义科学计算与数据可视化实战
NumPy
数组运算、Matplotlib
绘图与汽车数据综合处理课程导入:为什么要学习本章?汽车工程的数字化趋势现代汽车开发高度依赖试验与测试。从车辆振动、噪声到底盘性能,海量的试验数据是评价、改进和优化车辆性能的核心依据。核心挑战如何从海量、复杂的试验数据中高效、准确地提取有用信息?这需要我们掌握扎实的数据处理理论与高效的分析工具。数据的价值试验数据不仅能揭示车辆潜在问题,也是系统建模与仿真分析的基础,能显著加速产品迭代,缩短研发周期工具选择:Py
thon作为一门开源、易学且拥有强大科学计算库的编程语言,Python已成为汽车工程领域进行数据分析、机器学习和系统建模的主流工具。汽车信号与系统基础理论什么是信号?
——
从物理世界的连续模拟,到数字世界的离散量化模拟信号
(Analog
Signal)核心定义:在时间和幅值上都呈现连续变化特性的信号,直接反映物理量的自然状态。典型示例:发动机运转时的实时振动波形、扭矩变化、车内环境温度变化等。主要局限:波形直观但极易受电磁干扰失真,且无法直接被ECU等数字逻辑电路识别与计算。数字信号
(Digital
Signal)核心定义:对连续的模拟信号进行“采样”与“量化”处理后,仅用有限个离散数值经量化后以0和1来表示的,计算机可识别的信号形式。关键桥梁:通过模数转换
(ADC,
Analog-to-Digital
Conv
er
sion)将物理世界的模拟量转化为计算机系统可处理的数字代码,是车载智能计算和试验信号处理的基础。汽车试验场景及测试信号数字信号处理流程与优势▌
数字信号处理流程利用计算机算法对数字信号进行整形、滤波、分析和建模。一个典型的流程包含:信号滤波
→
信号分析
→
系统建模。例如在分析发动机噪声时,通常先做频域分析,再进行滤波去噪,最后完成建模与深入分析。灵活性无需专用硬件,仅通过软件算法即可将通用计算机转化为高性能的信号处理系统。稳定性数字信号仅由“0”和“1”组成,传输与处理过程不受环境温度、湿度及电磁干扰的影响。易修改通过修改程序代码即可灵活、实时地改变信号处理算法,快速适应不同的应用场景需求。高性价比随着半导体与芯片技术的飞速发展,数字信号处理芯片(DSP)的性能大幅提升,同时成本显著降低什么是系统?——从物理到模型01
/
系统的定义钱学森定义:由相互作用、相互依赖的若干组成部分结合而成的,具有特定功能的有机整体。工程视角:一个抽象的数学模型,用于描述真实物理系统的行为特征。核心三要素:系统本体
·
外部环境
·
系统边界02
/
系统建模定义:利用系统模型来代替真实的硬件系统进行分析、设计与验证,是连接理论与实践的桥梁。低成本投入显著降低研发与物理试验成本高安全保障可安全模拟极端工况与故障场景强可重复性实验过程可重复环境参数可复现汽车系统实例分析核心系统对象:正在道路上行驶中的车辆整体。这是我们分析和控制的主体。系统输入控制量:驾驶员通过控制油门踏板,从而改变发动机输出的转矩。系统输出观测结果:车轮的最终转速,直观表现为仪表盘上的“车速”。外部干扰不可控因素:道路坡度的变化、空气阻力(风阻)以及电磁信号干扰等。系统控制逻辑:驾驶员持续观测输出(车速),主动调整输入(油门)来补偿外部干扰,最终维持车辆在“期望车速”下稳定行驶。系统理论的三个基本问题仿真问题(直接问题)已知:系统属性和输入求解:系统的输出响应应用场景:预测车辆在特定工况(如加速、转弯)下的性能表现,辅助前期设计验证。控制问题(逆问题)已知:系统属性和期望输出求解:需要施加的控制输入应用场景:设计车辆控制策略,如自适应巡航控制(ACC)、车道保持辅助,实现车辆的自动化与智能化驾驶。系统识别问题(建模问题)已知:系统的输入与输出数据求解:系统的结构和关键参数应用场景:通过真实的车辆试验采集数据,建立高精度的车辆动力学仿真模型,作为后续仿真与控制的基础。Py
thon环境与基础语法TheBest
Language?ForData&Engineering,
Yes!开源免费无需昂贵的授权费用,极大降低个人学习与企业开发的成本门槛。语法简洁代码可读性极强,类英语的书写风格,让初学者能快速上手编写程序。丰富的库拥有NumPy、SciPy等海量成熟库,可快速实现科学计算与数据分析。广泛应用在汽车研发、人工智能、Web开发等热门领域均有极高的市场占有率。Py
thon开发环境IDE---integrateddev
elopmentenv
ir
onmentIDLE:Python自带的轻量级集成开发环境,界面简洁直观,零配置上手,非常适合编程入门。PyCharm
/
VS
Code:功能丰富的第三方专业IDE,支持智能补全、断点调试等高级功能,是项目开发的首选。两种运行方式交互式
(IDLEShell):输入一行代码即刻得到结果,所见即所得,非常适合语法学习和代码片段调试。脚本式
(编辑器):将所有代码逻辑写在一个或多个
.py
文件中,统一批量执行,是企业级项目开发的标准方式。数据结构:列表
(List)01
/
定义与核心特性simple_list=[1,2,3,4,5]#
用方括号
[]定义有序
&
可变:元素按插入顺序排列,支持随时增删改。异构存储:可同时存放整数、字符串、甚至嵌套列表等多种类型。索引访问:simple_list[0]
→
1
(首元素)
|
simple_list[-1]
→
5(尾元素)02
/适用场景对比Py
thon
列表通用性强,适合存储文本、对象等异构数据,但数值计算性能一般。NumPy
数组
(重点)专为数值计算优化,支持向量化运算,是数据科学的“主力军”。创建数值列表列表非常适合用于存储数字集合,而Python提供了很多工具,可帮助你高效地处理数字列表。使用函数
range()函数range() 能够轻松地生成一系列的数字,但需要注意的是数字范围是左闭右开的。例如:for
value
in
range(1,5) ,将生成1,2,3,4共4个value列表元素!使用range()创建数字列表使用函数list()可将range()的结果直接转换为列表例如:numbers
=
list(range(1,6)) numbers=[1,2,3,4,5]Numbers=list(range(start,end,
step))创建数值列表的句法squares=
[]forvalueinrange(1,11):square=value**2squares.append(square)print(squares)squares=
[]forvalueinrange(1,11):squares.append(value**2)print
(squares)[1,4,9,16,25,36,49,64,81,
100]squares=(value**2forvaluein
range(1,11))print(list(squares)最简单,明了!列表解析列表解析将for循环和创建新元素的代码合并成一行,并自动附加新元素squares=[value**2forvaluein
range(1,11)]要使用这种语法,首先指定一个描述性的列表名,如squares;然后,指定一个左方括号, 并定义一个表达式,用于生成你要存储到列表中的值。在这个示例中,表达式为value**2,它计
算平方值。接下来,编写一个for循环,用于给表达式提供值,再加上右方括号。要创建自己的列表解析,需要经过一定的练习,但能够熟练地创建常规列表后,你会发现这样做是完全值得的。当你觉得编写三四行代码来生成列表有点繁复时,就应考虑创建列表解析了。使用列表的一部分处理列表的部分元素——Python称之为切片要创建切片,可指定要使用的第一个元素和最后一个元素的索引例:players=[‘charles’,‘martina’,‘michael’,‘florence’,‘eli’]---- 原始列表players[0:3] ----- ['charles','martina',
'michael’]players[1:4] ----- ['martina','michael',
'florence’]players[:4]-----[‘charles’,‘martina’,‘michael’,
‘florence’]--
不指定起始索引,将从开头开始提取players[2:] -----['michael','florence',
'eli’]返回从第3个元素到列表末尾的所有元素players[-3:] ----- ['michael',
'florence',
'eli’] 负数索引返回离列表末尾相应距离的元素,因此你可以输出列表末尾的任何切片Py
thon核心语法入门:循环与判断▍
示例:计算一个整数的所有因数#
获取用户输入b=int(input("Pleaseenteroneinteger
number:"))#
条件判断:检查输入是否为正整数Ifb>
0:#
#For循环:遍历1到b的所有整数foriinrange(1,
b+1):#
条件判断:判断是否为因数ifb%i==
0:print(i)else:print("Pleaseenteronepositive
number.")`f
or
`
循环重复执行特定代码块,常用于遍历序列或实现固定次数的重复操作。`if-else`
条件判断根据布尔表达式的结果,决定程序的执行路径,实现逻辑分支。
缩进
(Indentation)Python
特有的语法规范,使用空格缩进来区分代码块,替代大括号,强调代码可读性。列表的操作---遍历整个列表你经常需要遍历列表的所有元素并对每个元素执行相同的操作。例如:(1)对于包含数字的列表,可能需要对每个元素执行相同的统计运算;(2)在游戏中,可能需要将每个界面元素平移相同的距离;需要对列表中的每个元素都执行相同的操作时,可使用Python中的for循环!magicians=['alice','david',
'carolina’]formagicianin
magicians:print(magician)这段代码让Python从列表magicians中取出一个名字,并将其存储在变量magician中。最后,我们让Python打印前面存储到变量magician中的名字。这样,对于列表中的每个名字,Python都将重复执行打印过程列表的操作
---
深入地研究循环循环的概念很重要,因为它是让计算机自动完成重复工作的常见方式之一for
循环---
对列表中的每个元素,都将执行循环指定的步骤,而不管列表包含多少个元素;---
对于用于存储列表中每个值的临时变量,虽可指定任何名称,但是采用能够描述列表中单一元素有意义的名称,对程序的易读性和整洁性大有裨益例如:forcat
in
cats:fordogin
dogs:这些命名约定有助于你明白for循环中将对每个元素执行的操作。使用单数和复数式名称,可帮助你判断代码段处理的是单个列表元素还是整个列表。列表的操作
---
在for循环中执行更多的操作在for循环中,想包含多少行代码都可以,但是必须具有相同的缩进!每个缩进的代码行都是循环的一部分,且将针对列表中的每个值都执行一次。因此,可对列表中的每个值执行任意次数的操作。列表的操作
---
在for循环结束后执行一些操作在for循环后,通常需要提供总结性输出或接着执行程序必须完成的其他任务,以没有缩进的代码行来跳出循环(或利用break语句)在for循环后面,没有缩进的代码都只执行一次,而不会重复执行使用for循环处理数据是一种对数据集执行整体操作的不错的方式。例如,你可能使用for循环来初始化游戏——遍历角色列表,将每个角色都显示到屏幕上;再在循环后面添加一个不缩进的代码块,在屏幕上绘制所有角色后显示一个Play
Now按钮。条件测试编程时经常需要检查一系列条件,并据此决定采取什么措施。在Python中,if语句让你能够检查程序的当前状态,并据此采取相应的措施每条if语句的核心都是一个值为True或False的表达式,这种表达式被称为条件测试。Python
根据条件测试的值为True还是False来决定是否执行if语句中的代码。如果条件测试的值为True,
Python就执行紧跟在if语句后面的代码;如果为False,Python就忽略这些代码检查是否相等:car
=
=
'bmw’解读为“变量car的值是'bmw'吗?”检查是否不相等:car
!=‘bmw’解读为“变量car的值不是'bmw'吗?”需注意的是,在Python中,对字符串的“相等”与否的条件测试区分字母的大小写。两个大小写不同的字符串会被视为不相等!如果大小写无关紧要,而只想检查字符串变量是否相等,可将变量的“值”(字符)转换为小写(调用方法lower()),再进行比较注意:函数lower()不会修改存储在变量中的值,只是将其字母改为小写形式,因此进行这样的比较时不会影响原来的变量值假设你有一个汽车列表,想将其中每辆汽车的名称打印出来。对于大多数汽车,都应以首字母大写的方式打印其名称,但对于
‘bmw’(宝马)汽车,应以全大写的方式打印。应该怎样解决这个问题呢?这个问题中有一个逻辑判断,即当打印到“宝马”汽车时,需要将列表中的字符bmw转换成大写格式,对其他汽车品牌则首字母大写。写成逻辑判断语句就是:如果汽车名是宝马(这个条件为真),则全部字母大写打印,否则(条件为假),首字母大写打印相应的代码如下:cars=['audi','bmw','subaru','toyota']forcarincars:ifcar==
'bmw':print(car.upper())else:print(car.title())汽车品牌列表对列表进行遍历判断是否是bmw为真时,大写打印判断是否是bmw为假时,首字母大写打印检查多个条件有许多情况,可能需要同时检查多个条件,例如,有时候需要在两个条件都为True时才执行相应的操作,
而有时候则只要求一个条件为True时就执行相应的操作。在这些情况下,逻辑运算符and
和
or
可助你一臂之力例如,李明想去商场购买一双40码的黑色运动鞋,可用伪代码的形式表示为:ifsize=40andcolor=
‘black’:liming.purchase()再例如,如果李明想购买一双运动鞋,李宁牌和安踏牌都可以,用伪代码表示为:if brand1
=
‘李宁’or brand2
=
‘安踏’:liming.purchase()逻辑运算符“与”、“或”、“非”
---
and,or,notifaandb: ----- a和b条件都为真,执行下一语句ifa
or
b: -----
a条件和b条件任何一个为真时,执行下一语句ifa
not
True ----
如果条件a
不为真,执行下一句检查特定值是否包含在列表中要判断特定的值是否已包含在列表中,可使用关键字in例:判断蘑菇是否在做披萨的调料中,可按以下条件语句进行判断requested_toppings=['mushrooms','onions',
'pineapple’]'mushrooms'in
requested_toppings输出结果是:True这种技术很有用,它让你能够在创建一个列表后,轻松地检查其中是否包含特定的值如果检查某个特定值不在列表中,仅需将“in”换成“not
in”就行了模块化编程:函数
(Function)01
/
定义与结构函数是带有特定名字的一组代码块,旨在执行特定任务。它是组织代码、减少冗余的基本单元。def
函数名(参数1,
参数2):"""文档字符串:
描述功能"""#
函数体:
具体执行逻辑命令行1命令行2return
返回值02
/
核心优点代码复用
(R
eusability
)一次定义,多次调用,避免重复造轮子,提升开发效率。逻辑清晰
(Clar
ity
)将庞大复杂的系统拆解为多个单一职责的小模块,降低认知负荷。便于维护(Maintainability
)一处修改,全局生效。隔离错误,让调试与升级更加容易。03
/
代码实战示例封装“寻找正整数因数”的逻辑,实现功能复用:定义函数关键字def
告知
Python你定义了一个函数函数以def
开头,接着是函数名,函数名之后是一对小括号,以冒号(:)结束需要注意的是,在学习函数的初始阶段,括号内是空的,今后这里面会添加多个参数在函数定义语句之后的所有缩进行构成了函数体调用函数,只需在主程序中列出函数名(必要时传递参数)即可defgreet_user():"""显示简单的问候语"""print("Hello!")greet_user()最简单的一个函数示例函数定义、函数名、小括号函数体函数的调用向函数传递信息只需稍作修改,就可以让函数greet_user()不仅向用户显示Hello!,还可将用户的名字打印出来为此,可在函数定义def
greet_user()的括号内添加username参数defgreet_user(
username):"""显示简单的问候语"""print(“Hello,”+username.title()+
“!”)greet_user(‘Jesse’
)Hello,
Jesse!实参和形参在前面的修改程序中,函数greet_user(username),要求在调用该函数时,赋予参数username一个具体值。在此,称之为“形参”代码greet_user(‘Jesse’)执行函数greet_user()的调用,并且将参数‘Jesse’传递给形参username。向函数传递的参数,称之为“实参”。实参是调用函数时传递给函数的信息注意:大家有时候会形参、实参不分,因此如果你看到有人将函数定义中的变量称为实参,将函数调用中的变量称为形参,不要大惊小怪默认值编写函数时,可根据任务,给每个形参指定默认值。当调用函数时,如果有实参传递给形参,则使用实参值,否则就使用形参的默认值。这样在给形参指定默认值后,可在函数调用中省略相应的实参。使用默认值可简化函数调用,还可清楚地指出函数的典型用法。但需注意,默认值需要放在所有形参的后面!即必须先列出没有默认值的形参,再列出有默认值的实参。返回值函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。在函数中,可使用return语句将值返回到调用函数的代码行返回简单值调用返回值的函数时,需要提供一个变量,用于存储返回的值示例:
musician
=
get_formatted_name('jimi',
'hendrix’)返回字典函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。科学计算与可视化基础NumPy数值计算的核心▌
定义:Numerical
Python,是
Python
生态中开源的高性能数值计算扩展库。▌
核心优势:提供多维数组
(ndarr
ay
),为海量试验数据提供高效、紧凑的存储结构,同时支持向量化运算,大幅提升计算速度。Matplotlib数据可视化工具▌
定义:Python
中最经典、使用最广泛的绘图库,被称为
Python
的
“绘图大师”。▌
核心作用:将枯燥的数字矩阵转化为直观的折线图、柱状图、散点图、热力图等,帮助研究人员快速发现数据规律,并高效展示分析成果。Numpy数组介绍和基本操作汽车试验数据分析及科学计算的基石01.
Numpy
数组:定义与生成什么是
Numpy
数组?Numpy
数组,即
ndarray,是一个多维、同质的数据容器,是科学计算的核心数据结构。多维:支持
1
维向量、2
维矩阵及高维张量。同质:数组内所有元素类型相同,实现了高效的内存存储和快速计算。关键属性ndim:
数组的维度shape:各维度的大小dty
pe:元素的数据类型size: 元素的总个数生成数组1.从列表转换:`np.array([1,2,3])`2.内置函数:`np.zeros()`,`np.ones()`,
`np.arange()`,`np.random.rand()`NumPy
数组基础操作01
创建数组通过
np.array()
快速创建一维或多维数组,是存储试验数据的首选容器。importnumpyas
np#
一维数组:存储车速数据speed_data=np.array([30.2,32.5,35.1,
33.8,36.4,
38.0])#二维数组:存储3个测点的振动数据vibration=np.array([[1.2,1.5,1.3],[0.8,0.9,1.0],
[2.1,2.3,2.2]])02
索引与切片使用类似
Python
列表的索引语法,快速定位并提取特定位置的数据。
例如,vehicle_speed[1],将提取出数组vehicle_speed中的第2个元素;vehicle_speed[4],将提取出数组中的第5个元素。方括号中的数字,称为数组的下标索引,起始值为0,故第一个元素为“0”,若有N个元素,则最后一个元素索引为“N-1”#获取第2个速度值
(索引从0开始)print(speed_data[1])#
输出:
32.5#获取测点2的所有数据(第2行,所有列)print(vibration[1,
:])#
输出:[0.8
0.9
1.0]NumPy
数组基础操作:向量化运算03向量化运算
(Vector
ization)无需编写循环即可对数组所有元素并行操作。代码更简洁,且底层由C语言实现,运算速度远快于Python原生循环。例如,前述车速数组中的速度元素的单位是千米/小时,如果要将单位转换成米/秒,仅需要执行vehicle_speed/3.6即可,非常方便。此外,两个相同维度的数组可以使用“+”号(即算数中的加法运算),就可将对应元素进行求和得到新的数组。#
单位转换:
km/h
->
m/s(广播机制)speed_mps=speed_data/
3.6#信号叠加:原始振动信号+噪声信号noise=np.array([0.1,0.2,0.15])vibration_total=vibration_data[0,:]+
noise04矩阵运算
(Matr
ix
Oper
ations)原生支持线性代数运算。Numpy提供的dot函数,可以非常
便捷地给出矩阵和数组的相乘运算。这个特性在试验信号处理中特别有用。例如,假设我们有两个2维数组(也即矩阵)A和B:以下程序指令,将给出以上两个矩阵的乘法运算:A=
np.array([[1,2,3],[1,2,3],[1,2,3]])B=
np.array([[1,2,3,4],[2,2,2,2],[3,3,3,3]])print(“矩阵的相乘:”,
np.dot(A,B))02.
数组的基本四则运算Numpy的强大之处在于其向量化运算能力,无需编写循环即可对整个数组进行操作,极大地简化了代码并提升了计算效率。数组与标量运算运算规则会自动“广播”到数组的每一个元素上,无需逐一遍历,操作直观高效。arr=np.array([[1,2,3],[4,5,6]])#
加标量,自动广播到所有元素print(arr+
2)#[[345][67
8]]数组间的对应运算当两个数组形状相同时,运算会在对应索引位置的元素间逐一进行,实现真正的并行计算。a
=np.array([[1,2],[3,4]])b
=np.array([[5,6],[7,8]])#
对应位置元素相乘
(Element-wise)print(a*
b)#[[512][21
32]]03.
深入理解数组相乘元素级乘法
(Element-wise)定义:两个数组对应位置的元素直接相乘。要求:数组形状完全相同,或满足广播规则。实现:使用运算符
* 或np.multiply()Importnumpyas
npA=np.array([[1,2],[3,
4]])B=np.array([[5,6],[7,
8]])print(A
*
B) #
对应位置相乘#
输出:
[[
5
12][21
32]]元素级乘法(哈达玛积):“点对点”关注单个元素的计算,适合图像处理、简单算术变换等场景。
1,2
5,6
=
1
5,2
6
=
5,12
3,4
7,8
3
7,4
8
21,32
元素级乘法
符:
/
multiply矩阵乘法定义:遵循线性代数规则,行乘列并累加。要求:左矩阵列数
=
右矩阵行数。实现:使用
@
运算符
或
np.matmul()importnumpyas
npA=np.array([[1,2],[3,
4]])B=np.array([[5,6],[7,
8]])print(A
@
B)
#
矩阵乘法#
输出:[[19
22][43
50]]矩阵乘法(点积):“系统变换”关注向量或维度的线性变换,广泛用于机器学习、物理模拟等。
1,2
5,6
1
5+2
7,1
6+2
8
19,22
3,4
7,8
=
3
5+4
7,3
6+4
8
=
43,50
核心优势vsPython
列表存储: 连续内存块
(效率高)
vs
指针列表
(开销大)运算: 向量化并行计算
(快)
vs
逐元素循环
(慢)类型: 统一数据类型
(稳定)
vs
任意类型混合
(灵活但低效)Matplotlib:数据可视化01
/
基本绘图流程准备数据整理分析所需的数值、数组或DataFrame数据结构调用绘图函数使用plt.
plot()
绘制线条,或plt.
bar
()绘制柱状图等完善图表
&
展示添加标题、轴标签、图例等元素;最后调用plt.
show
()渲染并显示图表Matplotlib:多曲线对比绘制场景与价值在数据分析中,我们常需要对比不同维度或不同实验组的数据表现。Matplotlib支持在同一张图表中绘制多条曲线,直观地呈现数据间的差异、趋势的相关性或背离度。关键技巧:图例
(Legend)为每条曲线设置独特的线型(linestyle)与标记(marker),并配合
plt.legend()
显示图例,可清晰分辨各条曲线代表的含义,避免混淆。核心代码实现#
新增右侧声压数据sound_pressure_level_right=[71.7,60.5,68.2,71.5]#
绘制两条曲线,设置不同样式与标签plt.plot(speed,left_spl,ls='-',
marker='*',label='左侧平均声压')plt.plot(speed,right_spl,ls='-.',
marker='o',label='右侧平均声压')plt.legend()#
显示图例以区分曲线汽车试验数据导入与综合实践在汽车工程实践中,我们经常需要处理来自专业测试设备的数据文件。常见的、必须掌握的两种数据格式是:Matlab
环境下常用的.mat矩阵文件,以及具备极强通用性的.csv逗号分隔值文件。01
/
读取
.
mat
文件
(Matlab
专用格式)使用
Python的scipy.io库中的loadmat()函数,可直接加载并解析
Matlab生成的矩阵数据,保留原始键值对结构,方便后续转换。#
导入库importscipy.ioas
sio#
加载
.mat
文件mat_data=
sio.loadmat("test_data.mat")#
查看文件内容
(键值对)forkey,valinmat_data.items():print(f"Key:{key},DataShape:
{val.shape}")02
/
读取
.
csv
文件
(通用文本格式)无需额外安装库,使用
Python
内置的csv模块即可。.csv
格式通用性极强,可直接用
Excel、Origin
打开,是跨平台数据交换的首选。#
导入内置模块import
csv#
打开文件并逐行读取withopen("data_log.csv","r")as
file:reader=csv.reader(file)header
=
next(reader)
#
跳过表头forrowin
reader:time,speed,temp=
row#
转换数据类型并处理pass实践:读取并绘制
.
mat
文件数据#导入必要的库importscipy.ioassioimportmatplotlib.pyplotasplt#1.
加载.mat
数据文件file_path=r'path/to/your/data.mat'mat_data=
sio.loadmat(file_path)#
2.
提取数据&time,acc_data=
mat_data['time'],mat_data['acceleration’]3.
绘制波形图plt.plot(time,acc_data,color='#FF6A00')plt.xlabel('Time(s)');plt.ylabel('Acceleration(m/s²)')plt.show()数据可视化效果示例加速度传感器采集的时域波形
(Acceleration
vs
Time)什么是字典?
(定义与结构)01.
定义:编程世界的“新华字典”字典
(Dictionary)
是一种由“键值对”
(Key-ValuePair)组成的数据结构。我们通过“键”来快速查找对应的“值”,就像在新华字典里查字一样。键
(Key)用来查找的唯一标识,不可重复。值
(Value)与键相关联的具体数据,内容可多样。02.
结构剖析:键值对的集合#
存储用户信息的字典示例user={"name":"张三",#
键:
值"age":25,#
数字作为值}语法特点:整体使用大括号{
}包裹键与值之间使用冒号:分隔不同键值对间使用逗号,分隔核心规则:唯一性:同一个字典中,键(Key)必须是唯一的,不能重复可变性:值
(Value)
可以是任意类型的数据,包括列表或字典。字典的核心特性02.
键的唯一性
(Unique
Key
s)一个字典中不能有两个相同的键。若添加已存在的键,新值会直接覆盖旧值。student["age"]
=
21
#新值21覆盖旧值2001.
无序性
(Unor
der
ed)字典中的元素没有固定的顺序,不能通过索引访问,只能通过“键”来访问。注:Python
3.7+
会记住插入顺序,但这不是其核心特性。03.
值的任意性(Ar
bit
r
ary
Values)字典的值非常灵活,可以是任意数据类型。例如:整数、浮点数、字符串、布尔值、列表、元组,甚至是嵌套的字典本身。04.
可变性
(Mutable)字典是可变对象
(Mutable),我们可以在程序运行过程中,随时向其中添加新的键值对、删除旧的条目,或修改现有内容。字典的作用与应用场景存储关联信息将多个相关联的信息组织在一起,形成结构化的数据集合,例如一本书的书名、作者、出版日期等详细信息。快速查找利用“键-值”对的映射特性实现高效检索,无需遍历整个数据集,例如直接根据学号查找对应的学生姓名。配置映射存储程序运行时的各类参数与选项,便于读取和修改。例如游戏中的画面分辨率、音量大小等用户自定义设置。数据聚合与统计在处理列表数据时,快速统计各元素出现的频次或汇总相关数据。例如分析文本中单词出现的频率,生成词频统计报表。总结与回顾核心概念回顾键值对集合用于存储关联信息,像查字典一样直观。极速查找直接通过“键”访问对应“值”,查找效率极高。键唯一性字典中键名不可重复,但对应的值可以是任意类型。可变数据类型支持在原地进行增加、删除、修改操作。课后小挑战尝试创建一个字典来存储你自己的个人信息,至少包含姓名、年龄、所在城市和一个兴趣爱好列表。完成后,试着修改其中一项信息,并添加一个新的字段(例如:身高)。#
创建你的个人信息字典my_info=
{"name":
"张三",
"hobbies":
["阅读","运动"]}#
试着修改和增加内容,最后打印查看实践:读取并绘制
.
csv
文件数据Step1
定义文件路径并初始化列表File_path=r’path/to/your/file.csv’columns=
[]Step
2.
读取数据:跳过表头,逐行加载withopen(file_path,mode='r',encoding='utf-8')asfile:reader=
csv.reader(file);next(reader)#
忽略首行标题[columns.append(row)forrowinreader]Step
3.
数据处理:转为数组并提取特定列data
=
np.array(columns)#
类型转换为ndarrayrpm,
vib
=data[:,0],
data[:,4].astype(float)#
转浮点型用于计算Step4.可视化:绘制趋势图plt.plot(rpm,vib,marker='o',color='#ff6a00');plt.xlabel("RPM");plt.ylabel("Vibration(g)");
plt.show()综合实践:车辆行驶系统仿真仿真目标|
明确研究对象与变量建立仿真模型,量化分析不同油门开度与道路坡度对车辆行驶速度的动态影响。核心动力学方程:Py
thon
实现通过自定义acceleration与simulate函数,实现对车辆在复杂工况下加速过程的数值模拟与迭代计算。工程价值直观展示驾驶员操作与外部干扰下的动态响应,实现“物理理论
→
代码逻辑
→
仿真预测”的闭环验证。仿真结果可视化同一坡度下,不同节气门(油门)开度对车速变化趋势的对比分析驱动力:
Ft
k
Ne
/
rw行驶方程:a
Ft
Froll
Fair
Fgrade
/
m本章总结01
/
理论基础建立对信号、系统与数字信号处理的完整认知体系,夯实核心理论基石。02
/
工具掌握熟练运用Python进行编程,掌握NumPy数值计算与Matplotlib数据可视化能力。03
/
实践应用具备处理真实汽车试验数据(.mat,
.csv)的能力,并可完成基础的系统仿真模拟。04
/
未来展望本章是深入学习傅里叶变换、数字滤波等进阶信号处理算法与复杂系统建模的重要基石。Q
&
A第二章:汽车试验数据的数值分析与数据建模从数据到模型:揭示汽车性能的数学语言授课对象
/
TARGET
AUDIENCE车辆工程专业计划学时
/
TOTAL
HOURS4学时
(理论与实操结合)本章学习目标与课程大纲01/学习目标掌握统计分析学会计算均值、方差等统计量,并理解其工程意义,为数据处理打下基础。理解数据分布掌握频率分布、概率分布的概念,并能针对不同场景进行合理的假设检验。精通插值方法掌握线性、多项式和样条插值算法,并能根据数据特性选择最合适的插值方法。02
/
课程大纲学时一:试验数据的统计分析基础学时二:数据的分布特征与概率模型学时三:数据插值方法及其应用实践学时四:数据拟合与工程建模实战试验数据的统计分析基础为什么需要数据分析?数据建模是将试验数据转化为数学模型的过程,旨在揭示信号背后的规律,用于预测、优化和评价系统性能。01.
原始试验数据从传感器或测试设备获取的最原始的信号与记录。02.
数据处理进行统计量计算、异常值清洗、插值拟合与微积分等一系列运算。03.
数学模型抽象出能够精准描述系统行为特征的数学表达式。04.
应用与评价利用模型进行系统的性能预测、设计优化与最终评价。认识你的数据:四大核心统计量算术平均值
(Mean)反映数据的集中趋势,代表信号的静态偏置公式:x̄ =(1/n)·Σ(xᵢ)方差
(Variance)衡量数据的离散程度,反映信号围绕均值的波动幅度。公式:s²=(1/(n-1))
·Σ(xᵢ
-
x̄
)²
标准差
(Standard
Deviation)方差的平方根,与原始数据单位相同,在工程应用中更直观。公式:s
=
√[Σ(xᵢ
-
x̄
)²/(n-1)]均方值
(Mean
Square)综合包含均值和方差的全部信息,可直接表征信号的平均功率。公式:E[x²]=
方差
+
(均值)²思考题:在车辆动态测试中,如果信号的“方差”非常大,这通常意味着什么?(提示:可能是测量误差较大,也可能是实际工况波动剧烈)1、寻找均值均值是总体上评价一组数据最普遍和最直观的一种方法。这也是我们日常经常说的“平均”例如有一个学校,需要统计过去12天慈善捐款的情况。在此期间,每天收到的捐款总和为100,60,70,900,100,200,500,500,503,600,1000和1200.
我们可以通过求取这些数的和再除以天数,获得捐款的平均数。代码如下:页码
5def
calculate_maen(numbers):s=sum(numbers)N=len(numbers)mean=
s/Nreturn
meanif
name
==
'
main
':donationList=
[100,60,70,900,100,200,500,500,503,600,1000,1200]mean=calculate_maen(donationList)N=
len(donationList)print('Thaaveragevalueoverthelast{0}daysis
{1}'.format(N,mean))页码
6我们计算得到每天捐款的平均值是477.75.
这个数字是毫无价值的,可以看到前六天的捐款数是低于平均数,而后6天的捐款数是高于平均数的。平均数仅给予我们一种数据的总体评价方法,但不能给出数据的完整描述或图画。但是,我们有其他的统计量可以告诉我们数据所包含的更多信息。2、寻找中值中值是所搜集数字的另一种平均值。为求得中值,我们首先需要将数据进行升序排列,如果排序后数据集的元素数是奇数,那么中间的值就是中值;反之,如果是偶数,则取中间两个数值的平均值作为中值页码
7让我们继续考察前面的慈善捐款数据:经过排序运算,原列表中各元素位置发生了变化,我们有新的列表为:60,70,100,100,200,500,500,503,600,900,1000,
1200.由于列表元素有12个,是偶数,所以中值等于(500+500)/2
=
500在我们编写程序之前,让我们先思考一下,如何能够在任何情况下,自动计算出列表的中值元素?如果列表的长度N是奇数,中值元素的位置就是(N+1)/2;反之,如果N是偶数,那么中值元素有两个,分别位于N/2和N/2+1例如,如果列表长度为8,则中值元素位于4和5;如果列表长度为13,则中值元素位于7页码
8为了编写计算中值的函数,我们需要将原始数据列表进行升序排列(重组)在Python中,利用sort()方法,可以很容易地实现。页码
9'''Calculatingthemedian'''defcalculate_median(numbers):N=len(numbers)numbers.sort()ifN%2==
0:m1=
int(N/2)m2=int(N/2+1)index_m1=
m1-1index_m2=
m2-1median=(numbers[index_m1]+
numbers[index_m2])/2else:m=(N+1)/2m=int(m)-1median=
numbers[m]return
median在Python
中,列表的索引从0开始,所以需要减去1在除法运算中,两个数的除法操作返回的是一个浮点型数,虽然它与整数型数等效。但是由于我们无法用浮点型数据作为列表的下标索引,所以需要利用int()方法进行数据类型的转换。if
name
==
'
main
’:donationList=
[100,60,70,900,100,200,500,500,503,600,1000,1200]median=calculate_median(donationList)N=len(donationList)print('Mediandonationoverthelast{0}daysis
{1}'.format(N,median))程序运行结果为: 500与列表数据的均值相比, mean
和
median两者之间具有较大的差别。页码
103、寻找数据序列中出现次数最多的数
-众数(mode)页码
11寻找一组数据中出现次数最多的数字(数据)可以看作是在一组多次出现的数据中寻找次数最大的值,在数学中,就是数据的“众数”众数:指某一组数字中出现次数最多的值Python内建的 collections
集合模块中的
Counter
类能够简洁、高效的实现统计计数。Counter是dict 字典的子类,Counter
拥有类似字典的
key
键和value值,只不过
Counter
中的键为待计数的元素,而
value
值为对应元素出现的次数如果要使用
Counter,必须要进行实例化,在实例化的同时可以为构造函数传入参数来指定不同类型的元素来源。"""求取一组数据中(成绩单)分数的出现次数,统计哪个分数出现的多"""import
collectionsscores=
[95,91,90,85,75,75,65,95,90,90,91,75]s=collections.Counter(scores) ------
#
构造一个实例:smode_s=
s.most_common()print(mode_s)页码
12由输出结果可以看出:1、众数,由Counter类中的most_common()方法给出2、结果是以元组为元素的一个列表3、每一元组的第一
个元素是数字,第二个元素是出现的次数4、列表元素以出现次数的多少由高到低排列在此示例中,分数90和75各出现了3次,95和91各出现了2次,其他分数各1次。说明有3人考了90分,3人考了75分;2人考了95分,2人考了91分
…..当调用most_common()方法时,可以传递一个参数,以告知“函数”想要获得几个众数页码
13页码
14第一行:数字“1”,表示输出1个众数得到:90,出现3次第三行:数字“3”,表示输出3个众数得到:90,出现3次,75,出现3次,95,出现2次4、众数的应用
----
创建一个频率表页码
15让我们再一次考察一个学生某学科阶段测验所得分数的列表:
7,
8,
9,
2,10,
9,
9,
9,
9,
4,
5,
6,
1,
5,
6,
7,
8,
6,
1,
和10.
表3-1列出了这些分数出现的次数(第一列是分数,第二列是该分数在列表中出现的次数),例如,9分出现了5次,即5个同学得9分,6分出现了3次,即3个同学得到6分Table3-1:Frequency
TableScoreFrequency1221415263728295102页码
16我们将利用most_common()
方法再一次打印出对于给定的一组数字的频率表'''Frequencytableforalistofnumbers'''fromcollectionsimport
Counterdef
frequency_table(numbers):table=Counter(numbers)print('Number\tFrequency')fornumberin
table.most_common():print('{0}\t{1}'.format(number[0],number[1]))if
name
=='
main__':scores=[7,8,9,2,10,9,9,9,9,4,5,6,1,5,6,7,8,6,1,
10]frequency_table(scores)实例化一个计数器对象most_common()方法返回一个键值对,键为数字,值为出现的次数Number
Frequency9678105124532222211The
Output在代码中,包含了以下两个函数:Counter()most_common()按照数字出现次数降次输出的规则返回计算值.如果你想按照频率的升序排列输出表格,你可以对输出元组再次采用sort()方法进行重新排列,即:numbers_freq.sort()页码
17方法用于统计字符串里某个字符或子字符串出现的次数。可选参数为在字符串搜索的开始与结束位置。5、离散度测量一组数据的离散度告诉我们数据偏离均值的程度关于离散度,有三个不同的测量量:范围、方差和标准差1)范围再次考虑募捐活动得到的捐款列表,我们发现每天捐款的均值是
477.75.但是仅看均值,我们无法判断是否所有的捐款数是落在一个很窄的区间内,例如是否在
400和
500之间;或是否落在更大的一个区间,如60
和
1200。对于一组数字,范围是指最大值与最小值之差我们可以有两组数字,他们可以具有相同的均值,但是却有完全不同的范围。所以,了解数据的范围,将会获得除均值、中值和模态更多的数据信息。函数min()可以计算一组数据中的最小值;函数max()可以计算最大值。因此一组数据(如test_data)的范围,就是max(test_data)
–
min(test_data)页码
182)方差与标准差如果我们想要知道所有数据中每一个数据单独偏离均值的情况,又该怎么做呢?也就是说,这些数据是都很相似且聚集在均值附近,还是他们各自不同,分散在范围内的不同区域?页码
19方差---
数据点与均值的差的平方的均值,公式为:标准差---
方差的算数平方根
2variance
=imeann
x
x
2imeann
x
x页码
20方差以平方单位来表征,因为它是均值的平方差的平均值,在有些数学公式中,用方差比用标准差更为友好、方便。另一方面,标准差的单位更贴近人们的日常习惯。例如,对于前述的捐款活动,方差的单位是dollar
的平方,但是标准差的单位就是dollar
。通过计算,我们可以得出每日捐款的方差和标准差分别是:141047.35和 375.56可以看出,两个数字都很大,说明每天的捐款额与均值有很大的偏差(数据具有很大的离散性)作为对比,我们考察另一组具有相同均值的数据:382,
389,377,397,396,368,369,392,398,367,
393,和 396.
计算得到的方差和标准差分别为:135.38
和11.63案例分析:消除静态偏置
—
零均值化处理01
/
场景描述车辆在坡道上行驶时,加速度计信号包含三部分:路面动态激励、重力导致的静态直流偏置以及随机测量噪声。02
/
核心痛点信号中的直流偏置分量会整体抬高信号幅值,导致数据基线偏离零点,从而掩盖了真实的动态振动情况。/
解决方案计算原始信号的算术平均值,并用原始信号减去该平均值。这一操作被称为“零均值化处理”/
应用价值有效分离了直流分量与动态分量,将信号“拉回”零点附近,使处理后的数据能更准确地反映车辆运行的真实物理过程。Py
thon实践:模拟坡道振动响应#
重力分量#
5Hz
动态振动分量#
随机噪声模拟测量误差#
核心操作:去除均值importnumpyasnpimportmatplotlib.pyplotasplt#
1.
生成时间序列,模拟10秒内的振动数据t=np.linspace(0,10,
1000)#
2.
模拟信号分量:重力直流偏置
+
动态振动
+
随机噪声dc_component=9.81np.cos(0.3)dynamic_component=2np.sin(2np.pi*5
t)noise=0.5
np.random.randn(len(t))#3.组合信号并执行零均值化处理(去除直流偏置)original_signal=dc_component+dynamic_component+
noisezero_mean_signal=original_signal-
np.mean(original_signal)#
4.
绘制原始信号与零均值信号对比图
(代码略)案例分析:发动机怠速振动特性评估工程场景:选取城市公交车作为测试对象,在发动机3000r/min的怠速工况下,对车身8个关键振动测点的加速度响应信号进行采集与统计分析。原始振动加速度数据
(单位:
g)[1.072,0.190,0.162,0.178,0.917,
0.173,0.084,
0.066]平均值
(Mean)0.36g方差
(Variance)0.14
g²标准差
(SD)0.37
g均方值
(MS)0.27
g²结论:数据稳定性较高,均值具备代表性数据的分布特征与概率模型数据的“人口普查”:频率分布频数
(Frequency)某个数值或区间在数据集中出现的绝对次数,反映了特定值的“人气”。频率
(Relative
Frequency)频数与数据总数的比值,通常用百分比表示,反映了事件出现的相对可能性。核心可视化工具最直观展示形态:频数
/
频率直方图频率分布
v
s.
概率分布频率分布基于实际观测数据的统计结果描述数据“是什么”(客观事实)概率分布基于数学理论模型的推演描述事件“可能是什么”(理论预测)例如:正态分布是一种典型的概率分布模型,可用来拟合身高、成绩等自然数据的频率分布。Py
thon实践:统计与可视化车速分布车速频数分布图这张图展示了不同车速区间内出现的次数。我们可以清晰地看到,在采集的数据集中,车速主要集中在60-80
km/h的区间内,这也是出现频次最高的速度段。车速频率分布图这张图展示了不同车速区间出现的频率。所有区间频率之和为
1,它反映了在随机观测中,在某个特定速度区间内观测到数据的概率大小。关键:分组(分桶)的重要性试验: 为了测试(或了解)某事物的特性所采取的行动,例如掷骰子、扔硬币,随机抽取扑克牌等都是试验的例子。样本空间: 随机试验中所有可能出现的事件集合称作样本空间,在公式中通常用S 表征。例如,当投掷一枚六面骰子时,样本空间是 {1,2,3,4,5,
6}.事件:
随机试验若干个基本结果(可能出现的结果)组成的集合称为事件。它构成了样本空间的子集,是计算概率的基础。在公式中,以
E
来表征页码
26概率基础如果样本空间里每一事件的发生概率相同,那么事件发生的概率
P(E),
可用下式页码
27计算得到::P(E)
n(E例如,对于一个六面骰子,我们想知道掷出数字3的概率有多大。根据上面公式,可以写出:S={1,2,3,4,5,
6}E={3}n(S)=
6n(E)=
1P(E)=
1/6据此,可以写出如下计算任意样本空间下,某事件的发生概率的代码defprobability(space,event):return
len(event)/len(space)页码
28Space:样本空间集合Event
事件空间集合在这个函数中,参数“space”
是样本空间,参数“event”是事件,并不一定
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026年四川省部编版小学一年级语文上册第1单元课文阅读练习题
- 2026年专升本大学物理与化学与生物与数学综合测试题库
- 2025-2026年福建省部编版八年级物理下册力学专项测试卷
- 2026年江苏省苏教版高中化学下册化学实验专项训练习题
- 2026年浙江省苏教版高中数学必修第1册第5章集合与函数综合测试题
- 2026年人教版小学五年级英语下册第12单元课后练习题
- 2025-2026年驾驶员考试科目一模拟试卷
- 2047年天津市人教版高中政治必修第三册单元测试卷
- 低温冷冻干燥工艺升级对桂花粉风味物质保留率的投资敏感性
- 二手真空晒板设备再制造循环经济模式下的残值预测与退出机制设计
- 2026 年秋季高一开学第一课高中生课外阅读拓展视野教育
- 延长导管在冠状动脉介入诊疗中的应用专家共识(2026年)
- CSCO结直肠癌诊疗指南(2026版)
- 2.2天然纤维(课件)-《服装材料》同步教学(高教版)
- 2026年四川高考化学试卷答案详解及复习备考指导
- 2025国家电网中级职称考试(政工专业)练习试题及答案
- (2026年)ACC、AHA血脂异常管理指南课件
- 颈部脊髓功能损伤护理查房
- 资阳空港私募基金管理有限责任公司市场化招聘(10人)笔试参考题库及答案详解
- 新《生态环境法典》解读
- 2026年计算机408统考题库(附答案)
评论
0/150
提交评论