当前位置:文档之家› MATLAB在“汽车理论”中的简单应用

MATLAB在“汽车理论”中的简单应用

MATLAB在 汽车理论 中的简单应用 汽车理论 可以使用MATLAB作为科学计算工具的课程㊂本文档的目的在于向之前没有接触过MATLAB的同学介绍其在 汽车理论 中的简单应用,更多关于MATLAB的知识需要大家结合其他课程,通过进一步的学习和研究来掌握㊂需要说明的是:1)本文档默认读者已掌握C语言和线性代数基本知识㊂2)红色字体的语句可以直接复制到MATLAB中进行运算㊂语句中用到的符号(引号内部分除外)均为英文状态下输入㊂本文档所有语句均已在MATLAB7.8.0(R2009a)版本下调试过㊂3)例程编写样式纯属个人习惯,大家不必拘泥㊂4)如对本文档及‘汽车理论“第6版中的附录C㊀一个学生的 汽车理论 课程MATLAB习题编程思路有任何问题,欢迎发送邮件一起讨论㊂邮件地址:wang-d07@ ㊂1.MATLAB使用指南打开MATLAB后出现的是软件的主界面㊂几个窗口中最重要的是Command Window,用户可以在里面输入程序,编写的函数的结果也在这里显示㊂首先对MATLAB进行配置㊂如果是在自己的计算机上编程,建议先建一个属于自己的workspace,用来保留用户的工作环境㊂选择 file Save Workspace As ,在合适的目录下保存用户自己的workspace(.mat文件)㊂这样,以后用户编程的环境就默认为这个workspace了㊂虽然可以直接在Command Window里编写程序,但这样的程序无法被保存和发布㊂选择 file New Blank M File ,可以新建空白的MATLAB函数文件(.m文件),在这里编写的程序可以被保存和发布㊂编写好的程序要经过编译之后才能执行㊂选择 Tools Save File and Run (也可以直接按<F5>键),进行程序的编译和执行,结果显示在Command Window中㊂如果程序有错误,MATLAB也会提示程序运行到哪一行命令终止了,并指出可能的错误类型,然后用户就开始了漫长的debug㊂如果编写了子程序和主程序,那么需要先对子程序进行编译(此时不会产生任何结果),只有编译通过后再对主程序进行编译,才会显示结果㊂当然,也可以选择新建 Function M File ,它直接提供一个函数模板㊂(个人感觉没有太大意义)明白该如何操作MATLAB后,接下来介绍MATLAB中与C语言不同的变量单位 矩阵㊂2.矩阵及其运算MATLAB全称是Matrix Laboratory(矩阵实验室),因此矩阵是MATLAB中最基本的运算单位,熟练掌握矩阵的知识对于灵活运用MATLAB有很大帮助㊂1在MATLAB中,一个已知的矩阵可以定义如下:A=[1-20;3.54.8666pi]其中A是这个矩阵的名字,在MATLAB中,一个变量必须以字母开头,以数字㊁下划线等开头都是违法的(但可以用在变量名中间);A的值是一个矩阵,其元素分别为:a11=1,a12=-2,a13=0,a21=3.5,a22=4.8666,a23=3.1415由上述可知,同一行的元素用(一个或多个)空格隔开,不同行的元素用分号(英文状态下的,下同)隔开㊂其中, pi 是MATLAB中已经定义好的常数,可以直接引用㊂可以看出MATLAB与C语言在定义上有所差别,即如果变量是已知的,MATLAB无须事先定义对象类型(整数㊁浮点数㊁无符号数等),通过正常运算得出的变量也无须对其事先定义类型㊂此外,还可以定义向量,如:B=[123]C=[0;0.5;-1]其中,B是一个行向量,C是一个列向量㊂ᶄ 表示矩阵的转置,即列向量C也可以表示为:C=[00.5-1]ᶄ如果想表示矩阵中的某个元素,其方法如下:a=A(2,1)可以得到:a=3.5其中 () 内的语句部分表示元素的位置, , 前为行, , 后为列,即a等于矩阵A中第2行第1列的元素㊂对于一个向量,由于某一方向维度为1,因此上述语句可以简化为:b=B(3)c=C(2)可以得到:b=3c=0.5如果想取矩阵中的某一部分,其方法如下:D=[23783;01956;46215;40391]E=D(1:3:4,1:2:5)F=D(1:3,1:2)G=D(2,:)可以得到:E=[273;431]F=[23;01;46]G=[01956]其中, : 表示步进,如1:2:5表示从1开始步进为2直到5,即1㊁3㊁5,因此E 为矩阵D的第1㊁4行(步进为3)和第1㊁3㊁5列(步进为2)交叉处的元素组成的矩阵; 2如果步进为1,则可以省略不写,如1:3表示1㊁2㊁3,则F为矩阵D的第1~3行和1~2列交叉处元素组成的矩阵;单独使用的 : 表示所有行(列),即G为矩阵D第2行所有列的元素组成的矩阵㊂MATLAB也允许对矩阵进行扩充,但一定要注意维数的正确性㊂例如:H=[31;52]K=[H;60]L=[01;Hᶄ]ᶄ可以得到:K=[31;52;60]L=[031;152]矩阵间可以进行加㊁减㊁乘㊁除等矩阵运算,但同样需要注意维数的正确性㊂例如: M=[10;21]N=[31;10]那么有:M+N=[41;31]M∗N=[31;72]如果用一个常数与矩阵进行四则运算,结果是这个常数分别与矩阵中的元素进行四则运算,如:3+M=[43;54]2∗M=[20;42]此外,MATLAB还提供了有别于正常的矩阵运算的点乘(除㊁次方)运算,即在运算符号前加 . ,表示矩阵中对应位置的元素进行代数运算㊂例如:M.∗N=[30;20](对应位置元素相乘)M.^2=[10;41](对应位置元素平方)点乘(除㊁次方)运算在数据处理中很常用㊂例如,一个20维向量中记录的是汽车通过的20个测试路段的长度,另一个20维向量中记录的是汽车通过每个测试路段所用的时间,两个向量做点除运算,得到一个20维向量,即为汽车通过每个路段的平均速度㊂需要注意的是,由于矩阵加减本身就是相应位置元素的代数运算,因此没有点加(减)运算㊂在MATLAB中已定义好了一些特殊的矩阵,用户可以方便地使用,包括零矩阵(元素全为0)zeros㊁一矩阵(元素全为1)ones㊁单位矩阵(对角线元素均为1㊁其余位置元素均为0的方阵,即 I )eyes,用户用时只需定义矩阵的维数即可㊂例如:P=zeros(2,3)Q=ones(5,1)R=eyes(2)分别表示P为一个2行3列的零矩阵,Q为一个5维的一矩阵,R是一个2维单位矩阵㊂需要注意的是:1)如果zeros和ones只给了一个维度的定义,默认为方阵,如zeros(3)是一个3∗33的零方阵㊂2)eyes只能有一个维度的定义(本身即为方阵),定义为eyes(2,3)和eyes(2,2)都是错误的㊂3)零矩阵多用在初始化㊂例如执行某个循环语句来反复为一个矩阵增加元素(这种情况在数据处理时很常见,经常需要不断地将处理过的结果放到一个向量中区),矩阵的大小在每次循环中都会发生变化,MATLAB需要事先为这个矩阵分配相应大小的内存空间㊂此时可以先将该矩阵定义为零矩阵(数据的个数即为维度),这样在循环过程中得到的数据会将原有的0覆盖㊂4)灵活使用一矩阵会使运算简化㊂例如M=[1234],需要求出所有元素之和㊂可以定义N=ones(4,1),利用矩阵乘法M∗N就可以得到M中所有元素之和㊂这种情况多用于矩阵M中存放的是每个试验点的数据(如在每个工况下汽车的油耗),需要求出在试验过程中总的结果(如在六工况试验时测量汽车的总油耗),此时用一矩阵可以代替循环加法㊂其实,在工程应用中最常用到的是向量,对向量进行处理㊁计算和表达是接下来介绍的重点㊂3.常用函数简介MATLAB中有许许多多的函数,但常用的可能只有几十个㊂使用MATLAB中的函数需要知道函数名㊁参数个数及类型㊁返回量个数及类型,但没有必要完全记住这些,用到时只需在help菜单里查找就行了(MATLAB的help菜单十分强大)㊂当然,前提是要知道MAT-LAB提供了一个这样的函数㊂MATLAB中函数的格式通常为:[y1,y2, ]=function(x1,x2, );方括号内的是返回值,多个返回值用 , 隔开,如果只有一个返回值则不必写 [] ;function是函数名;小括号内是参数,多个参数用 , 隔开,小括号不可省略;函数语句结尾一般用 ; 表示结束㊂下面介绍常用的函数㊂如果是处理试验数据,首先要做的就是导入数据㊂程序如下:data=importdata( 1.txt );其中,data是一个存放数据的矩阵,importdata是导入数据函数,其参数为字符串类型的文件名(如1.txt),文件名要写在 ᵡᵡ 内㊂通常,一个数据文件中包含许多类型的数据,一般需要再将它们分别提取出来,即在后面加上如下语句:vel=data(:,1);该语句的含义为将data中第1列的速度数据提取出来放入vel向量中㊂面对海量的数据,需要一些函数来帮助我们处理㊂这里只介绍find()和length()函数㊂find()函数用来查找向量或矩阵中符合条件的元素的位置㊂其常用形式如下: pos=find(expression)其中,expression是人为设定的条件,pos是由符合条件的所有元素位置组成的向量㊂find()函数运行时,从第一个元素开始查找,并将使参数expression为真的元素位置写入4向量pos中㊂例如:X=[10-45.502-1];pos1=find(X>0&X<3)pos2=find(X)执行程序后可以得到:pos1=[16]pos2=[13467]即pos1用于查找向量X中所有大于0且小于3的元素的位置,pos2用于查找向量X中所有不为0的元素的位置(MATLAB与C语言相同,逻辑语句值为0表示FALSE,不为0表示TRUE)㊂在MATLAB中也有逻辑运算符,分别是与 & ㊁或 | ㊁非 ~ ㊂length()函数可用来求一个向量的长度㊂需要精确判断存储了海量数据的向量究竟有几个元素时,可以采用length()函数,如下:len=length(X)对向量中的数据,除了可以进行矩阵运算之外,还可以直接进行其他数学运算㊂例如输入以下语句即可画出一条正弦曲线:X=0:0.01:2∗pi;Y=sin(X);plot(X,Y);这里的X是从0开始,步进0.01直到2π的向量( : 的用法同上),Y是对X中每个元素求正弦后的值组成的向量,X和Y的元素个数应该是相同的;plot是画图函数,接下来会介绍㊂常用的数学函数包括:三角函数sin()㊁cos()㊁tan()等;反三角函数asin()㊁acos()㊁atan()等;平方根sqrt();向上取整ceil()㊁向下取整floor()㊁向0取整fix()㊁四舍五入取整round()等㊂由于经常需要进行插值运算,MATLAB中提供了许多插值函数,这里仅介绍一种一维(线性)插值函数interp1()㊂例如:X=1:10;Y=X.^2+3∗X+2;y1=interp1(X,Y,4.5)可以得到:y1=36这段语句中有几点需要说明㊂1)interp1()函数的常用形式是:y1=interp1(X,Y,x1)参数依次为:向量X㊁向量Y㊁向量X范围内的某个值x1(不一定是X中的元素,如x1=4.5就不是X中的元素);返回值y1是向量Y对应的线性插值㊂Interp1()函数首先将向量X和Y的对应值进行拟合,然后根据x1的位置线性插值出y1的大小㊂由上例可以看出,如果按照单纯的公式计算,y1应该等于35.75,但线性插值的结果是,y1等于36㊂(可以自行验证)52)最后一行的末尾没有写分号㊂分号的作用是表示一行语句的结束,但如果这行语句的结果需要显示出来(如y1的值需要在Command Window中显示),那么结尾的分号就需要去掉㊂也就是说,执行结尾有分号的语句,不显示运算结果,反之会显示运算结果㊂(其实在介绍矩阵部分时所有代码结尾都没有写分号,是一样的道理)如果想显示某个变量的值,可以直接输入名称㊂例如刚才的函数最后一行改为:y1=interp1(X,Y,4.5);y1执行程序后也是可以显示y1的值的㊂如果显示的运算结果没有被放到一个变量中,MATLAB默认将其放到一个名叫ans的变量中㊂例如刚才的函数最后一行改为:interp1(X,Y,4.5)那么会显示ans=36需要注意的是,由于只有一个ans变量,因此每次使用ans变量都会覆盖掉前一次的值㊂3)注意到第二行语句中的点乘运算了吗?有时候需要对数据进行多项式拟合,这时会用到函数polyfit()和polyval()㊂例如: X=[11.52.233.6];Y=[68.813.52025.8];A=polyfit(X,Y,2)X1=3:5;Y1=polyval(A,X1)可以得到A=[0.98443.07431.9556]Y1=[20.038430.003841.9380]polyfit()函数是多项式系数拟合函数,其常用形式如下:A=polyfit(X,Y,n)其中X是自变量,Y是因变量,n是拟合的多项式的系数(最高次方)㊂向量A中存放的是拟合的多项式系数(依次为n阶系数,n-1阶系数 1阶系数,常数项)㊂上例中A= polyfit(X,Y,2)就是将X和Y进行了2阶多项式拟合,结果为:Y=0.9844∗X.^2+3.0743∗X+1.9556polyval()函数是多项式求值函数,其常用形式如下:Y=polyval(A,X)其中,A是多项式的系数(由高阶到低阶),X是自变量,Y是因变量㊂上例中Y1= polyval(A,X1)就是利用polyfit()函数拟合出的系数对一组新的自变量进行了求值㊂积分运算是很常见的㊂MATLAB中提供了许多积分函数,这里仅介绍最常用㊁最简单的梯形积分函数trapz()㊂例如:X=0:0.01:pi;Y=sin(X);6I=trapz(X,Y)可以得到:I=2trapz()函数的参数分别是自变量X(隐含了积分起点和终点)和因变量Y,函数利用微积分中的梯形积分方法计算积分值㊂数据处理完后就该表达了㊂MATLAB中提供了丰富的绘图函数,最常用的就是二维绘图函数plot(),其应用例子可以参考前述绘制正弦曲线的部分㊂这里介绍一下常用的plot()函数参数以及其配套函数㊂首先用figure()函数选择图纸㊂例如:figure(1);表示打开1号图纸(MATLAB中用数字编号图纸)㊂也可以不选择图纸,MATLAB会根据作图的顺序依次在1㊁2㊁3 号图纸上绘图㊂figure()函数的作用是,允许用户选择图纸画图,这在同时绘制多张图而需要选定某张图时十分有用㊂接下来可以绘图了㊂plot()函数的常用形式为:plot(X,Y,Linestyle)X和Y就是绘制的横轴参数和纵轴参数;Linestyle是表示线型性的字符串类型参数,需要用 ᵡ 加注,可以省略㊂常用的Linestyle参数见下表,更多参数见help文档㊂线型对应字符线色对应字符数据点对应字符实线(默认)-蓝色(默认)b无(默认)(空白)虚线--红色r加号+点线:黄色y圆圈o点画线-.绿色g叉x青色c星号∗洋红色m方块s黑色k菱形d线型引用例子如下:plot(X,Y,ᶄ-.roᶄ);表示绘制的线型为红色点画线㊁数据点用圆圈表示㊂除了线型外,图上的任意标注都可以用函数进行修改㊂例如:plot(X,Y);xlabel( time ),ylabel( velocity ),title( v-t ),axis([0,120,0,50]),grid on, legend( TEST1 );执行该语句,可以绘制一幅横坐标表示时间㊁范围为0~120,纵坐标表示速度㊁范围为0~50,题目为 v-t ,图例为 TEST1 ,有网格线的图表㊂其中xlable()和ylable()函数表示图上横轴和纵轴的注释,参数为相应的字符串;title()函数表示图表的题目; axis()函数表示横纵坐标轴的范围,因为有时候MATLAB默认的坐标范围不是我们想要的,需要进行修正,axis()函数的参数是一个向量(有中括号),其元素依次为横轴最小值㊁横轴最大值㊁纵轴最小值㊁纵轴最大值;grid on函数表示有网格线;legend()函数是图例7函数,表示图上所画的曲线是什么意思,如果有多条曲线,legend()可以有多个参数,按照绘制顺序依次表示每条曲线㊂这些函数可根据需要进行取舍㊂另外,我的习惯是将这些函数用 , 隔开㊂另外,介绍一种绘图函数subplot(),其功能是将图纸分割成许多小部分,供你选择其中某一部分进行绘图,例如:subplot(2,4,2);plot(X,Y);subplot(2,2,4);plot(X,Z);subplot()函数的前两个参数表示将图纸分割成几行几列;第三个参数表示在第几个小图上绘图,其顺序为从左至右㊁从上至下㊂上例中,执行第一行命令后,将图纸分割成2行4列共8个小图纸,在第2个(第一行第二列)小图纸上绘制X-Y曲线;执行第二行命令后,将图纸分割成2行2列共4个小图纸,在第4个(第二行第二列)小图纸上绘制X-Z 曲线㊂需要注意的是,可以将一张图纸按照几种方式分割(如上例中就是2种分割方式),但如果图幅发生冲突,后绘制的图会覆盖先绘制的图㊂也就是说,如果第二行命令改为sub-plot(2,2,1),那第二次绘图会将第一次绘制的图覆盖掉㊂最后,介绍hold on函数㊂其用法如下:X=0:0.01:2∗pi;Y=sin(X);Z=cos(X);plot(X,Y),hold on;plot(X,Z);如果没有hold on语句,那么X-Y曲线会画在第一张图上,而X-Z曲线会画在另一张图上㊂hold on语句能保持当前的图纸不关闭,接下来的图仍然绘制在该图纸上㊂因此上述命令可以在同一张图纸上绘制正弦和余弦曲线㊂相应地有hold off命令㊂一般来说,掌握上述函数基本就可以应对大三学年课程对MATLAB的要求了㊂当然,有时候你也需要编一些自己的程序来更好地满足不同的要求㊂接下来,介绍如何编写自己的程序,即M文件㊂4.程序结构你可能已经掌握了如何在Command Window中用函数来进行一些计算,但如果你的函数很大或者需要保存和发布,还是需要把函数写到一个M文件中㊂MATLAB没有C语言那样的函数库,也不需要编写头文件(这些工作都定义在workspace中了),一个M文件就是你编写的一个函数(当然其中可以包括许多其他子函数),因此对于一个M文件(也是个函数)来说,就有相应的输入量㊁输出量和函数体㊂一般地,如果我们编写MATLAB程序只是为了处理数据㊁绘制图表,不需要传送数据给其他函数,这时M文件就不需要声明函数格式㊂如果这个M文件是其他M文件的一个子函数,有数据需要上传,那么在M文件的开头就需要函数声明㊂函数声明的格式如下: function[y1,y2, ]=func(x1,x2, )其中,y1㊁y2等就是M文件输出变量值,用中括号括起;x1㊁x2等是M文件的输入变量,用小括号括起;func是函数的名字,注意函数名字与M文件的名字一定要相同,不然会出现编译错误㊂MATLAB函数声明与C语言的不同之处是,开头要写function声明这是个8函数;输入变量和输出变量都不需要定义类型,因为输入变量的类型在上一级函数中已给定,而输出变量的类型在M文件中会定义,但输入变量和输出变量的名字都应该是这个函数中用到的实际变量的名称㊂除了函数声明之外,M文件的编写都是一样的了㊂下面介绍MATLAB中的条件语句和循环语句,其定义和功能与C语言相同,这里仅介绍格式上的区别㊂if条件语句格式如下:ifexpression1㊀㊀statements1elseifexpression2㊀㊀statements2else㊀㊀statements3end其中,elseif和else语句不是必需的㊂switch条件语句格式如下:switch x㊀㊀case x1㊀㊀㊀㊀statements1㊀㊀case x2㊀㊀㊀㊀statements2㊀㊀otherwise㊀㊀㊀㊀statementsnendfor循环语句格式如下:for x=x1:step:x2㊀㊀statementsend其中,for循环的条件是用 : 表示的步进㊂while循环语句格式如下:while expression㊀㊀statementsend需要注意的是:1)MATLAB中条件和循环语句statements不必用大括号括起来,但必须用end表示结束㊂多重条件或循环时要注意end的数量㊂2)在表示条件的expression中也可以包含与㊁或㊁非等逻辑命令,但应该写作:等于 == ㊁不等于 ~= ㊁与 && ㊁或 || ㊁非 ~ ㊂在程序编写过程中,很多时候需要添加注释㊂在MATLAB中,用 % 来引导一行注释语句, % 后的本行语句(可以有中文)在编译时均忽略㊂如果有多行语句需要注释,9除了可以在每行开头添加 % 外,还可以采用如下形式来进行注释:%{㊀㊀statements%}到此为止,你已经了解了MATLAB的一些基本知识㊂尝试用MATLAB解决一些问题吧!祝各位MATLAB学习顺利!感谢孟艳提供了参考用的MATLAB作业!01。

相关主题