Matlab语言的学习总结
内容提要Matlab是美国MathWorks公司于1984年正式推出的一套高性能的数值计算和可视化软件,它集数值分析、矩阵运算、信号处理和图形显
示于一体,构成了一个方便且界面友好的用户环境。在此环境下,对所要解决
的许多问题,用户只需简单地列出数学表达式,其结果便会以数值和图形方式
显示出来;对于大型问题,只需建立相应的数学模型,同样可以得到快速准确
的解答。Matlab以其强大灵活的分析平台,多种兼容的数据类型,简化处理数
据的函数,快速而又精确的数据分析函数以及丰富的图形和自动文档生成能力
赢得了越来越多的用户的青睐,尤其是在校大学生的追捧,目前广泛工程运算,控制系统设计图形处理等领域。本文将通过简介Matlab强大的数值计算功能与
数据可视化功能,阐述本人在使用Matlab进行程序设计中的几则经验,并谈谈
学习Matlab的一些体会。
关键词Matlab、数值计算、符号计算、可视化
1.Matlab语言及发展
Matlab是MATrix LABoratory(“矩阵实验室”)的缩写,是美国MathWorks公司开发的集数值计算、符号计算和图形可视化三大基本功能于一
体的,功能强大、操作简单的语言,是国际公认的优秀数学应用软件之一。
20世纪80年代初期,Cleve Moler与John Little等利用C语言开发了新一
代的Matlab语言,此时的Matlab语言已同时具备了数值计算功能和简单的图
形处理功能。1984年,Cleve Moler与John Little等正式成立了Mathworks公司,把Matlab语言推向市场,并开始了对Matlab工具箱等的开发设计。现在,Matlab已经发展成为适合多学科的大型软件,在世界各高校,Matlab已经成为
线性代数、数值分析、数理统计、优化方法、自动控制、数字信号处理、动态
系统仿真等高级课程的基本教学工具。特别是最近几年,Matlab在我国大学生
数学建模竞赛中的应用,为参赛者在有限的时间内准确、有效的解决问题提供
了有力的保证。
2.强大的数值计算与符号计算功能
Matlab的数值计算功能包括:矩阵和向量的处理和运算、多项式和有理分
式运算、数据统计分析、数值积分、优化处理等。符号计算功能包括:符号变
量的微积分、表达式的简化、任意精度计算、调用Maple函数的方法等。
2.1数值计算功能
Matlab以矩阵为运算单元,除非特殊需要,矩阵不必事先定义维数大小。Matlab还提供了丰富的矩阵运算函数,如求逆矩阵的inv函数,求方阵行列式
的det函数,求矩阵特征值及特征向量的eig函数等等。正因为如此,在矩阵运
算上,Matlab体现出比Basic、Fortran、Pascal、C等语言要高得多的编程效率,而且程序可读性强,调试简单,容易维护。许多含有矩阵运算的复杂的源程序
如果用Matlab编写,只要寥寥几行就可结束,就象在草稿纸上进行演算一样简
捷直观,故Matlab又被称为“演算纸式的程序设计语言”。
2.2符号计算功能
除了数值计算,Matlab4.0以上版本还提供了Basic、Fortran、Pascal、C
等语言所没有的符号计算功能,当然你必须安装了符号计算工具箱。在数值计
算中,所有运作的变量都是被赋值的数值变量,而在符号计算中,所运作的都
是符号变量。在高等数学中的级数、微分、积分,甚至微分方程组通过Matlab
的符号计算工具箱都可以方便地求解。
3.强大的科学数据可视化功能
作为一个优秀的科技应用软件,Matlab不仅在数值计算方面无与伦比,而
且在数据可视化方面也有上佳表现。Matlab 有两个层次的绘图命令:一组是直
接对句柄进行操作的底层绘图指令;另一组是在底层指令基础上建立起来的高
层绘图指令。
3.1高层绘图指令实现默认的图形表现方式
用高层绘图指令可以实现Matlab中默认的图形表现方式,这些指令简单明了,极易为用户掌握。例如调用plot函数可绘制直角坐标二维曲线,调用plot3
函数可绘制直角坐标三维曲线。另外还有其他许多简便的高层绘图指令,可用
于绘制一些特殊的平面图形(如统计频数直方图),实现对图的注释等等。
3.2底层绘图指令更改图形属性
如果用户对默认的图形表现方式不甚满意,可用底层绘图指令如set函数更
改图形句柄对象的属性。例如可以更改图形窗口的背景,轴的位置,纵横轴
的比例,绘图的线型、线宽等。
3.3符号函数的可视化
对于符号函数,Matlab也可简便地实现可视化。定义符号函数后,调用ezplot函数即可绘制符号函数的曲线,而且图名及横坐标名都将自动生成。
4.Matlab程序设计经验
在使用Matlab编程时,若要利用现成的Fortran或C的软件包,常会遇到接口问题。通常可采用以下几种方法:
在Matlab的M文件中调用由Fortran或C子程序编译生成的MEX可执行文件,此法将降低Matlab的执行速度。
用剪贴板将Fortran或C产生的数据文件考贝到Matlab的M文件中。此法虽然简单,但若遇到大型质量矩阵或刚度矩阵,将使源程序冗长。
用fopen 、fread 、fscanf 等Matlab的底层I/O指令将Fortran或C产生的数据文件读入Matlab的M文件中。
用fscanf语句输入矩阵变量或简单变量的数值时,一句fscanf语句只能读入一个变量(包括矩阵变量或简单变量)的数值,而在C语言中,一句fscanf 语句可以读入多个简单变量的数值。还要注意的是当用A=fscanf(FP,′%d′,1)读入简单变量A的数值时,()内的′1′必不可少,否则该语句会将指针FP在所对
应的文本文件中当前所指的数据及其后所有的数据全部读入并赋给变量A,使A成为一列向量。这是因为在Matlab中默认的基本数元为矩阵。
用循环语句对一列向量赋值时,例如要产生一个3×1的“0”矩阵A,应用:for J=1:1:3 /A(J,1)=0.0; /end。若用:for J=1:1:3 / A(J)=0.0;/end (“/”表示回车键) ,则A={0 0 0},产生的是一个1×3的矩阵,即行向量。在编程中若忽视了这个问题常会造成数组的维数不匹配。
Matlab中严格区分大小写,当Command Window中遇到提示“Undefined function or variable ′A′.”时,可检查一下是否错按了大小写字母切换键。
Matlab当中的指令用的都是英文标点,如果在中文之星或RichWin状态下输入指令,要注意不要错用了中文标点,否则将给出出错信息。
Matlab 具有丰富的函数库,自己编写的函数应避免与Matlab函数库中的函数同名,否则Matlab会优先执行函数库中的同名函数。
Matlab启动后的缺省目录是c:\matlab\bin,若不建立自己的工作目录,那么在Matlab环境下所产生的数据文件以及用户自己编写的可执行文件就很可能登录在这缺省目录上,造成用户文件与Matlab自身函数文件混杂在一起。因此用户应在Dos环境或Windows环境下建立自己的工作目录,并将其设置为当前工作目录。可用cd命令进入用户自己的工作目录。
假定用户用书写器(记事本或写字板等)编写好了一个m文件(Matlab中的可执行文件),可用Command Window 中File 下拉菜单中的Run M-file选项来执行该文件。或者先设置好该文件的搜索路径,然后在Command Window 中键
入该文件名,回车即可。设置搜索路径的方法除了上面中提到的cd命令外,还可用path指令扩展搜索路径。或者在Matlabrc.m中添加该文件所在的路径,重新启动Matlab使该搜索路径生效。需要注意的是用path指令扩展的搜索路径仅在当前Matlab工作环境中有效,而在Matlabrc.m中添加的路径只要不被删除,将永远有效。
虽然Matlab中提供了正无穷大变量Inf,但在数值积分中调用quad8积分指令时若用+Inf或-Inf作为积分的上限或下限,将使结果成为不定值。请看下面一个例子:
求标准正态分布的概率函数值
先用编辑器建立被积函数f.m文件。
function prob=f(x)
//函数文件以function作为文件头prob=1/sqrt(2*pi)*exp(-(x.^2)/2);
/
/被积函数表达式将写好的 f.m文件存放在自己的工作目录中。当调用积分指令quad8时,结果出现不定值NaN。
u=-1:0.5:1
//形成由-1到1,间隔为0.5的行向量for I=1:1:5
P(I)=quad8(′f′,-Inf,u(I));
//f为被积函数文件名,-Inf、u(I)分别为积分的上、下限end
结果如下:
u =-1.0000-0.500000.5000 1.0000
P =NaN NaN NaN NaN NaN
其实只要采用一个小小的技巧就能求出标准正态分布的概率函数值。
注意到
改用如下程序即可得到正确的答案。
u=-1:0.5:1;
for I=1:1:5
P(I)=0.5-quad8(′f′,u(I),0);
end
结果如下:
P =0.15870.30850.50000.69150.8413
在符号微积分中用+Inf或-Inf作为积分的上限或下限能得到正确的解答,但是计算的速度比用积分指令quad8慢得多。仍采用同一例子,程序如下:prob=′1/sqrt(2*pi)*exp(-(x^2)/2)′;
//定义概率密度函数的符号函数u=-1:0.5:1;
for I=1:1:5%int对符号函数求积分,
//numeric将符号变量转化为数值变量
P(I)=numeric(int(prob,-Inf,u(I)));
end
P =0.15870.30850.50000.69150.8413
在符号表达式的变量替换中,不少Matlab的参考书都提到了subs指令,并介了它的具体使用格式:subs(f,NEW,OLD),即用新字符串NEW代替符号表达式f中的旧字符串OLD。事实上,当新字符串是数字字符时,或者新字符串是字母字符且在表达式中未出现,用subs(f,NEW,OLD)与用subs(f,OLD,NEW)的结果是一样的。请看如下例子:
新字符串是数字字符
matlab学好了有什么用f=′a*u^3+b*u^2+c*u+d′
//定义符号函数f f1=subs(f,′a′,′3′)
//用′3′替换f中的′a′f2=subs(f,′3′,′a′)
//用′3′替换f中的′a′ 输出结果:
f =a*u^3+b*u^2+c*u+d
f1 =3*u^3+b*u^2+c*u+d
f2 =3*u^3+b*u^2+c*u+d
新字符串是字母字符且在符号表达式中未出现
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论