数理统计及其在数学建模中的实践(使用MATLAB)
上QQ阅读APP看书,第一时间看更新

1.2 MATLAB基本程序结构

按照现代程序设计的观点,任何算法功能都可以通过三种基本程序结构来实现,这三种结构是:顺序结构、选择结构和循环结构.其中顺序结构是最基本的结构,它依照语句的自然顺序逐条地执行程序的各条语句.如果要根据输入数据的实际情况进行逻辑判断,对不同的结果进行不同的处理,可以使用选择结构.如果需要反复执行某些程序段落,可以使用循环结构.

1.顺序结构

顺序结构由两个程序模块串接而成.一个程序模块是完成一项独立功能的逻辑单元,它可以是一段程序、一个函数、或者是一条语句.在顺序结构中,这两个程序模块是顺序执行的,即先执行<程序模块1>,再执行<程序模块2>.实现顺序结构的方法非常简单,只需将程序语句顺序排列即可.

2.选择结构

在MATLAB中,选择结构可由两种语句来实现.

(1)if语句

if语句的最简单用法为:

if表达式;

程序模块;

end

if语句的另一种用法为:

if 表达式

程序模块1

else

程序模块2

end

例1-1 使用if语句判断学生的成绩是否及格.

程序:

当针对多个条件进行选择时,可以采用下面的格式:

if 表达式1

程序模块1

elseif 表达式2

程序模块2

elseif 表达式n

程序模块n

else

程序模块n+1

end

例1-2 将百分制的学生成绩转换为五等级制的成绩输出.

程序:

(2)switch语句

switch语句可以替代多分支的if语句,而且switch语句简洁明了,可读性更好.其格式为:

switch 表达式

case 数值1

程序模块1

case 数值2

程序模块2

otherwise

程序模块n

end

其中的otherwise模块可以省略.

switch语句的执行过程是:首先计算表达式的值,然后将其结果与每一个case后面的数值依次进行比较,如果相等,则执行该case的程序模块;如果都不相等,则执行otherwise模块中的语句.

例1-3 用switch…case开关结构将百分制的学生成绩转换为五等级制的成绩输出.

程序:

3.循环结构

循环结构即可以多次重复执行某一组语句,是计算机解决问题的主要手段.在MATLAB中,循环结构可以用两种语句结构实现.

(1)for…end循环结构.其格式为:

fori=V,循环体结构,end其中V为一个行向量,循环变量i每次从V中取一个数值,执行一次循环体的内容,如此下去,直到完成V中的所有分量,就自动结束循环体的执行.

例1-4 计算s=12+22+52.

程序:

若循环结构里还包含循环结构,则构成多重循环.

例1-5 设计一个九九乘法表.

程序:

(2)while…end循环结构.其格式为:

while (表达式)

循环结构体

end

例1-6 求MATLAB的相对精度

解 解题的思路是,让y值不断减小,直到MATLAB分不出1+y与1的差别为止.

程序:

y=1;while 1+y>1; y1=y; y=y/2;end,y1

说明

①for循环与while循环的区别是,for语句的循环次数是确定的,而while语句的循环次数是不确定的;

②一定要注意在循环结构体内设置“修改条件表达式的语句”,以免进入“死循环”;

③一旦出现死循环,在命令窗用<ctrl+c>键可使程序中止;

④注意程序的可读性.

小提示:关于break、continue、return的用法.

当程序运行过程中出现return命令时,程序停止运行.break、continue用在循环语句中,在循环语句中,如果遇到break命令时,程序结束当前的“for”或“while”循环,转而执行它下面最近的end以下的语句;遇到continue时,跳过当次循环而继续下一次的循环.例如,原定要循环5次,但在进入第3次循环时遇到了continue,则第3次的循环被跳过,而继续进行第4次、第5次的循环,循环体实际上只重复执行了4次.

程序:

运行这个程序并观察运行结果.然后再将程序中的语句continue改为break或return,观察运行结果有何变化.

4.M-文件

M文件是包含MATLAB代码的文件,M文件按其内容和功能可分为脚本M文件和函数M文件两大类.

(1)脚本M文件

脚本M文件是许多MATLAB代码按顺序组成的命令集合,不接受参数的输入和输出,与MATLAB工作区共享变量空间.脚本文件一般用来实现一个相对独立的功能,比如对某个数据集进行某种分析、绘图,求解方程等.前面的几个例题都是脚本文件的类型.

(2)函数M文件

MATLAB的M-文件是由function语句引导的,其基本格式如下:

function[输出形参列表]=函数名(输入形参列表)

注释说明语句段,由%引导;

函数体语句

函数文件需要在M-文件编辑器中编写,写完以后按照当前的搜索路径保存,以后就可以随时调用这个函数了.

与脚本M文件不同的是调用函数M文件时需要输入自变量的实际值.

编程实例

例1-7 定义一个函数f(x)=[sin(x)]2,其中x以“度”为单位,然后再调用该函数.

在M-文件编辑器内写入下面的文件:

functiony=sinsd(x)

%自变量x以“度”为单位

a=x/180∗pi;

y=sin(a).^2;

将上面的文件保存之后即可随时调用.

命令

t=sinsd(45)

t=

0.5000

命令

help sinsd

命令

t=sinsd([45,60])

t=

0.5000 0.7500

表明该函数对元素群运算有效,上面的语句相当于

命令

x=[45,60];t=sinsd(x)

t=

0.5000 0.7500

命令

x=[45,60;30,90];f=sinsd(x)

f=

0.5000 0.7500

0.2500 1.0000

例1-8 在MATLAB中,一个函数可以调用其他函数,也可以调用其自身,即递归调用.下面利用递归算法编写一个函数,用来计算斐波那契(Fibonacci)数列的第k项.

斐波那契数列:

1,1,2,3,5,8,13,21,…

M-函数文件:

functiona=my_fibo(k)

ifk==1|k==2,a=1;

else,a=my_fibo(k-1)+my_fibo(k-2);end

将这个文件写入M文件编辑器并以名称“my_fibo.m”保存,以后就可以调用这个函数.

递归算法无疑是解决某一类问题的有效方法,但不宜滥用,因为它的运算速度往往很慢.

命令

tic,n=my_fibo(26),toc

n=

121393

elapsed_time=

34.4290

例1-9 可变输入变量个数的函数

MATLAB提供的conv()函数可用来求两个多项式的乘积.对于多个多项式的连乘,则不能直接使用此函数,需要用该函数嵌套使用,用起来很不方便.下面编写一个MATLAB函数,使它能直接处理任意多个多项式的乘积问题.

M-函数文件:

形参varargin是一个特殊的字符串,它把输入变量列表转换成一个元胞数组,每一个输入变量都是这个元胞数组的一个元素.下面调用这个函数,求解

d=(x4+2x3+4x2+5)(x+2)(x2+2x+3).

命令

p=[1,2,4,0,5];q=[1,2];f=[1,2,3];

d=convs(p,q,f)

d=

1 6 19 36 45 44 35 30

命令

convs(p,q,f,[1,1],[1,3],[1,1])

ans=

1 11 56 176 376 578 678 648 527 31590