附录A Matlab软件入门
A.1 Matlab帮助的使用
1. help
help %帮助总揽
help elfun %关于基本函数的帮助信息
help exp %指数函数exp的详细信息
2.lookfor指令
当要查找具有某种功能但又不知道准确名字的指令时,help的能力就不够了,lookfor可以根据用户提供的完整或不完整的关键词,去搜索出一组与之相关的指令。lookfor integral %查找有关积分的指令
lookfor fourier %查找能进行傅里叶变换的指令
3.超文本格式的帮助文件
在Matlab 中,关于一个函数的帮助信息可以用doc 命令以超文本的方式给出,如doc
doc doc
doc eig %eig求矩阵的特征值和特征向量
4.pdf帮助文件
可从MathWorks网站上下载有关的pdf帮助文件。
A.2 数据的输入
1.简单矩阵的输入
(1)要直接输入矩阵时,矩阵一行中的元素用空格或逗号分隔;矩阵行与行之间
用分号“;”隔离,整个矩阵放在方括号“[ ]”里。
A=[1,2,3;4,5,6;7,8,9]
说明:指令执行后,矩阵A被保存在Matlab的工作间中,以备后用。如果用户不
用clear指令清除它,或对它进行重新赋值,那么该矩阵会一直保存在工作间中,直到本次指令窗关闭为止。
(2)矩阵的分行输入
A=[1,2,3
4,5,6
7,8,9]
2.特殊变量
ans 用于结果的缺省变量名
pi 圆周率
eps 计算机的最小数
flops 浮点运算次数
inf 无穷大如1/0
NaN 不定量如0/0
i(j)i=j=
nargin 所用函数的输入变量数目
nargout 所用函数的输出变量数目
realmin 最小可用正实数
realmax 最大可用正实数
3.特殊向量和特殊矩阵
(1)特殊向量
t=[0:0.1:10] %产生从0到10的行向量,元素之间间隔为0.1
t=linspace(n1,n2,n)
%产生n1和n2之间线性均匀分布的n个数(缺省n时,产生100个数)
t=logspace(n1,n2,n) (缺省n时,产生50个数)
%在和之间按照对数距离等间距产生n个数。
(2)特殊矩阵
i)单位矩阵
eye(m),
eye(m,n) 可得到一个可允许的最大单位矩阵而其余处补0,
eye(size(a)) 可以得到与矩阵a同样大小的单位矩阵。
ii)所有元素为1的矩阵
ones(n),ones(size(a)),ones(m,n)。
iii)所有元素为0的矩阵
zeros(n),zeros(m,n)。
iv)空矩阵是一个特殊矩阵,这在线性代数中是不存在的。
例如q=[ ]
矩阵q在工作空间之中,但它的大小为零。通过空矩阵的办法可以删去行与列。
ⅴ)随机数矩阵
rand(m,n) 产生m×n矩阵,其中的元素是服从[0,1]上均匀分布的随机数。
normrnd(mu,sigma,m,n)产生m×n矩阵,其中的元素是服从均值为mu,标准差为sigma的正态分布的随机数。
exprnd(mu,m,n) 产生m×n矩阵,其中的元素是服从均值为mu的指数分布的随机
数。
poissrnd(mu,m,n) 产生m×n矩阵,其中的元素是服从均值为mu的泊松(Poisson)
分布的随机数。
unifrnd(a,b,m,n) 产生m×n矩阵,其中的元素是服从区间[a,b]上均匀分布的随机数。ⅵ)随机置换
randperm(n)产生1到n的一个随机全排列。
perms([1:n])产生1到n的所有全排列。
A.3 绘图命令
A.3.1 二维绘图命令
二维绘图的基本命令有plot,loglog,semilogx,semilogy和polar。它们的使用方
法基本相同,其不同特点是在不同的坐标中绘制图形。plot命令使用线性坐标空间绘制图形;loglog命令在两个对数坐标空间中绘制图形;而semilogx(或semilogy)命令使用轴(或轴)为对数刻度,另外一个轴为线性刻度的坐标空间绘制图形;polar使用
极坐标空间绘制图形。
二维绘图命令plot为了适应各种绘图需要,提供了用于控制线色、数据点和线型
的3组基本参数。它的使用格式如下:
plot(x,y,’color_point_linestyle’)
该命令是绘制y对应x的轨迹的命令。y与x均为向量,且具有相同的元素个数。
用字符串‘color_point_linestyle’完成对上面3个参数的设置。线色(r-red,g-green,b-blue,w-white,k-black,i-invisible,y-yellow),数据点(.,o,x,+,*,S,H,D,
V,^,>,<,p)与线型(-,-.,--,:)都可以根据需要适当选择。
当plot(x,y)中的x和y均为m×n矩阵时,plot命令将绘制n条曲线。
plot(t,[x1,x2,x3])在同一坐标轴内同时绘制三条曲线。
如果多重曲线对应不同的向量绘制,可使用命令
plot(t1,x1,t2,x2,t3,x3)
式中x1对应t1,x2对应t2等等。在这种情况下,t1,t2和t3可以具有不同的元素
个数,但要求x1,x2和x3必须分别与t1,t2和t3具有相同的元素个数。
subplot 命令使得在一个屏幕上可以分开显示n个不同坐标系,且可分别在每一个
坐标系中绘制曲线。其命令格式如下
subplot(r,c,p)
该命令将屏幕分成r×c个子窗口,而p表示激活第p个子窗口。窗口的排号是从左到右,自上而下。
在图形绘制完毕后,执行如下命令可以再在图中加入标题、标号、说明和分格线等。
这些命令有title,xlabel,ylabel,text,gtext等。它们的命令格式如下
title(‘My Title’),xlabel(‘My X-axis Label’),ylabel(‘My Y-axis Label’),
text(x,y,'Text for annotation'),
gtext('Text for annotation'),grid
gtext命令是使用鼠标器定位的文字注释命令。当输入命令后,可以在屏幕上得到一
个光标,然后使用鼠标器控制它的位置。按鼠标器的左键,即可确定文字设定的位置。hold on 是图形保持命令,可以把当前图形保持在屏幕上不变,同时在这个坐标系
内绘制另外一个图形。hold 命令是一个交替转换命令,即执行一次,转变一个状态(相当于hold on、hold off)。
A.3.2 显函数,符号函数或隐函数的绘图
fplot(fun,lims)绘制由字符串fun指定函数名的函数在x轴区间为lims=[xmin, xmax]
的函数图。若lims=[xmin,xmax,ymin,ymax],则y轴也被限制。
例A.1 画的图形。
解(1)首先用M文件fun1.m定义函数如下
function y=fun1(x);
if x<1
y=x+1;
else
y=1+1./x;
end
在matlab命令窗口输入
fplot(‘fun1’,[-3,3])
就可画出函数的图形。
(2)这里也可以使用匿名函数,编写程序如下
fun1=@(x) (x+1)*(x<1)+(1+1/x)*(x>=1);
fplot(fun1,[-3,3])
ezplot(f)绘制符号函数f(x)的图形,x轴的近似范围为。
ezplot(f,[xmin,xmax])使用输入参数来代替默认横坐标范围。
例A.2 画出函数的图形
解ezplot('tan(x)')
ezplot也可以绘制隐函数的图形。
例A.3 画出椭圆的图形。
解ezplot('x^2+y^2/4=1')
A.3.3三维图形
在实际工程计算中,最常用的三维绘图是三维曲线图、三维网格图和三维曲面图3
种基本类型。与此对应,Matlab也提供了一些三维基本绘图命令,如三维曲线命令plot3,三维网格图命令mesh和三维表面图命令surf。
1. 三维曲线
plot3(x,y,z)通过描点连线画出曲线,这里x,y,z都是n维向量,分别表示该曲线上点
集的横坐标、纵坐标、竖坐标。
例A.4 在区间画出参数曲线,,,并分别标
注。
t=0:pi/50:10*pi;
plot3(sin(t),cos(t),t)
xlabel('sin(t)'), ylabel('cos(t)'), zlabel('t')
2. 网格图
命令mesh(x,y,z)画网格曲面。这里x,y,z是三个同维数的数据矩阵,分别表示数据
点的横坐标、纵坐标、竖坐标,命令mesh(x,y,z)将该数据点在空间中描出,并连成网格。例A.5 绘制二元函数
的三维网格图。
解x=-3:0.1:3;y=-5:0.1:5;
x1=ones(size(y'))*x;y1=y'*ones(size(x));
[x2,y2]=meshgrid(x,y);
z1=(sin(x1.*y1)+eps)./(x1.*y1+eps);
z2=(sin(x2.*y2)+eps)./(x2.*y2+eps);
subplot(1,2,1),mesh(x1,y1,z1)
subplot(1,2,2),mesh(x2,y2,z2)
3. 表面图
命令surf(x,y,z)画三维表面图,这里x,y,z是三个同维数的数据矩阵,分别表示数据
点的横坐标、纵坐标、竖坐标。
例A.6 绘制二元函数
的三维表面图。
解[x,y]=meshgrid([-3:0.2:3]);
z=(sin(x.*y)+eps)./(x.*y+eps);
surf(x,y,z)
4. 旋转曲面
例A.7 画出
绕轴旋转一周形成的旋转曲面。
解:Matlab程序如下。
x=0:10:600;
[X,Y,Z]=cylinder(30*exp(-x/400).*sin((x+25*pi)/100)+130);
surf(X,Y,Z)
例A.8 画出绕轴旋转一周所形成的旋转曲面。
解因为这里的函数是隐函数,化成显函数后有两支,必须使用参数方程,旋转面
的参数方程为
,
其中。画图的Matlab程序如下。
alpha=[0:0.1:2*pi]'; beta=0:0.1:2*pi;
x=4*cos(alpha)*ones(size(beta));
y=(5+4*sin(alpha))*cos(beta);
z=(5+4*sin(alpha))*sin(beta);
surf(x,y,z)
画图的Matlab程序也可以写成
x=@(alpha,beta) 4*cos(alpha);
y=@(alpha,beta) (5+4*sin(alpha))*cos(beta);
z=@(alpha,beta) (5+4*sin(alpha))*sin(beta);
ezsurf(x,y,z)
5. 其它二次曲面
Matlab中使用绘图命令ezmesh或ezsurf也很方便,只需要把曲面方程写成两个变
量的显函数方程或参数方程即可。
例A.9 画出下列曲面的图形
(1)旋转单叶双曲面;
(2)旋转双叶双曲面;
(3)抛物柱面;
(4)椭圆锥面;
(5)椭球面;
(6)马鞍面;
(7)椭圆柱面.
解对于旋转面,如果母线的方程可以表示成关于旋转轴变量的显式函数,则可以
直接使用Matlab工具箱中的命令cylinder,否则必须把旋转面化成参数方程,然后使用ezmesh或ezsurf命令绘图。对于其它的二次曲面,如果可以写成显函数直接使用命令ezmesh或ezsurf,否则必须先化成参数方程。
(1)x=@(s,t) 3*sec(s)*cos(t);
y=@(s,t) 3*sec(s)*sin(t);
z=@(s,t) 2*tan(s);
ezmesh(x,y,z)
(2)x=@(s,t) 3*sec(s);
y=@(s,t) 2*tan(s)*cos(t);
z=@(s,t) 2*tan(s)*sin(t);
ezmesh(x,y,z)
(3)ezsurf(@(y,z) y.^2/2,50)
(4)x=@(s,t) 3*tan(s)*cos(t);
y=@(s,t) 2*tan(s)*sin(t);
z=@(s,t) tan(s);
ezsurf(x,y,z)
(5)ellipsoid(0,0,0,3,2,sqrt(6))
(6)ezsurf(@(x,y)x*y)
(7)x=@(s,t) 3*cos(s);
y=@(s,t) 2*sin(s);
z=@(s,t) t;
ezmesh(x,y,z)
A.3.4 3-D可视化图形
给出Matlab帮助中的一个例子。
例A.10
[x,y,z,v] = flow;
isosurface(x,y,z,v);
例A.11 画出的示意图。
x=1:20; y=1:10; z=-10:10;
[x,y,z]=meshgrid(x,y,z);
v=x.^2.*y.*(z+1);
isosurface(x,y,z,v)
A.4 Matlab在高等数学中应用
A.4.1 求极限
Matlab求极限的命令为
limit(expr, x, a)
limit(expr, a)
limit(expr)
limit(expr, x, a, 'left')
limit(expr, x, a, 'right')
其中limit(expr, x, a)表示求符号表达式expr关于符号变量x趋近于a时的极限,limit(expr) 求表示缺省变量趋近于0时的极限。
例A.12 求下列表达式的极限
(1),(2).
解(1)syms x, b=limit((sqrt(1+x^2)-1)/(1-cos(x)))
(2)syms x a, b=limit((1+a/x)^x,x,inf')
A.4.2 求导数
Matlab的求导数命令为
diff(expr)
diff(expr, v)
diff(expr, sym('v'))
diff(expr, n)
diff(expr, v, n)
diff(expr, n, v)
其中diff(expr)表示求表达式expr关于默认变量的1阶导数,diff(expr, v, n)和diff(expr, n, v)都表示求表达式expr关于符号变量v的n阶导数。
例A.13 (1)求函数的三阶导数;
(2)求向量的一阶向前差分。
解:(1)syms x
dy=diff(log((x+2)/(1-x)),3);
dy=simple(dy) %对符号函数进行化简
pretty(dy) %Latex格式显示
(2)a=[0,0.5,2,4]; da=diff(a)
A.4.3 求极值
例A.14 求函数的极值点,并画出函数的图形。
解对求导,然后令,解方程则可求得函数的极值点。
计算的Matlab程序如下
syms x
y=x^3+6*x^2+8*x-1; dy=diff(y);
dy_zero=solve(dy), dy_zero_num=double(dy_zero) %变成数值类型ezplot(y) %符号函数画图
A.4.4 求积分
1. 求不定积分
Matlab求符号函数不定积分的命令为
int(expr)
int(expr, v)
例A.15 求不定积分
.
解syms x
I=int(1/(1+sqrt(1-x^2)));
pretty(I)
2. 求定积分
(1)求定积分的符号解
Matlab求符号函数的定积分命令为
int(expr, a, b)
int(expr, v, a, b)
例A.16 求定积分
解syms x
I=int(cos(x)*cos(2*x),-pi/2,pi/2)
(2)求定积分的数值解
例A.17 求下列积分的数值解
ⅰ);
ⅱ),;
ⅲ),.
解ⅰ)做变量替换,,得
输入
I=quadl(@(t) (t-3*t.^2+2*t.^3).^(-1/3),eps,0.5)
得到I=1.4396。
ⅱ)输入
I=dblquad(@(x,y)sqrt(1-x.^2-y.^2).*(x.^2+y.^2<=x),0,1,-0.5,0.5)
得到I= 0.6028。
(3)输入
fun3=@(x,y,z)z.^2*log(x.^2+y.^2+z.^2+1)./(x.^2+y.^2+z.^2+1).*(z>=0 &...
z<=sqrt(1-x.^2-y.^2)); %该语句使用了续行符...
I=triplequad(fun3,-1,1,-1,1,0,1)
得到I= 0.1273。
A.5 Matlab在线性代数中的应用
A.5.1 向量组的线性相关性
求列向量组A的一个最大线性无关组可用命令rref(A)将A化成行最简形,其中单
位向量对应的列向量即为最大线性无关组所含向量,其它列向量的坐标即为其对应向量用最大线性无关组线性表示的系数。
例A.18 求下列矩阵列向量组的一个最大无关组。
解编写Matlab程序如下
format rat %数据是有理分数表示
a=[1,-2,-1,0,2;-2,4,2,6,-6;2,-1,0,2,3;3,3,3,3,4];
b=rref(a)
求得
b = 1 0 1/3 0 16/3
0 1 2/3 0 -1/9
0 0 0 1 -1/3
0 0 0 0 0
记矩阵的五个列向量依次为、、、、,则、、是列向
量组的一个最大无关组。且有
,.
例A.19 设,,
验证是的一个基,并把用这个基线性表示。
解编写Matlab程序如下
format rat
a=[2,2,-1;2,-1,2;-1,2,2];b=[1,4;0,3;-4,2];
c=rref([a,b])
求得
c= 1 0 0 2/3 4/3
0 1 0 -2/3 1
0 0 1 -1 2/3
说明是的一个基,且有,。
A.5.2 齐次线性方程组
在Matlab中,函数null用来求解零空间,即满足的解空间,实际上是求出
解空间的一组基(基础解系)。格式如下
z=null(A) %z的列向量为方程组的正交规范基,满足。
z=null(A,’r’) %z的列向量是方程的有理基。
例A.20 求方程组的通解
解编写程序如下
format rat
a=[1,2,2,1;2,1,-2,-2;1,-1,-4,-3]
b=null(a,'r') %求有理基
syms k1 k2
x=k1*b(:,1)+k2*b(:,2) %写出方程组的通解
求得基础解系为
,
通解为,。
A.5.3 非齐次线性方程组
Matlab中解非齐次线性方程组可以使用“\”。虽然表面上只是一个简简单单的符号,
而它的内部却包含许许多多的自适应算法,如对超定方程(无解)用最小二乘法,对欠定方程(多解)它将给出范数最小的一个解。
另外求解欠定方程组(多解)可以使用求矩阵A的行最简形命令rref(A),求出所
有的基础解系。
例A.21 求超定方程组
解编写程序如下
a=[2,4;3,-5;1,2;2,1];
b=[11;3;6;7];
solution=a\b
求得最小二乘解为。
上面解超定方程组的“\”可以用伪逆命令pinv代替,且pinv的使用范围比“\”
更加广泛,pinv也给出最小二乘解或最小范数解。
例A.22 用最小二乘解法解方程组
解编写程序如下
format rat
a=[1,1,0;1,0,1;1,1,1;1,2,-1];
b=[1;2;0;-1];
x1=a\b %这里\和pinv是等价的
x2=pinv(a)*b
求得最小二乘解为
,,.
例A.23 求解方程组
解编写程序如下
format rat
a=[1,-1,-1,1,0;1,-1,1,-3,1;1,-1,-2,3,-1/2];
b=rref(a)
求得
b= 1 -1 0 -1 1/2
0 0 1 -2 1/2
0 0 0 0 0
故方程组有解,并有
因而方程组的通解为
.
A.5.4 相似矩阵及二次型
例A.24 求一个正交变换,把二次型
化为标准形。
解二次型的矩阵为
编写如下程序
A=[0,1,1,-1;1,0,-1,1;1,-1,0,1;-1,1,1,0];
[P,D]=eig(A)
求得
P= 0.7887 0.2113 0.5000 -0.2887
0.2113 0.7887 -0.5000 0.2887
0.5774 -0.5774 -0.5000 0.2887
0 0 0.5000 0.8660
D= 1.0000 0 0 0
0 1.0000 0 0
0 0 -3.0000 0
0 0 0 1.0000
就是所求的正交矩阵,使得,令,其中,
,化简后的二次型为。
例A.25 判别二次型的正定性,并求正交变换把二
次型化成标准型。
解Matlab程序如下
a=[2 -2 0; -2 4 0; 0 0 5];
b=eig(a);
if all(b>0)
fprintf('二次型正定\n');
else
fprintf('二次型非正定\n');
end
[c,d]=eig(a) %c为正交变换的变换矩阵
A.6 数据处理
A.6.1 Matlab中的默认数据文件mat文件
例A.26 把Matlab工作空间中的数据矩阵a,b,c保存到数据文件data1.mat中。save data1 a b c
注:Matlab中的默认数据文件mat文件可以省略后缀名。
例A.27 把data1.mat中的所有数据加载到Matlab工作空间中。
load data1
A.6.2 纯文本文件
可以把word文档中整行整列的数据粘贴到纯文本文件,然后调入到Matlab工作空间中。
例A.28 把纯文本文件data2.txt加载到工作空间。
a=load(‘data2.txt’);
或者是
a=textread(‘data2.txt’);
例A.29 使用dlmwrite命令把矩阵b保存到纯文本文件data3.txt。
dlmwrite(‘data3.txt’,b)
例A.30 生成服从标准正态分布随机数的矩阵,然后用fprintf命令保存
到纯文本文件data4.txt。
解clc, clear
fid=fopen('data4.txt','w');
a=normrnd(0,1,100,200);
fprintf(fid,'%f\n',a');
fclose(fid);
注:对于高维矩阵,用dlmwrite构造的纯文本文件,Lingo软件不识别;为了Lingo 软件识别,纯文本文件必须用fprintf构造,而且数据之间的分割符为“\n”。
A.6.3 Excel文件
例A.31 把一个矩阵写到Excel文件data5.xls表单Sheet2中B2开始的域中。
a=rand(5,10);
xlswrite('data5.xls',a,'Sheet2','B2')
例A.32 把例A.31生成的Excel文件data5.xls中,表单Sheet2的域“C3:F6”中
的数据赋给b。
b=xlsread('data5.xls','Sheet2','C3:F6')
A.6.4 字符串数据
例A.33 统计下列五行字符串中字符a、g、c、t出现的频数
1.aggcacggaaaaacgggaataacggaggaggacttggcacggcattacacggagg
2.cggaggacaaacgggatggcggtattggaggtggcggactgttcgggga
3.gggacggatacggattctggccacggacggaaaggaggacacggcggacataca
4.atggataacggaaacaaaccagacaaacttcggtagaaatacagaagctta
5.cggctggcggacaacggactggcggattccaaaaacggaggaggcggacggaggc
解把上述五行复制到一个纯文本数据文件shuju.txt中,编写如下程序
clc
fid=fopen('shuju.txt','r');
i=1;
while (~feof(fid))
data=fgetl(fid);
a=length(find(data==97));
b=length(find(data==99));
c=length(find(data==103));
d=length(find(data==116));
e=length(find(data>=97&data<=122));
f(i,:)=[a b c d e a+b+c+d];
i=i+1;
end
f, he=sum(f)
dlmwrite('pinshu.txt',f); dlmwrite('pinshu.txt',he,'-append');
fclose(fid);
其它的一些字符串处理命令有strcmp,strfind等。
A.6.5 图像文件
例A.34 把一个比较大的bmp图像文件data6.bmp,转化成比较小的jpg文件,命
名成data7.jpg,并显示。
解a=imread('data6.bmp');
imshow(a)
imwrite(a,'data7.jpg');
figure, imshow('data7.jpg')
例A.35 生成10幅彩色jpg文件,依次命名成jpq1.jpg,.,jpg10.jpg。
clc, clear
for i=1:10
str=['jpg',int2str(i),'.jpg'];
a(:,:,1)=rand(500); a(:,:,2)=rand(500)+100; a(:,:,3)=rand(500)+200;
imwrite(a,str);
end
ed2k://|file|Mathworks.Matlab.R2011a.ISO-TBE.iso|5195184128|c4275e0bbdfc8deb0f68eda8fae9 2368|h=c6yru6ad4wufr7b2ukruzy5aolqd27q5|/
num1=[13]; den1=conv([1,1],[1,0]); G1=tf(num1,den1); num2=[5.096,13]; ssys1=conv([1,1],[1,0]); ssys2=conv([0.098,1],[1]); den2=conv( ssys1,ssys2); G2=tf(num2,den2); figure(1) margin(G1); hold on margin(G2); num1=[13]; den1=conv([1,1],[1,0]); G1=tf(num1,den1); num2=[5.096,13]; ssys1=conv([1,1],[1,0]); ssys2=conv([0.098,1],[1]); den2=conv( ssys1,ssys2); G2=tf(num2,den2); figure(1) margin(G1); hold on margin(G2); num=[4.56,10]; ssys1=conv([1,1],[1,0]); ssys2=conv([0.114,1],[1]); den=conv( ssys1,ssys2); G=tf(num,den); figure(1) bode(G) num=[4.56,10]; ssys1=conv([1,1],[1,0]); ssys2=conv([0.114,1],[1]); den=conv( ssys1,ssys2); G=tf(num,den); figure(1) msrgin(G); num1=[13]; den1=conv([1,1],[1,0]);
MATLAB入门教程 1.MATLAB的基本知识 1-1、基本运算与函数 在MATLAB下进行基本数学运算,只需将运算式直接打入提示号(>>)之後,并按入Enter键即可。例如: >> (5*2+1.3-0.8)*10/25 ans =4.2000 MATLAB会将运算结果直接存入一变数ans,代表MATLAB运算後的答案(Answer)并显示其数值於萤幕上。 小提示: ">>"是MATLAB的提示符号(Prompt),但在PC中文视窗系统下,由於编码方式不同,此提示符号常会消失不见,但这并不会影响到MATLAB的运算结果。 我们也可将上述运算式的结果设定给另一个变数x: x = (5*2+1.3-0.8)*10^2/25 x = 42 此时MATLAB会直接显示x的值。由上例可知,MATLAB认识所有一般常用到的加(+)、减(-)、乘(*)、除(/)的数学运算符号,以及幂次运算(^)。 小提示:MATLAB将所有变数均存成double的形式,所以不需经过变数宣告(Variable declaration)。MATLAB同时也会自动进行记忆体的使用和回收,而不必像C语言,必须由使用者一一指定.这些功能使的MATLAB易学易用,使用者可专心致力於撰写程式,而不必被软体枝节问题所干扰。 若不想让MATLAB每次都显示运算结果,只需在运算式最後加上分号(;)即可,如下例: y = sin(10)*exp(-0.3*4^2); 若要显示变数y的值,直接键入y即可: >>y y =-0.0045 在上例中,sin是正弦函数,exp是指数函数,这些都是MATLAB常用到的数学函数。 下表即为MATLAB常用的基本数学函数及三角函数: 小整理:MATLAB常用的基本数学函数 abs(x):纯量的绝对值或向量的长度 angle(z):复数z的相角(Phase angle)
1-1、基本运算与函数 在MATLAB下进行基本数学运算,只需将运算式直接打入提示号(>>)之後,并按入Enter键即可。例如: >> (5*2+1.3-0.8)*10/25 ans =4.2000 MATLAB会将运算结果直接存入一变数ans,代表MATLAB运算後的答案(Answer)并显示其数值於萤幕上。 小提示: ">>"是MATLAB的提示符号(Prompt),但在PC中文视窗系统下,由於编码方式不同,此提示符号常会消失不见,但这并不会影响到MATLAB的运算结果。 我们也可将上述运算式的结果设定给另一个变数x: x = (5*2+1.3-0.8)*10^2/25 x = 42 此时MATLAB会直接显示x的值。由上例可知,MATLAB认识所有一般常用到的加(+)、减(-)、乘(*)、除(/)的数学运算符号,以及幂次运算(^)。 小提示: MATLAB将所有变数均存成double的形式,所以不需经过变数宣告(Variable declaration)。MATLAB同时也会自动进行记忆体的使用和回收,而不必像C语言,必须由使用者一一指定.这些功能使的MATLAB易学易用,使用者可专心致力於撰写程式,而不必被软体枝节问题所干扰。 若不想让MATLAB每次都显示运算结果,只需在运算式最後加上分号(;)即可,如下例: y = sin(10)*exp(-0.3*4^2);
若要显示变数y的值,直接键入y即可: >>y y =-0.0045 在上例中,sin是正弦函数,exp是指数函数,这些都是MATLAB常用到的数学函数。 下表即为MATLAB常用的基本数学函数及三角函数: 小整理:MATLAB常用的基本数学函数 abs(x):纯量的绝对值或向量的长度 angle(z):复数z的相角(Phase angle) sqrt(x):开平方 real(z):复数z的实部 imag(z):复数z的虚部 conj(z):复数z的共轭复数 round(x):四舍五入至最近整数 fix(x):无论正负,舍去小数至最近整数 floor(x):地板函数,即舍去正小数至最近整数 ceil(x):天花板函数,即加入正小数至最近整数 rat(x):将实数x化为分数表示 rats(x):将实数x化为多项分数展开
第1章基础准备及入门 1.1 最简单的计算器使用法 为易于学习,本节以算例方式叙述,并通过算例归纳一些MATLAB最基本的规则和语 法结构。建议读者,在深入学习之前,先读一读本节。 2 【例1.3-1】求[122(74)]3的算术运算结果。本例演示:最初步的指令输入形式 和必需的操作步骤。 (1)用键盘在MA TLAB指令窗中输入以下内容 >> (12+2*(7-4))/3^2 (2)在上述表达式输入完成后,按[Enter] 键,该指令被执行,并显示如下结果。 ans = 2 〖说明〗 本例在指令窗中实际运行的情况参见图 1.3-1。 指令行“头首”的“>>”是“指令输入提示符”,它是自动生成的。本书在此后的输入指令前将不再带提示符“>>”。理由是:(A)为使本书简洁;(B)本书用MATLAB 的M-book写成,而在M-book中运行的指令前是没有提示符的。 5
MATLAB的运算符(如+、- 等)都是各种计算程序中常见的习惯符号。 一条指令输入结束后,必须按[Enter] 键,那指令才被执行。 由于本例输入指令是“不含赋值号的表达式”,所以计算结果被赋给MATLAB的一个默认变量“ans”。它是英文“answer”的缩写。 【例1.3-2】“续行输入”法。本例演示:或由于指令太长,或出于某种需要,输入指令行必 须多行书写时,该如何处理。 S=1-1/2+1/3-1/4+ ... 1/5-1/6+1/7-1/8 S = 0.6345 〖说明〗 MA TLAB用3个或3个以上的连续黑点表示“续行”,即表示下一行是上一行的继续。 本例指令中包含“赋值号”,因此表达式的计算结果被赋给了变量S。 指令执行后,变量S被保存在MA TLAB 的工作空间(Workspace)中,以备后用。如果用户不用clear 指令清除它,或对它重新赋值,那么该变量会一直保存在工作空间中, 直到本MATLAB 指令窗被关闭为止。 1.3.3数值、变量和表达式 前节算例只是表演了“计算器”功能,那仅是MA TLAB全部功能中小小一角。为深入 学习MA TLAB,有必要系统介绍一些基本规定。本节先介绍关于变量的若干规定。 一数值的记述 MATLAB的数值采用习惯的十进制表示,可以带小数点或负号。以下记述都合法。 3 -99 0.001 9.456 1.3e-3 4.5e33 在采用IEEE浮点算法的计算机上,数值通常采用“占用64位内存的双精度”表示。 其相对精度是eps (MATLAB的一个预定义变量),大约保持有效数字16位。数值范围大308308 致从10到10。 二变量命名规则 变量名、函数名是对字母大小写敏感的。如变量myvar和MyVar表示两个不同的变量。 sin是MATLAB定义的正弦函数名,但SIN,Sin等都不是。 变量名的第一个字符必须是英文字母,最多可包含63个字符(英文、数字和下连符)。 如myvar201是合法的变量名。 变量名中不得包含空格、标点、运算符,但可以包含下连符。如变量名my_var_201是合法的,且读起来更方便。而my,var201由于逗号的分隔,表示的就不是一个变量名。 6
第4章程序设计 在前面我们已经看到,MATLAB不但可以在命令窗直接输入命令并运行,而且还可以生成自己的程序文件,这就是我们通常说的一类以M为后缀的M文件,本章我们就来研究这类文件的形成方法。 M文件可分分为两大类,一是命令式M文件(也称为脚本文件,script),二是函数式M 文件(function)。两类文件的区别在于: (1)命令式文件可以直接运行,函数式文件不能直接运行,只能调用。 (2)命令式文件运行时没有输入输出参量,函数式文件在调用时需要进行输入输出参量设置。 (3)命令式文件运行中可以调用工作空间的数据,运行中产生的所有变量为全局变量。 (4)函数式文件不能调用工作空间的数据,运行中产生的所有变量为局部变量。命令式文件运行中产生的所有变量为全局变量,可以调用和存储到工作空间的数据。 4.1 MATLAB的程序文件-M文件 4.1.1 脚本文件(Scripts) 当我们需要在命令窗进行大量的命令集合运行时,直接从命令窗口输入比较麻烦,这时就可以将这些命令集合存放在一个脚本文件(Scripts)中,运行时只需要输入其文件名就可以自动执行这些命令集合。需要注意的是,脚本文件运行所产生的变量都驻留在MATLAB 的工作空间中,同时脚本文件也可以调用工作空间中的数据。因此,脚本文件所涉及的变量是全局变量。前几章所涉及到的M文件都是这类脚本文件。 编辑一个脚本文件可以直接在命令窗口的左上角打开编辑窗进行编辑。 4.1.2 函数文件(function) 函数式文件(function)的构成 (1)函数定义行: Function [输出参量]=gauss(输入参量) (2): 完成函数的功能。 (3)函数说明。 (4)函数行注。 从上面构成的情况看,函数式文件实际上是完成输入参量与输出参量的转换,这样的转换是由函数文件名为gauss的文件来完成的。函数体的功能必须说明清楚输入参量与输出参量的关系。函数说明是用来解释该函数的功能的,函数行注是对程序行进行说明的。上面(1)和(2)是必须的。 【例4-1】分析下面函数文件。 %一个数列,任意项等于前两项之和,输入项数可以给出这个数列
什么是GUI呢? GUI是Graphical User Interface 图形用户界面的意思。象很多高级编程语言一样。Matlab也有图形用户界面开发环境。随着计算机技术的飞速发展。人与计算机的通信方式也发生的很大的变化。从原来的命令行通讯方式(例如很早的DOS系统)变化到了现在的图形界面下的交互方式。而现在绝大多数的应用程序都是在图形化用户界面下运行的。 记得读书的时候。大学开学不久。学校很多同学就开始报考全国计算机等级考试了。当然我也是其中的一分子。其中C语言是大多数人选择的科目。当时在学C语言的时候。经常也会遇到人机交互的例子。譬如一个计算两个数相加的程序。运行程序后便切换到了Dos模式。然后在此模式下输入两个数。再回车。才能返回运算结果。当时就觉得很不方便。也不友好。后来才得知C语言是面向过程的语言。是非面向对象的语言(VC++,VB,Matlab等是面向对象的)。那么下面我们就来看看Matlab是如何简单、快速而友好地解决这类问题的吧。 Matlab GUI编程教程(适用于初学者) 1.首先我们新建一个GUI文件:File/New/GUI 如下图所示; 选择Blank GUI(Default) 2.进入GUI开发环境以后添加两个编辑文本框。6个静态文本框。和一个按钮。布置如下图所示;
布置好各控件以后。我们就可以来为这些控件编写程序来实现两数相加的功能了。3.我们先为数据1文本框添加代码; 点击上图所示红色方框。选择edit1_Callback。光标便立刻移到下面这段代码的位置。function edit1_Callback(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit1 as text % str2double(get(hObject,'String')) returns contents of edit1 as a double 然后在上面这段代码的下面插入如下代码: %以字符串的形式来存储数据文本框1的内容. 如果字符串不是数字。 则现实空白内容 input = str2num(get(hObject,'String')); %检查输入是否为空. 如果为空,则默认显示为0 if(isempty(input)) set(hObject,'String','0')
第四章数值计算 4.1引言 本章将花较大的篇幅讨论若干常见数值计算问题:线性分析、一元和多元函数分析、微积分、数据分析、以及常微分方程(初值和边值问题)求解等。但与一般数值计算教科书不同,本章的讨论重点是:如何利用现有的世界顶级数值计算资源MATLAB。至于数学描述,本章将遵循“最低限度自封闭”的原则处理,以最简明的方式阐述理论数学、数值数学和MATLAB计算指令之间的在联系及区别。 对于那些熟悉其他高级语言(如FORTRAN,Pascal,C++)的读者来说,通过本章,MATLAB 卓越的数组处理能力、浩瀚而灵活的M函数指令、丰富而友善的图形显示指令将使他们体验到解题视野的豁然开朗,感受到摆脱烦琐编程后的眉眼舒展。 对于那些经过大学基本数学教程的读者来说,通过本章,MATLAB精良完善的计算指令,自然易读的程序将使他们感悟“教程”数学的基础地位和局限性,看到从“理想化”简单算例通向科学研究和工程设计实际问题的一条途径。 对于那些熟悉MATLAB基本指令的读者来说,通过本章,围绕基本数值问题展开的容将使他们体会到各别指令的运用场合和在关系,获得综合运用不同指令解决具体问题的思路和借鉴。 由于MATLAB的基本运算单元是数组,所以本章容将从矩阵分析、线性代数的数值计算开始。然后再介绍函数零点、极值的求取,数值微积分,数理统计和分析,拟合和插值,Fourier分析,和一般常微分方程初值、边值问题。本章的最后讨论稀疏矩阵的处理,因为这只有在大型问题中,才须特别处理。 从总体上讲,本章各节之间没有依从关系,即读者没有必要从头到尾系统阅读本章容。读者完全可以根据需要阅读有关节次。除特别说明外,每节中的例题指令是独立完整的,因此读者可以很容易地在自己机器上实践。 MATLAB从5.3版升级到6.x版后,本章容的变化如下: ●MATLAB从6.0版起,其矩阵和特征值计算指令不再以LINPACK和EISPACK库为基础, 而建筑在计算速度更快、运行更可靠的LAPACK和ARPACK程序库的新基础上。因此,虽然各种矩阵计算指令没有变化,但计算结果却可能有某些不同。这尤其突出地表现在涉及矩阵分解、特征向量、奇异向量等的计算结果上。对此,用户不必诧异,因为构成空间的基向量时不唯一的,且新版的更可信。本书新版全部算例结果是在6.x版上给出的。 ●在5.3版本中,泛函指令对被处理函数的调用是借助函数名字符串进行的。这种调用 方式在6.x版中已被宣布为“过渡期允许使用但即将被淘汰的调用方式”;而新的调用方式是借助“函数句柄”进行的。因此,关于述泛函指令,本章新版着重讲述如何使用“函数句柄”,同时兼顾“函数名字符串”调用法。 ●MATLAB从6.0版起,提供了一组专门求微分方程“边值问题”数值解的指令。适应这 种变化,本章新增第4.14.5节,用2个算例阐述求解细节。 ● 5.3版中的积分指令quad8已经废止;6.x版启用新积分指令quad l;6.5版新增三重 积分指令triplequad。本章新版对此作了相应的改变。 4.2LU分解和恰定方程组的解