资源描述
实验四
第3章 MATLAB程序设计
Matlab 作为一种广泛应用于科学计算的工具软件,不仅具有强大的数值计算能力、丰富的绘图功能及可以以人机交互式的命令行的方式工作;作为一种高级语言,同时也可以与 C、FORTRAN 等高级语言一样进行程序设计. 而且,由于MATLAB所具有的强大功能,与上述几种高级语言比较,程序文件的编制有许多无法比拟的优点.
利用 Matlab 的程序控制功能,将相关 Matlab 命令编成程序存储在一个文件中(M 文件),然后在命令窗口中运行该文件,Matlab 就会自动依次执行文件中的命令,直到全部命令执行完毕.
■ 例1 用 mesh 绘制半径为 3 的球 (注意两种方式的区别)
命令行方式:在命令窗口, 编程方式:
一行一行执行. 新建一个M 文件 qiu.m如下:
>> u=[0:pi/60:2*pi];
>> v=[0:pi/60:pi];
>> [U,V]=meshgrid(u,v);
>> R=3;
>> X=R*sin(V).*cos(U);
>> Y=R*sin(V).*sin(U);
>> Z=R*cos(V);
>> mesh(X,Y,Z);
>> axis equal;
u=[0:pi/60:2*pi];
v=[0:pi/60:pi];
[U,V]=meshgrid(u,v);
R=3;
X=R*sin(V).*cos(U);
Y=R*sin(V).*sin(U); Z=R*cos(V);
mesh(X,Y,Z);
axis equal;
保存后,在命令窗口输入 qiu,即可执行该 M 文件.
第一节 M 文件
一、 M文件介绍
l 用 Matlab 语言编写的程序称为 M 文件.
l M 文件以 .m 为扩展名.
l M 文件是由若干 Matlab 命令组合在一起构成的,它可以完成某些操作,也可以实现某种算法.(如例1)
l 文件的命名规则与变量相同!文件名应尽量与程序要表达的意义相符合,以方便今后调用.(如例1)
二、 M文件的建立、打开与保存
M文件是文本文件,可以用任何文本编辑器来建立和编辑,通常使用Matlab自带的M文件编辑器.
① 新建一个M文件
l 菜单操作 ( File→ New→ M-File )
l 命令操作 ( edit M 文件名 )
l 命令按钮 ( 快捷键 )
② 打开已有的 M 文件
l 菜单操作 ( File →Open )
l 命令操作 ( edit M 文件名 )
l 命令按钮 ( 快捷键 )
l 双击M文件 (在当前目录窗口)
③ 保存M 文件
l 菜单操作 ( File →Save )
l 命令按钮 ( 快捷键 )
三、 M 文件分类(根据调用方式的不同)
l Script:脚本文件/命令文件(可以直接运行的M文件)
命令文件就是命令行的简单叠加,matlab会自动按顺序执行文件中的命令.这样就解决了用户在命令窗口中运行许多命令的麻烦,还可以避免用户做许多重复性的工作.(如例1)
l Function:函数文件
函数文件主要用以解决参数传递和函数调用的问题.
(1) 第一行必须指定函数名、输入变量 (参数)和输出变量(参数).输入参数是从MATLAB的工作空间复制到函数工作空间的变量.第一行举例如下:
function [输出形参表] = name(输入形参表)
(2) 一个函数可以有0个、一个或几个输入参数和返回值.
当输出形参表的参数个数大于2时,[ ]不可缺省!两个输出(或输入)参数之间用“,”分割.
(3) 建议函数名和文件名一样.调用时所用的变量并不需要与函数文件中定义的变量有相同的名字.
■ 例2 比较下列两个程序,注意命令文件(以dd1命名)与函数文件(以dd2命名)的区别与联系.
function y=dd2(x,n)
y(1)=x ;
for k=1:n
x=1/(x+1); y(k)=x;
end
x=input(‘输入初值x=’);
n=input(‘输入迭代次数=’);
y(1)=x ;
for k=1:n
x=1/(x+1); y(k)=x;
end
y
四、 两类文件的区别
l 函数文件的第一行必须包含字 function,命令文件没有这种要求.因此,没有这样第一行的M文件是命令文件.
l 命令文件没有输入参数,也不返回输出参数,而函数文件可以带输入参数,也可以返回输出参数;
l 命令文件对matlab工作空间中的变量进行操作,文件中所有命令的执行结果也完全返回到工作空间中,而函数文件中定义的变量为局部变量,当函数文件执行完毕时,这些变量被清除.
l 命令文件可以直接运行.在MATLAB命令窗口输入命令文件的名字,就会顺序执行命令文件中的命令,而函数文件通常不能直接运行,而要以函数调用的方式运行.
l 函数文件可以建立函数,以方便其他函数调用.
■例3 建立函数
解:程序如下:
function y=f (x)
;
以文件名f.m保存.
五、M文件的调用
对已存在的M文件
l 命令文件用F5运行(必须先打开要运行的m文件)或在命令窗口直接输入该文件名即可;如例1
>>qiu
l 函数文件调用的一般格式
[输出实参数表]=函数名(输入实参数表)
① 函数调用时各实参数出现的顺序、个数应与函数定义时形式参数的顺序、个数一致,否则出错;
② 函数调用时,先将实参数传递给形式参数,从而实现参数的传递,然后再执行函数的功能.如例2,例3
>>y=dd2(1,10) , >>y=f(1)
③ 当输出实参数表的参数个数大于2时,[ ]不可缺省!
④ 有输入参数时,不可用F5调用.
练习 将例1、例2和例3的程序在matlab中建立、保存、运行.ling
第二节 程序控制结构
程序控制结构有三种:顺序结构、选择结构、循环结构.任何复杂的程序都可以由这三种基本结构构成.Matlab提供了实现控制结构的语句,利用这些语句可以编写解决实际问题的程序.
一、顺序结构
顺序结构是指按照程序中语句的排列顺序从上到下依次执行,直到程序的最后一个语句如例1的qiu文件.这是最简单的一种程序结构.一般涉及数据的输入、计算或处理、数据的输出等内容.
1. 数据的输入
通过input命令来接收从终端输入的内容,它也可以显示文本和提示.
命令集14 输入命令
input(out ,in) 在屏幕上显示出字符串out的文本并等待终端的输入(在命令窗口从键盘输入).如果变量in是's',则输入的内容以字符串的形式进行保存;若输入的是数、数学表达式,则in不能出现.其格式如下
变量名= input('提示信息')
变量名= input('提示信息','s')
如
>>x=input('输入初值x=')
此时从键盘输入x的值即可.若输入的是无效信息,matlab将显示错误信息,并等待再次输入,直到输入正确为止;若没有任何输入,而是直接回车,x将取得一个空矩阵.
■ 例4 注意in的输入方式
>> xm=input('What''s your name?','s')
What's your name?syx
xm =
syx
>> xm=input('What''s your name?')
What's your name?syx
??? Error using ==> input
Undefined function or variable 'syx'.
What's your name? 'syx'
xm =
syx
2. 数据的输出
可以通过简单地输入变量的名字来显示数字矩阵或者字符串向量的内容,结果将显示出变量的名字和内容.
另一种显示变量的值就是使用命令disp.使用它只显示出变量的内容,这是有用的,特别是在字符串的应用中.
命令集15 显示命令
disp(A) 显示矩阵A的内容,如果A是字符串,则显示出它的文本.
■ 例5 比较不同的输出方法及输出结果的表达方式
>> A=magic(3);disp(A); >> disp(ones(3))
8 1 6 1 1 1
3 5 7 1 1 1
4 9 2 1 1 1
>> A >> A='Good afternoon';disp(A)
A = Good afternoon
8 1 6 >> disp('Hi,Tom')
3 5 7 Hi,Tom
4 9 2
习题1 编写M文件,对任意的a,b,c求方程的根.
二、循环结构
循环结构是按照给定的条件,重复执行指定的语句. Matlab用于实现循环结构的语句有for — end语句和while — end语句.
1.for — end语句
for语句的格式为:
for 循环变量=表达式1 : 表达式2 : 表达式3
循环体语句
end
其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值.步长为1时,表达式2可以省略.
■例6 1. 求1+2+…+100 ; 2. 求1+2+…+n .
1. 解: 2. 解
function s=mysum(n)
s=0;
for i=1:n
s=s+i;
end
s=0;
for i=1:100
s=s+i;
end
s
■例7 1. 求初始值为1,任意等差数列的和?
2. 求初始值任意,任意等差数列的和?
1. 解: 2. 解
% c为首项,d为公差,
% n为求和项数
function s=mysumdc(c,n,d)
s=0;
for i=c:d: c+(n-1)*d
s=s+i;
end
% d为公差,n为求和项数
function s=dc(n,d)
s=0;
for i=1:d:1+(n-1)*d
s=s+i;
end
■例8 已知 ,求y的值.
n=input(‘n=’); i=1:n;
y=sum(1./i.^2);
y
n=input(‘n=’); y=0 ;
for i=1:n
y=y+1/i/i;
end
y
解:程序如下:
运行并比较两程序.
循环语句应用时应注意:
l 循环语句可以嵌套使用;
l 不能在 for — end 循环体内改变循环变量的值;
l 为了提高代码的运行效率,应尽可能提高代码的向量化程度,避免 for — end 循环的使用,如例8;
l 如果预先就知道循环的次数,则可以采用 for — end循环;否则,如果预先无法确定循环的次数,则可以使用 while — end 循环.
2. while — end语句
while-end语句的一般格式为:
while (条件)
循环体语句
end
其执行过程为:若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环.
■例9 使用while-end结构计算1+2+3+…+100 .
s=0;
for i=1:100
s=s+i;
end
s
s=0;
i=1;
while i<=100
s=s+i;
i=i+1;
end
s
解:
注意比较两程序的异同点!
■例10 计算 Matlab 中 eps 值 (exp1.m)
num=0; EPS=1;
while (1+EPS)>1
EPS=EPS/2;
num=num+1;
end
EPS,num
解:
习题2 阅读下列程序,写出结果;并在计算机上运行验证.
(1) bljh.m
x=input(‘Input x please:’);
y= input(‘Input y please:’);
z=x; x=y; y=z;
disp(x); disp(y);
(其中x=[ 12,3,3,4;43,6,3,-54 ],y=1 : 8 )
(2) xlsum1.m
n=input('n=');
k=1:2:2*n-1;
y=sum(1./k)
(3) xlsum2.m
n=input('n=');
y=0;
for k=1:2:2*n-1
y=y+1/k;
end
y
(4) Vander1.m
t=[-1;2;1;3;5];n=length(t);
A=ones(n);
for j= n -1: -1:1
A(: , j)=t.*A(: , j+1);
end
A
(5) Vander2.m
t=[-1;2;1;3;5];n=max(size(t));
A=ones(n);
for j= 1: n
for i=1: n
A(i , j)=t(i)^(n-j);
end
end
A
(6) ftx.m
function s=ftx(a,b,n)
h=(b-a)/n;
x=a:h:b;
f=exp(-0.5*x).*sin(x+pi/6);
s=(2*sum(f)-f(1)-f(n+1))*h/2;
习题3
(一) 将习题2的(1)~(4)题改写为函数文件并在计算机上运行.
(二) 利用秦九韶算法编写M文件,实现任意的多项式
的求值.
12
展开阅读全文