MatLab与控制系统仿真重点编程.docx

上传人:b****7 文档编号:9818677 上传时间:2023-02-06 格式:DOCX 页数:20 大小:30.38KB
下载 相关 举报
MatLab与控制系统仿真重点编程.docx_第1页
第1页 / 共20页
MatLab与控制系统仿真重点编程.docx_第2页
第2页 / 共20页
MatLab与控制系统仿真重点编程.docx_第3页
第3页 / 共20页
MatLab与控制系统仿真重点编程.docx_第4页
第4页 / 共20页
MatLab与控制系统仿真重点编程.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

MatLab与控制系统仿真重点编程.docx

《MatLab与控制系统仿真重点编程.docx》由会员分享,可在线阅读,更多相关《MatLab与控制系统仿真重点编程.docx(20页珍藏版)》请在冰豆网上搜索。

MatLab与控制系统仿真重点编程.docx

MatLab与控制系统仿真重点编程

第4章MatLab的程序设计

MatLab是一个工具、开发平台,同时它也是一门编程语言。

与在命令窗口用交互的方式工作相比,通过程序运行来解决实际问题,其效率更高,因此,凡是复杂的、大型的应用都是以程序的方式执行。

相对其它高级语言,MatLab更简单、编程的效率更高、调试过程也更容易。

MatLab中的程序文件是以m为后缀,所以通常将MatLab的程序文件称为m文件。

MatLab提供了两种形式的m文件,即:

脚本(Script)式m文件(就简称m文件)、函数型m文件。

在MatLab中已经嵌入了一个功能强大的集成开发环境——m文件编辑器,用它来进行程序的编辑、修改、调试、运行等,完成应用开发工作。

4.1MatLab程序设计基础

通过前面内容的学习,大家对MatLab已经有了一个初步的认识和印象,到目前为止,我们都是在“命令”窗口中,以交互的方式运行,完成我们的工作。

实际上简单的m文件,就是一个批处理程序,它是若干条命令的集合。

例:

4.1.1M文件规则和属性

函数M文件必须遵循一些特定的规则。

除此之外,它们有许多的重要属性,这其中包括:

1.函数名和文件名必须相同。

例如,函数fliplr存储在名为fliplr.m文件中。

2.MATLAB头一次执行一函数个M文件时,它打开相应的文本文件并将命令编辑成存储器的内部表示,以加速执行以后所有的调用。

如果函数包含了对其它函数M文件的引用,它们也同样被编译到存储器。

普通的脚本M文件不被编译,即使它们是从函数M文件内调用;打开脚本M文件,调用一次就逐行进行注释。

3.在函数M文件中,到第一个非注释行为止的注释行是帮助文本。

当需要帮助时,返回该文本。

例如,»helpfliplr返回上述前八行注释。

4.第一行帮助行,名为H1行,是由lookfor命令搜索的行。

5.函数可以有零个或更多个输入参量。

函数可以有零个或更多个输出参量。

6.函数可以按少于函数M文件中所规定的输入和输出变量进行调用,但不能用多于函数M文件中所规定的输入和输出变量数目。

如果输入和输出变量数目多于函数M文件中function语句一开始所规定的数目,则调用时自动返回一个错误。

相对于函数m文件,脚本式m文件就简单多了,它没有严格的格式要求,只要将有关的命令或函数一一敲入即可,但是还是有几个问题需要注意:

1.m文件的名称不得与MatLab的内部函数同名、第一个字符不得为数字(这点与变量的命名规则相同);

2.最好在文件的头部加上注释,对该m文件的作用、功能作一个简要说明,而在一些重要命令行后也加上注释行,以方便使用者阅读、查找;

3.要特别注意m文件的保存路径或位置,如果不是保存在MatLab默认的路径下,可以使用addpath函数来设置、添加路径,否则,m文件不能运行。

脚本式m文件与函数m文件还有一个重要区别:

脚本式m文件中的变量均为全局变量,而函数m文件中的变量则是局部变量。

这可以从这两种程序文件运行后在Workspace中留下痕迹看出。

当然,在函数m文件中也可以专门将某些变量定义为全局变量(关键字是:

global)。

不过,在使用全局变量(函数m文件中)时应特别注意:

①.全局变量需要函数体的变量赋值语句之前定义或说明;

②.全局变量名最好是大写,而且要尽量长,能反映它本身的含义;

③.实际编程时,全局变量也要尽可能少用,因为一旦它在一个地方被改变,那么其它包括该变量的函数中都得改变,有时可能会出现意想不到情况。

4.1.2M文件的组成

函数M文件实例:

functionf=fact(n)%函数定义行

%Computeafactorialvalue%H1行

%FACT(N)returnthefactorialofN,

%usuallydenotedbyN%帮助文本

%Putsimply,FACT(N)isPROD(1:

N)%注释

f=prod(1:

N);%函数体

一个完整的函数M文件通常包括:

①.函数定义行:

定义函数名以及输入、输出变量的数目和顺序;

②.H1行:

对该函数进行概括性的描述(可用help和Lookfor命令调出此行);

③.帮助文本:

这是比H1行更详细的帮助信息,使用help命令时与H1行一起显示;

④.函数体:

这是函数M文件的主要部分,程序的功能都在此部分实现;

⑤.注释:

对程序行的意义进行解释(与H1行一样都是用%开头)。

有的函数M文件还包含return语句!

4.1.3M文件编辑器介绍

1.m文件编辑器的启动

★在命令窗口中敲入:

edit

★点击工具栏中的新建图标

★从菜单file/new/M-file中启动

2.m文件编辑器的界面

★菜单栏

★工具栏

★编辑窗口

3.m文件的运行

★在m文件编辑器内

★在命令窗口中运行

在命令窗口直接输入m文件名,回车即可,但函数m文件通常还必须带参数才能运行,也可以利用feval函数来运行函数m文件,其格式如下:

feval('functionname',arg1,arg2,...)

对于脚本式m文件,还可以用run函数在命令窗口中运行存在的m文件。

格式:

run‘m文件名’(不必带文件的后缀)

4.1.4对函数M文件的调用

凡是以函数m文件形式保存的程序文件,均可以被其它函数m文件或脚本m文件所调用。

例:

①先定义一个函数m文件:

%计算阶乘

functiony=jiech(n)

y=1;

fori=1:

n

y=y*i;

end

②编写m文件实现对上述函数m文件的调用:

functionz=dy(n)

z=log(jiech(n));

4.1.5数据类型与结构

MatLab的数据类型前面已经介绍,下面是它们之间的关系图:

MatLab中结构(教材中称构架)的概念和C语言中的类似,它也包含一个或多个域(数据容器),每个域可以包含任何类型的数据(这一点与单元数组又相似),且相互独立。

下面通过实例来说明如何建立并访问结构。

用结构建立学生的数据记录。

1.例1:

在命令窗口直接创建(或用m文件编辑器)创建。

student.num=20070135;

student.name='李四';

student.age=20;

student.weight=67;

student.height=1.68;

student.test=[90857663885479];

从这个例子可以看出结构建立的方法:

直接建立结构和各个域,同时给各域赋值(也可以不赋值),结构和域之间用点“.”连接。

2.用关键字“struct”创建,格式如下:

s=struct('field1',values1,'field2',values2,...)

例2:

用关键字“struct”创建。

student=struct('num',20070135,'name','zhangsan','weight',1.68,'height',75,'test',…

[9887659578])

3.结构的操作

★结构域的访问

★结构域的添加、修改

直接添加或用函数setfield()添加;

直接修改或用函数setfield()修改。

★结构域的删除

用函数rmfield()删除某个域。

格式:

s=rmfield(s,'fieldname')

4.2MatLab程序的控制

程序的流程控制是高级语言中必不可少、也是非常重要的部分,要编写出高质量的程序,实现对复杂系统的控制、仿真,这一点也是必须掌握的。

MatLab提供了多种控制结构,包括:

顺序结构、选择(分支)结构以及循环结构,每种结构都有各自的控制机制,利用它们及其它们的组合可以实行功能强大的、复杂的应用。

4.2.1顺序结构

顺序结构最简单,它是一种最基础的程序结构,也是最遵循逻辑思路的程序代码结构,批处理文件就是典型的顺序语句文件。

这种语句不需要任何特殊的流控制,按照语句的排列顺序,一条一条的执行,直至结束。

例:

4.2.2选择(或分支)结构

如果程序中需要根据一定条件来执行不同的操作时,可以使用条件语句来构成选择或分支结构。

在MatLab中可利用if语句来实现这种结构。

if语句的结构通常有以下三种形式:

1.单分支结构:

这种分支结构最简单,格式为:

if表达式

语句

end

它只有一个判断语句,当表达式为真时,就执行语句,否则就不执行。

例:

functionf=ifone(x)

ifx>=0

fprintf('%fisaPositivenumber.\n',x);

end

2.双分支结构:

此时,采用if-else-end结构,语法是:

if表达式

语句1

else

语句2

end

即:

表达式为真,系统执行语句1,否则将转入语句2执行。

例:

将上面的例子扩充

functionf=ifone(x)

ifx>=0

fprintf('%fisapositivenumber.\n',x);

else

fprintf('%fisanegativenumber.\n',x);

end

3.多分支结构:

仍采用if-else-end结构,但语法上略有不同,形式如下:

if表达式1

语句1%表达式1为真执行语句1

elseif表达式2

语句2%表达式2为真执行语句2

elseif表达式3

语句3%表达式3为真执行语句3

……

else

语句n%所有表达式为假执行语句n

end

例:

编写一个成绩打印程序。

functionf=chengji(x)

ifx>=90

fprintf('%d分,成绩为优\n',x)

elseifx>=80

fprintf('%d分,成绩为良\n',x)

elseifx>=70

fprintf('%d分,成绩为中\n',x)

elseifx>=60

fprintf('%d分,成绩为及格\n',x)

else

fprintf('%d分,成绩为不及格\n',x)

end

4.2.3开关语句(Switch分支结构)

开关语句实际上也是分支结构的一种,是一种多选择的分支语句,作用与上面介绍的多分支结构相似,这是MatLab6.0以上版本新增加的功能。

该结构的一般调用格式如下:

Switchexpression

Casevalue1

Statements

Casevalue2

Statements

……………….

Otherwise

Statements

end

例:

采用switch结构的一个简单应用。

%提示用户输入数据

input_num=input('Enteranumber:

');

%根据情况判断数值大小,显示数据信息

switchinput_num

case-1

disp('negativeone');

case0

disp('zero');

case1

disp('positiveone');

otherwise

disp('othervalue');%如果不是上面数据,显示“其它数据”

end

4.2.4try-catch结构

try-catch结构(或模块)为用户提供了一种错误捕捉机制,利用该模块,一旦MatLab的编译系统发现错误,就将其捕捉,用户可以控制MatLab去对出现的错误进行相应处理。

它的调用格式如下:

try

语句1

catch

语句2

end

一般来说,语句1中的所有命令都要执行,如果在执行语句1时,没有出现错误,那么在执行语句1之后,就直接跳到end后;但是,如果在执行语句1时,出现了错误,程序立刻转到catch模块中,去执行语句2,并可通过调用lasterr函数查询出错的原因。

例:

见教材中P70例4-4。

4.2.5循环结构

很多程序都可能会出现一些反复运行的部分,前面介绍的这些结构就很难实现了。

同其它高级语言一样,MatLab也提供了循环语句。

在循环语句中,被重复执行的部分称为循环体,控制循环语句是否继续的称为循环条件。

在MatLab中有两种循环结构,即所谓的for循环和while循环。

1.for循环

for循环语句有如下特点:

★它的循环判断条件通常是对循环次数的判断,即它的循环次数是预先设定好的;

★for循环语句可以嵌套使用。

不仅可以对for本身嵌套,还可以对其它的结构形式进行嵌套使用。

for循环的语法:

fori=表达式

语句1,……,语句n;

end

例:

求n个数的平方。

functionx=pfh(n)

fori=1:

n

x(i)=i^2;

end

2.while循环

与for循环不同,while循环的判断控制可以是逻辑判断语句,它的循环次数可以是一个不定数,因此比for循环有更广泛的用途。

while循环的格式:

while表达式

语句

end

在这个循环中只要表达式值不为false,程序就一直运行下去,语句被反复执行。

例1:

求几个数的阶乘。

functionm=jiech(x)

m=1;n=1;%给m和n赋初值

whilen<=x

m=m*n;

n=n+1;%n自增1

end

例2:

Fibonacci数组的元素满足Fibonacci规则:

;且

现要求该数组中第一个大于10000的元素。

a

(1)=1;a

(2)=1;i=2;

whilea(i)<=10000

a(i+1)=a(i-1)+a(i);%当现有元素仍小于10000时,继续执行。

i=i+1;

end;

i,a(i),

例3:

综合实例,打印九九乘法表(包含for循环的嵌套及if结构)。

clearall

clc

fori=1:

9

forj=1:

i

fprintf('%d*%d=%d,',j,i,i*j);

ifj==i

fprintf('\n');

end

end

end

思考题:

如果希望打印任意个数的乘法表怎么实现?

4.2.6输出格式的设置

在上面的程序中已经用到了输出语句fprintf和disp,对于这些函数的使用,一个最重要的内容就是对它们输出格式的设置,MatLab提供了多种可选的输出格式,方便了用户的使用。

下面表4-1就是一些常用输出格式的名称及其作用:

输出格式

说明

%c

输出单个字符(Singlecharacter)

%d

带符号十进制数[Decimalnotation(signed)]

%f

定点数(Fixed-pointnotation)

%e

指数记数制[Exponentialnotation(usingalowercaseeasin3.1415e+00)]

%E

指数记数制[Exponentialnotation(usinganuppercaseEasin3.1415E+00)]

%s

字符串(Stringofcharacters)

%u

无符号十进制数[Decimalnotation(unsigned)]

%i

与%d相同[Decimalnotation(signed)]

表4-1输出格式说明

4.3MatLab的人机交互命令

在MatLab中,还提供了一些特殊的程序控制语句,利用这些语句用可以实现以交互的方式输入/输出数据、提前终止循环、跳出子程序及显示M文件的执行过程等操作,方便用户与计算机之间及时地进行交互。

1.终止命令break和return

这两个命令在使用上的区别:

break是终止循环(专门针对for和while循环),而return是终止程序。

break必须在循环语句内,return可在任何位置。

例:

以只读的方式打开一个m文件(不运行)。

fid=fopen('fft.m','r');%以只读的方式打开fft.m文件

s='';%定义一个空字符串数组

while~feof(fid)

line=fgetl(fid);

ifisempty(line),break,end

s=strvcat(s,line);%将空格与字符串进行垂直连接

end

disp(s)

return函数的使用就不在此举例了。

2.继续命令continue

for或while循环中,一旦遇到continue语句时,程序立即跳到循环的end语句,即跳过在continue与end之间的所有命令。

例:

程序行数的统计。

fid=fopen('magic.m','r');

count=0;

while~feof(fid)

line=fgetl(fid);

ifisempty(line)|strncmp(line,'%',1)

continue

end

count=count+1;

end

disp(sprintf('%dlines',count));

3.等待用户反映命令pause

作用:

程序运行到此暂停,等待用户的响应。

格式:

pause或pause(n),n——暂停的时间。

例:

在九九乘法表程序的第一个fprintf语句后加上pause,看执行的效果。

4.echo命令

控制m文件中的命令在窗口是否显示。

通常m文件在执行过程中并不会在命令窗口中显示。

例:

在m文件中加入echo或echoon。

可以让程序运行到哪里就显示在哪里。

5.请求用户输入命令input

这是人机交互程序中一个非常重要的命令,利用它,程序将以交互的方式接收用户的输入数据或字符。

例:

将九九乘法表程序修改如下:

functionjjb(m)

n=input('请输入n的值:

');

fprintf('%d*%d的乘法表是:

\n',n,n);

fori=1:

n

forj=1:

i

fprintf('%d*%d=%d,',j,i,i*j);

ifj==i

fprintf('\n');

end

end

end

另外,keyboard命令也可以达到相似的功能。

6.输出命令disp、fprintf

fprintf——格式化数据输出命令,但它的功能有很多。

如将文本或数据输出到设备(屏幕)、串口或子系统中。

disp——显示文本或矩阵,这里的文本包括数学符号、希腊字母等。

例:

disp('CornOatsHay')

disp(rand(5,3))

关于fprintf输出格式见前面的5.2.6输出格式的设置。

4.4MatLab的符号计算

MatLab最初将其功能重点放在数值运算、矩阵运算等方面,因此,它的符号计算功能相对薄弱,但是,自从MatLab5.3开始,它这方面已经在有了很大的改进、提高和加强。

由于采用了全新的数据结构、面向对象编程及重载技术,使得MatLab的符号计算与数值计算在形式和风格上浑然统一,7.0以后的版本,符号计算功能更加强大,如提供了SymbolicMathToolbax,这使得MatLab的符号计算的功能可以与符号计算的专用语言Maple、Mathematic等相媲美。

MatLab符号运算方法:

1.MatLab本身已开发了许多符号运算函数,如:

符号表达式、符号矩阵、符号微积分、符号线形方程等;

2.MatLab开发了与其它符号计算语言的接口函数,如:

maple.m和map.m使之可以与Maple进行相互调用,博采众长,这样,MatLab符号计算的功能就进一步加强。

4.4.1符号变量的生成和使用

1.符号变量、符号表达式和符号方程的生成

在进行符号计算之前,首先要生成符号表达式等。

★用sym函数定义符号变量和符号表达式

格式见教材P81。

sym有两种用法:

一是用它定义一个符号变量,二是用它对整个表达式进行定义。

例1:

符号变量的定义。

a=sym

(2)/sym(5)+sym

(1)/sym(3);

比较b=sqrt

(2)和b=sqrt(sym

(2))两个式子的输出结果。

例2:

符号表达式的定义。

a=sym(‘a’);

b=sym(‘b’);

c=sym(‘c’);

x=sym(‘x’);

f=a*x^2+b*x+c

或者:

f=sym('a*x^2+b*x+c')

★用syms函数定义符号变量和符号表达式

从例2可以看出:

用sym定义符号变量还是比较麻烦,它每次只能定义一个符号变量,像上面有多个变量需要定义的话,不方便。

Syms则方便多了。

其格式为:

symsvar1var2var3……

例:

symsxyz

f=x^2+2*y^2+3*z^2

★符号方程式的生成

方程与函数的区别在于函数是一个由数字和变量组成的代数式,而方程则是由函数和等号组成的等式,但它们的定义却没有什么差别。

例:

equa1=sym('sin(x)+cos(x)=1')

2.符号变量的基本操作

★符号变量的寻找(findsym函数的使用)

例:

findsym(equa1)或findsym(f)等。

★符号表达式的精度(digits、vap函数)

digits函数用于显示或设定数值的精度;

例:

digits

digits(100)

vap函数进行可控精度运算,与digits也有些相似。

例:

vpa(pi)

vpa(pi,1000)

★数值型变量符号型变量的转换形式

对于任意数值变量,使用sym函数可以将其转换为4种形式的符号变量,它们是:

有理数形式:

sym(t)或sym(t,'r');

浮点数形式:

sym(t,'f');

指数形式:

sym(t,'e');

数值精度形式:

sym(t,'d')。

4.4.2符号表达式运算

MatLab提供的符号运算函数很多,如:

四则运算、合并同类项、因式分解、展开、化简等,灵活使用这些函数,可以给我们的工作带来便利。

下面举例说明。

1.符号表达式的四则运算

2.合并符号表达式的同类项(Collect函数)

例:

symsxy;

R1=collect((exp(x)+x)*(x+2))

R2=collect((x+y)*(x^2+y^2+1),y)

R3=collect([(x+1)*(y+1),x+y])

3.符号表达式的因式分解(factor函数)和展开(expand函数)

例1:

factor函数的使用。

factor(x^3-y^3)

例2:

expand函数的使用。

expand((x-2)*(x-4))

4.符号表达式的简化(simple函数或simplify函数)

例:

Simple函数的使用。

simple(2*cos(x)^2-sin(x)^2)

5.Subs函数的应用

使用subs函数可以将符号表达式中的字符型变量用数值型变量替换。

例:

subs函数的使用(这里用它来代替polyval函数计算多项式的值)。

symsx;

p=[123521];

P=poly2sym(p);%实际上polyval函

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1