matlab入门教程(快速入门)_第1页
matlab入门教程(快速入门)_第2页
matlab入门教程(快速入门)_第3页
matlab入门教程(快速入门)_第4页
matlab入门教程(快速入门)_第5页
已阅读5页,还剩177页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MATLAB

——数学建模基础教程主讲者:高陈燕12/15/20241.MATLAB

——数学建模基础教程MATLAB的概述MATLAB程序设计基础MATLAB在数值计算中的应用MATLAB的符号计算MATLAB的图形处理12/15/20242.MATLAB程序设计基础MATLAB语言的基本要素MATLAB语言的核心——矩阵单元型数据和结构型数据M文件流程控制语句12/15/20243.MATLAB语言的基本要素变量

变量不需要事先声明,也不需要指定变量类型,它会自动根据所赋予变量的值或对变量的操作来确定变量的类型;赋值过程中,如果变量已存在,则用新值代替旧值,以新的类型代替旧的类型。变量的命名规则:变量名区分大小写;变量名长度不超过31位,第31位之后的字符被忽略;变量名以字母开头,变量名中可以包含字母、数字、下划线,但不能使用标点。

变量一般为局部变量,即仅在其调用的M文件内部有效;若要定义全局变量,须在变量前加关键字global。Matlab语言主要是由几个基本要素构建而成的,其中包括变量、常量、数值、字符串、运算符及标点等。回到主目录12/15/20244.常量

matlab中预定义的一些特殊的量。i,j虚数单位 Realmin最小的正浮点数,pi圆周率 Realmax最大的浮点数,eps浮点运算的相对精度 Inf 无穷大NaNNot-a-Number,表示不定值

例如: >>pi ans=%ans是默认的结果变量 3.141612/15/20245.>>1/0Warning:Dividebyzero.ans=Inf>>0/0Warning:Dividebyzero.ans=NaN12/15/20246.

定义变量时应避免与常量名相同,如果改变了某个常量的值,可以用“clear+常量名”命令来恢复该常量的初始设定值。>>pi=1pi=1>>clearpi>>pians=3.141612/15/20247.数值数值缺省为实数保留小数点后4位浮点数表示。其输入格式与C语言一致:如:9-730.19991.475e6输出格式由format命令控制,只是影响屏幕显示效果,不影响内部存储和计算。下面以pi为例。>>formatlong;pians=3.14159265358979>>formatlonge;pians=3.141592653589793e+000>>formatlongg;pians=3.1415926535897912/15/20248.>>z=2*exp(pi/3i)z=1.0000+1.7321iMatlab语言还提供了复数的表达和运算功能。复数的基本单位表示为i或j。例如:如果是表达式,必须在虚部的数值与i、j之间使用乘号。>>sin(pi/3)+cos(pi/3)j???sin(pi/3)+cos(pi/3)j

Error:UnexpectedMATLABexpression.>>sin(pi/3)+cos(pi/3)*jans=0.8660+0.5000i12/15/20249.字符串字符串用单引号输入或赋值;字符串的每个字符都是都是字符数组的一个元素;字符串和字符数组基本上等价。>>s='iloveyou's=iloveyou>>size(s)ans=110>>s(2)ans=>>s(10)ans=u字符串的每个字符(包括空格)都是字符数组的一个元素。在matlab中,字符串与字符数组或矩阵基本上是等价的。12/15/202410.如果在字符串内使用单引号时,可以用连续两个单引号表示。例如:

字符串之间的转换函数:double字符串转换为数值代码num2str数字转换为字符串int2str整数转换为字符串mat2str矩阵转换为字符串str2num转换字符串为数字>>double(s)‘%s=‘iloveyou’ans=1053210811111810132121111117>>s='it''sgood‘s=it'sgood12/15/202411.>>a=[1:5]a=12345>>b=num2str(a)b=2345>>a*2ans=246810>>b*2ans=98646410064641026464104646410612/15/202412.

matlab对字符串的操作与C语言中的几乎完全相同:strcat链结串strcmp比较串strvcat垂直链结串strncmp比较串的前n个字符findstr在其他串中找此串upper转换串为大写lower转换串为小写blanks生成空串deblank移去串中空格……例如:把前面的字符串s转化成大写。s=“it’good”>>upper(s)ans=IT'SGOOD执行字符串的功能用eval来实现。>>t=‘1/(a*b-1)’;a=2;b=3;c=eval(t)%可以在一行中表示。c=0.200012/15/202413.运算符

在matlab语言中运算符包括算术运算符、关系运算符和逻辑运算符。其中算术运算符见右表:其中点运算是指操作元素点对点的运算,也就是说矩阵内元素对元素之间的运算,点运算要求参与运算的变量在结构上必须是相似的。例如:操作符定义+算术加-算术减*算术乘.*点乘^算术乘方.^点乘方\算术左除.\点左除/算术右除./点右除12/15/202414.>>a=[1,2,3;4,5,6;7,8,9]a=123456789>>b=[123456789]b=123456789>>c=a*bc=303642668196102126150>>d=a.*bd=149162536496481思考:题目:通过描点法得到sin(x)xcos(x)函数在0-pi区间上的曲线。提示:通过点运算获得。(附件diancheng。txt)12/15/202415.Matlab语言的关系运算符如右表:当判断一个矩阵是否为空矩阵时,一般不用“==”,而应当使用函数isempty。操作符定义==等于~=不等于>大于>=大于等于<小于<=小于等于12/15/202416.Matlab语言的逻辑运算符如右表:进行逻辑判断时,所有非零数值均被认为为真,而零为假;在逻辑判断结果中,判断为真时输出1,为假时输出0.三种运算符中,它们的优先级关系先后为:算术运算符、关系运算符、逻辑运算符。操作符定义&逻辑与|逻辑或~逻辑非xor逻辑异或any当向量中存在非零元素时为真all当向量中所有元素非零时为真12/15/202417.>>a=[1:3;4:6;7:9];>>x=5;>>y=ones(3)*5;>>xa=x<=axa=000011111>>b=[010;101;001];>>ab=a&bab=010101001>>nb=~bnb=10101011012/15/202418.>>a=magic(5);>>a(:,3)=zeros(5,1)a=17240815235014164602022101202131118029>>a1=all(a(:,1)<10)a1=0>>a2=all(a>3)a2=11000>>a11=any(a(:,1)>10)a11=1>>a22=any(a>10)a22=1101112/15/202419.标点在matlab中一些标点符号也被赋以特殊的意义,或表示要进行一定的运算等,如下表:标点定义标点定义:冒号,具有多种应用功能…续行符;区分行,及取消结果显示%注释标记,区分列,及函数参数分隔符等!调用操作系统运算()指定运算过程中的先后次序等[]矩阵定义的标志等{}用于构成单元数组等‘字符串的标示符12/15/202420.下面对上表中各标点作进一步的介绍。首先,用冒号来定义行向量。基本格式:x=x1:step:x2(初始值:步长:尾元素数值限)x=x1:x2(默认步长为1)注意:这里强调x2为尾元素数值限,而不是尾元素值。当x2-x1恰为步长的整数倍时,x2才能成为尾值。例如:12/15/202421.>>a=1:2:12a=1357911>>a=12:-2:1a=12108642>>a=1:6a=123456>>a=2:2:12a=2468101212/15/202422.其次,通过使用冒号,可以截取指定矩阵中的部分。例如:>>a=[1:18];a=reshape(a,3,6)%重组矩阵a=147101316258111417369121518>>a1=a(:,1:3)%提取矩阵a的第1到3列元素组成的子矩阵。a1=147258369>>a2=a(1:2,3:end)a2=71013168111417思考:B1=a(1:3,:)?12/15/202423.分号在matlab语言中所起的作用是作为分隔行的标志,这里包括在矩阵定义中对行的区分以及在程序代码中对行的划分。在矩阵定义中,分号之间的数据被认为是矩阵的同一行。对于以分号结尾的行语句,matlab语言不会把其运算结果显示在命令窗口中。逗号主要起两个作用。其一是逗号是函数参数的分隔符,也是矩阵下标的分隔符。其二是逗号也是区分矩阵列的标志,在同一行中,逗号分隔开的是各个列。括号是调整运算先后次序的标点,可以通过引用括号来调整运算次序。矩阵的定义需要使用中括号。此外,中括号可以表示空矩阵,并通过该空矩阵实现对矩阵的部分删除。以下举例:12/15/202424.>>a=[1,2,3,4;5,6,7,8;4,3,2,1;8,7,6,5]a=1234567843218765>>a(:,1:2)=[]a=34782165>>b=a([13],:)b=342112/15/202425.大括号是单元型数据所特有的标点。后面介绍。小数点“.”,它起到了数学符号的作用;而作为点运算的标志符,它又构成了各种各样的点运算;最重要的是它可作为结构型数组应用时的专有符号。“…”为matlab语言中的续行符,但是该续行符只能出现在各个语义群之间,也就是说不能出现在变量名之间,否则出错。例如:>>a=sin(pi/4)+cos(pi/4)-tan(pi/4)...+cot(pi/4)a=1.4142>>a=sin(pi/4)+cos(pi/4)-t...an(pi/4)???an(pi/4)|Error:UnexpectedMATLABexpression.12/15/202426.在matlab语言中,一行内在“%”之后的文字均被认为是对M文件或程序代码的解释部分。“!”可以在命令窗口直接调用操作系统命令,例如DOS命令,并将结果展示在命令窗口中,比如在命令窗口中调用“!dirc”,以显示C盘的文件列表。单引号作为字符串的标示符而存在,同时,它在矩阵运算中也表示矩阵的转置运算及复数的共轭值。12/15/202427.>>a=[1,2,3,4;5,6,7,8]a=12345678>>a'ans=15263748>>s=3-4i;s'ans=3.0000+4.0000i回到主目录12/15/202428.MATLAB语言的核心——矩阵矩阵的生成直接输入小矩阵(最简便的方法)

注意点:输入矩阵时要以“[]”为其标识,即矩阵的元素应在“[]”内部。矩阵的同行元素之间可由空格或“,”分隔,行与行之间用“;”或回车符分隔。矩阵元素可为运算表达式。无任何元素的空矩阵也合法。回到主目录12/15/202429.>>A=[1,2,3;4,5,6;7,8,9]A=123456789>>a=[123456789]a=123456789创建带有运算表达式的矩阵:>>b=[sin(pi/3),cos(pi/4);log(9),tan(pi/4)];%什么样的结果?12/15/202430.利用中括号将小矩阵合成一个大矩阵>>b=[1,2;3,4];>>a=[b,b';b^2,b*3]a=12133424710361522912从外部文件引用矩阵(excel,txt)

(shuju1,shuju2)12/15/202431.特殊矩阵的生成常用的特殊矩阵空阵:[]

单位阵:eye(m,n);eye(m)

零矩阵:zeros(m,n);zeros(m)

全1阵:ones(m,n);ones(m)

对角阵:对角元素向量V=[a1,a2,…,an] A=diag(V)

随机阵:rand(m,n)产生一个m×n的均匀分布的随机矩阵12/15/202432.>>eye(2,3)ans=100010>>zeros(2,3)ans=000000>>ones(2,3)ans=11111

1>>v=[567];a=diag(v)a=500060007>>eye(2)ans=1001>>zeros(2)ans=0000>>ones(2)ans=1111

如果已知a为方阵,则v=diag(a)可以提取a的对角元素构成向量v。12/15/202433.其他特殊矩阵

compan

友矩阵函数magic魔方矩阵

hankel

Hankel矩阵 rosser

对称特征值测试矩阵

hilbHilbert矩阵pascal

Pascal矩阵

invhilb

反Hilbert矩阵vander

范德蒙矩阵

……

其中,compan(c),结果是生成一以向量c为系数的多项式的特征矩阵。hilb所生成的hilbert矩阵的特点是矩阵中的元素值为1/(i+j-1)。12/15/202434.单元型数据和结构型数据单元型变量

单元型变量是matlab语言中较为特殊的一种数据类型。本质上讲,单元型变量为任意类型的多维数组。单元型变量可有两种方式:一种是用赋值语句直接定义,另一种是由cell函数预先分配存储空间,然后对单元元素逐个赋值。在直接赋值过程中,与在矩阵的定义中使用中括号不同,单元型变量的定义需用大括号,而元素间用逗号隔开。回到主目录12/15/202435.>>a=[1,2;3,4]a=1234>>b={1:4,a,‘abcd’}b=[1x4double][2x2double]'abcd'>>cellplot(b)%图形显示单元型变量的内容>>celldisp(b)%显示单元型变量的内容b{1}=1234b{2}=1234b{3}=abcd12/15/202436.单元型变量元素的引用采用大括号为下标标识,用小括号只显示该元素的压缩形式。例如:>>b{2}ans=1234>>b(2)ans=[2x2double]注意:单元型变量的元素不是以指针方式保存的。思考:如果改变了上例中的a矩阵,那么单元型变量b中的第二个元素改变不?12/15/202437.

单元型变量与矩阵的另一个区别是单元型变量自身可以嵌套。例如:>>c=cell(1,3)%另一种定义法>>c{1,1}=1:4;>>c{1,2}=a;>>c{1,3}=b;%b={1:4,a,‘abcd’}>>cc=[1x4double][2x2double]{1x3cell}>>c{3}{3}ans=abcd12/15/202438.结构型变量

在matlab语言中结构型变量的定义也有两种方法,其一是直接赋值定义,其二是由函数struct定义。以指针操作符“.”连接结构型变量名与属性名。直接赋值时,应当指出结构中的属性名。例如:>>A.a1=‘abcd’;%字符串类型>>A.a2=1;%数值类型>>A.a3=[1,2,3,4];%数组类型>>AA=a1:'abcd'a2:1a3:[1234]

思考:如何引用结构型变量名A中a1属性的c元素。

12/15/202439.

由函数struct定义结构型变量,其调用格式如下:结构型变量名=struct(元素名1,元素值1,元素2,元素值2,……)>>B=[1,2;3,4];>>C=struct('c1',1,'c2',B,'c3','abcd')C=c1:1c2:[2x2double]c3:'abcd‘>>C.c2ans=123412/15/202440.结构型变量可以嵌套定义。例如:

>>C.c1=A%前面结构型变量AC=c1:[1x1struct]c2:[2x2double]c3:'abcd‘>>C.c1.a1%嵌套结构型变量的引用ans=abcd12/15/202441.M文件所谓M文件就是由matlab语言编写的可在matlab语言环境下运行的程序源代码文件。Matlab语言中的M文件可分为命令式(script)和函数式(function)两种形式。M文件可在matlab的程序编辑器中编写,也可在其他的文本编辑器中编写,并以“.m”为扩展名加以保存。命令式文件

命令式文件就是命令行的简单叠加,matlab会自动按顺序执行文件中的命令。值得注意的是,命令式文件在运行过程中可以调用matlab工作域内所有的数据,而且所产生的所有变量均为全局变量。回到主目录12/15/202442.函数式文件函数式文件主要用于解决计算中的参数传递和函数调用的问题。函数式的标志是它的第一行为function语句。函数式文件可以有返回值,也可以没有。函数式文件执行之后,只保留最后结果,不保留任何中间过程,所定义的变量也仅在函数内部起作用,并随着调用的结束而被清除。即除无特殊声明外,其变量均为局部变量。注意:存储函数式M文件时文件名要与主函数名相一致。12/15/202443.函数式文件:functionabcd(a,b)c=a+bd=b-a保存为abcd.m在工作窗口中调用:>>a=2;b=[3,4,5,6];>>abcd(a,b)c=5678d=1234>>c%结果是什么?命令式文件:a=2;b=[3456];c=a+b;d=b-a;保存为:abcd.m在工作窗口中调用:>>abcd%文件名即可>>cc=5678>>dd=123412/15/202444.函数变量及变量作用域变量主要有输入变量、输出变量及函数内部变量。输入变量相当于函数的入口数据,是一个函数操作的主要对象。函数的作用就是对输入变量进行加工以实现一定的功能。函数的输入变量为形式参数,即只是传递变量的值而不是变量的地址,函数对输入变量的一切的操作和修改如果不依靠输出变量传出的话,将不会影响工作空间中该变量的值。matlab语言提供了函数nargin来控制输入变量的个数,即可以实现不定参数输入的操作。例如:在函数test1中,如果调用过程时只提供一个输入变量,则求该输入变量的模;如果是两个输入变量,则求两个输入变量的和12/15/202445.%如果调用过程时只提供一个输入变量,则求该输入变量%的模;如果是两个输入变量,则求两个输入变量的和functionc=test1(a,b)ifnargin==1c=norm(a);elseifnargin==2c=a+b;end在工作窗口调用:>>a=[234]a=234>>test1(a)ans=5.3852>>b=3;>>test1(a,b)ans=56712/15/202446.同时,matlab语言还提供了另一个针对输入变量的函数varargin。该函数可以实现不定数目输入变量的函数的程序设计。此时,对函数的一切输入变量均将存储在以varargin命名的单元型数组中。例:在函数test2中,实现如下功能:通过使用函数varargin,用户可以输入任意多个学生的数学、英语及语文的成绩,然后求各科目的平均值。程序如下:12/15/202447.function[mathavg,englishavg,chineseavg]=test2(varargin)s=length(varargin);%求数组的长度mathsum=0;englishsum=0;chinesesum=0;forj=1:smathsum=mathsum+varargin{j}(1);englishsum=+varargin{j}(2);chinesesum=+varargin{j}(3);endmathavg=mathsum/s;englishavg=englishsum/s;chineseavg=chinesesum/s;思考:此函数如何调用。12/15/202448.与输入变量相对应,matlab语言对输出变量也提供了相应的函数,如nargout、varargout等。具体的使用与函数nargin和varargin相似。下面给出一个综合应用示例。示例函数test3中,综合使用了函数nargin、nargout、narargin、narargout等,函数目的是求各学生(总数不确定)的个人平均成绩,以及指定科目的平均成绩等。函数test2的调用:[90,89,60]分别表示数学、英语、语文的成绩>>[a,b,c]=test2([90,89,60],[79,89,66],[99,98,100])a=89.3333b=32.6667c=33.3333思考:如果多个学生的成绩是同一科目的成绩放在一个数组中,如何修改test2函数。12/15/202449.

function[vararout]=test3(lessons,varargin)inputnum=nargin;lessonnum=length(lessons);outputnum=nargout;fori=1:lessonnumswitchlessons(i)case'math'vararout{1}=sum(varargin{1:inputnum}(1));case'english'vararout{2}=sum(varargin{1:inputnum}(2));case'chinese'vararout{3}=sum(varargin{1:inputnum}(3));endendfori=1:inputnumvarargout{i+3}=sum(varargin{i}(:));end12/15/202450.

在matlab中,函数内部定义的变量除特殊声明外均为局部变量。如果需要使用全局变量,则应当使用命令global定义,而且在任何使用该全局变量的函数中都应加以定义,在命令窗口中也不例外。注意:变量之间必须以空格分隔,而不能用逗号分隔。示例:function[avgs]=test4(A)globalsss%定义全局变量[m,n]=size(A);fori=1:ms(i)=sum(A(i,:));endss=sum(s);avgs=ss/(m*n);调用test4:>>a=[435;678;357;134];>>test4(a)ans=4.6667>>globalsss>>ssss=56>>ss=122115812/15/202451.子函数与局部函数Matlab中也可以定义子函数,用来扩充函数的功能。在函数文件中题头定义的函数为主函数,而在函数体内定义的其他函数均被视为子函数。子函数只能为主函数或同一主函数下的其他的子函数所调用。示例:functionc=test(a,b)%主函数c=test1(a,b)*test2(a,b);functionc=test1(a,b)%子函数1c=a+b;functionc=test2(a,b)%子函数2c=a-b;12/15/202452.局部函数与子函数的区别是:局部函数可以被其父目录下的所有函数所调用,而子函数则只能被其所在M文件的主函数所调用;在函数编辑的结构上,局部函数与一般的函数文件的编辑相同,而子函数则只能在主函数文件中编辑。12/15/202453.程序设计的辅助函数用户交互函数

键盘输入函数包括函数input及keyboard。函数input用于提示用户输入指定参数的值,调用格式:var=input(‘提示性语句’)其中,“提示性语句”将给出相应的提示信息以告知用户输入的对象,在这种调用过程中,用户可以有键盘输入任何的可计算的表达式或已赋值的当前工作空间中的变量名,而且返回至变量var中的值也是数值型,所有的输入以回车键加以确认。

12/15/202454.第一种调用格式:>>a=input('inputexample\n')inputexample1+4a=5>>ischar(a)ans=0第二种调用格式:>>b=input('inputexample\n','s')inputexample1+4b=1+4>>ischar(b)ans=1函数input的另一种调用格式:var=input(‘提示性语句’,’s’)以该格式调用时,input函数将视用户键盘输入的一切字符为字符型赋予变量var,而不对其进行任何计算。在提示型语句中可以用“\n”来控制显示时的换行。例如:12/15/202455.另一种输入函数为keybroad,该函数出现在M文件中时,将终止程序的运行,此时用户可以查看运算过程中各变量的值必要时也可进行适当的干涉及编辑。同时该函数在matlab语言中均可应用,直到键入return并回车,这时程序返回中断处,继续执行其余代码。matlab也提供了一种中断函数pause,其调用格式:pause(n)该命令的作用是中断程序运行并等待n秒。如果不带参数,则程序无限期中断,直到用户在键盘上键入任意键。12/15/202456.流程控制语句

Matlab语言的流程控制语句主要有for、while、if-else-end和switch-case这四种语句。for语句for循环语句是流程控制语句中的基础,使用该循环语句可以以指定的次数重复执行循环体内的语句。for循环语句的调用形式:for循环控制变量=<循环次数设定>(可以是已定义的向量,也可在for循环语句中定义)循环体end回到主目录12/15/202457.fori=1:4%初始值:步长:终值(步长默认为1) forj=4:-1:1 H(i,j)=1/(i+j-1); endend结果:>>HH=1.00000.50000.33330.25000.50000.33330.25000.20000.33330.25000.20000.16670.25000.20000.16670.142912/15/202458.循环次数的设定还可以由mxn矩阵来实现,此时,整个循环将执行n次,并且每次循环变量为一列向量。例如:a=[1234;5678];s=0;fori=ais=s+1;endi=15i=26i=37i=48s=?12/15/202459.while语句while循环语句与for循环语句不同的是,前者是以条件的满足与否来判断循环是否结束的,而后者则是以执行次数是否达到指定值来判断的。while循环语句的一般形式:while<循环判断语句>循环体end循环判断语句为某种形式的逻辑判断表达式。当表达式的值为真时就执行循环体内的语句;否则退出。当循环判断语句为矩阵时,当且仅当所有的矩阵元素非零时,逻辑表达式的值为真。例如:12/15/202460.n=0;while2^n<100n=n+1;end

从例子中可以看出while循环语句与for循环语句是有异曲同工之处的。但是两者还是有区别的,for循环语句一般适用于已知到循环次数,而不知道循环运算目标的问题;while循环语句则一般适用于已知循环运算目标,而循环次数未知的问题。break语句:当程序流程运行至该命令时,则不论循环控制变量是否满足循环判断语句,均将退出当前循环,执行循环后的其他语句。continue命令:当程序流程运行至该命令时,会忽视其后的循环体操作转而执行下一层的循环。12/15/202461.例1.计算级数:S=1+2+22+23+···+263=法一:s=0;i=0;whilei<64s=s+2^i;i=i+1;end法二:>>n=0:1:63;>>S=sum(2.^n)12/15/202462.if-else-end语句

if-else-end语句的一般形式:if<逻辑判断语句>逻辑值为“真”时执行语句else逻辑值为“假”时执行语句end例如:ifa==1a=a+1;elsea=a+2;end12/15/202463.在程序设计中,也常碰到需要进行多重逻辑选择的问题,这时可以采用if-else-end语句的嵌套形式:

if<逻辑判断语句1>逻辑值1为“真”时执行语句elseif<逻辑判断语句2>逻辑值2为“真”时执行语句elseif<逻辑判断语句3>……else当以上所有的逻辑值均为“假”时执行语句end12/15/202464.IfA>B'greater'elseifA<B'less'elseifA==B'equal'elseerror('AandBaredifferentdata')end解读这段程序:a=10000;n=0;z=1;whilez<an=n+1;ifmod(n,2)==1continueendz=2^n-1;if~isprime(z)%是否质数

breakendend12/15/202465.switch-case语句

switch-case语句是用于解决多分支判断选择的问题。switch-case语句的一般表达形式:switch<选择判断量>case选择判断值1选择判断语句1case选择判断值2选择判断语句2……otherwise判断执行语句end12/15/202466.例如:code=1switchcodecase-1disp('error');case0disp('writeinEnglish');case1disp('writeinChinese');otherwisedisp('writeinFrench');end结果:writeinChinese注意:在matlab语言中,即使有多条case判断语句为真,也只执行所遇到的第一条为真的语句。不必像C语句那样,在每条case语句后加上break语句防止继续执行后面为真的case条件语句。12/15/202467.例:求鸡兔同笼问题:鸡兔同笼,头共36,脚共100.求鸡、兔各几只?程序如下:i=1;while1ifmod(100-2*i,4)==0&i+(100-2*i)/4=36%函数mod表示取余break;endenda1=i;a2=36-i;上述程序中有两个错误,请指出!12/15/202468.MATLAB在数值计算中的应用数值计算的基本要素及相关函数数据的统计分析曲线拟合及插值数值分析12/15/202469.数值计算的基本要素及相关函数MATLAB语言在数值计算中的基本要素主要有数组、多项式和矩阵。数组及相关函数数组的创建数组的定义相当简捷,主要有三种格式:x=x1:step:x2(初始值:步长:尾元素数值限)y=linspace(x1,x2,n)(初始值:终止值:数组元素个数)n默认为100y=logspace(x1,x2,n)(初始值:终止值:数组元素个数)n默认为50回到主目录12/15/202470.例如:>>a=1:2:12a=1357911>>b=linspace(1,10,10)b=12345678910>>c=logspace(0,2,10)c=1.00001.66812.78264.64167.742612.915521.544335.938159.9484100.000012/15/202471.数组的操作

例如:a=1357911>>a(3)%取a数组中的第3个元素ans=5>>a(2:5)%取数组a中第2个元素到第5个元素ans=3579>>a.^2%数组的平方ans=19254981121>>length(a)%检测数组的长度,返回数组的元素个数ans=612/15/202472.多维数组多维数组从某种角度来看,它是矩阵在维数上的扩张,实际上也是矩阵中的一个特例。它可以是数值型、字符型、单元型或结构型等。多维数组在创建及处理上与一维数组或普通矩阵有很大的不同。其创建方法有很多,可以仿照一维数组的定义,也可以通过matlab的有关函数来创建。直接赋值:例如:>>A(:,:,1)=[123;456;678];>>A(:,:,2)=[789;567;321];>>A(:,:,3)=[987;654;234];12/15/202473.注意多维数组的显示方法:>>AA(:,:,1)=123456678A(:,:,2)=789567321A(:,:,3)=987654234A(2,3,2)=?A(:,:,1)A(:,:,2)A(:,:,3)123456678789567321987654234数组A就像一个分块矩阵,每块都是3x3的矩阵。12/15/202474.还可以简单的只对其中某一维的元素进行赋值。系统会根据赋值的情况来确定该变量的具体维数结构并将其他未赋值的元素自动赋为零。例如:>>B(:,:,3)=[1,2;3,4];>>BB(:,:,1)=0000B(:,:,2)=0000B(:,:,3)=1234>>C(:,2,:)=[12;34];>>CC(:,:,1)=0103C(:,:,2)=0204问:e(:,2,:)=[123;456]将是什么样的数组?S(2,:,:)=[123;456]?123412/15/202475.matlab语言中也提供了相应的函数来创建多维数组,如rand、ones、zeros等。其使用方法与创建一维数组相同。例如:>>D=rand(2,3,2,2)%该例中显示了四维数组。%类似于2x2的分块矩阵,每块都是2x3的矩阵。D(:,:,1,1)=0.95010.60680.89130.23110.48600.7621D(:,:,2,1)=0.45650.82140.61540.01850.44470.7919D(:,:,1,2)=0.92180.17630.93550.73820.40570.9169D(:,:,2,2)=0.41030.05790.81320.89360.35290.00991112212212/15/202476.函数cat也是创建多维数组的一个实用的工具。其调用方法:cat(dim,A1,A2,…)输入参数中的dim为定义的维数,A1、A2等为构建数组的元素。例如:>>E=cat(4,[12;34],[56;78])E(:,:,1,1)=1234E(:,:,1,2)=567812/15/202477.多项式及相关函数

多项式的定义

多项式的定义如下:对于多项式,用以下行向量表示:这样就把多项式的问题转化为行向量的问题了。12/15/202478.

最简单的多项式输入即为直接的向量输入,matlab自动将向量元素按降幂顺序分配给各系数值。例如:输入多项式x^3-5x^2+6x-33.>>p=[1-56-33];>>poly2sym(p)%此函数可将多项式向量表示成符号多项式形式ans=x^3-5*x^2+6*x-3312/15/202479.多项式的操作下表是matlab中较常用的多项式函数。函数名说明函数名说明roots多项式求根polyfit多项式拟合poly由根创建多项式polyder求多项式导数polyval多项式求值conv多项式乘法polyvalm矩阵多项式求值deconv多项式除法12/15/202480.多项式求根函数roots的调用格式:roots(P)通过该函数可以求得方程p=0在复数范围内的解。例如:函数poly与roots相对应,其作用是由多项式对应的方程的根来创建多项式。例如:>>p=[103211];>>r=roots(p)r=0.3202+1.7042i0.3202-1.7042i-0.72090.0402+0.6780i0.0402-0.6780i>>poly(r)ans=1.00000.00003.00002.00001.00001.0000可见roots与poly是互逆运算。注意:由poly创建的多项式最高次系数为1.12/15/202481.Matlab中通过函数polyval和函数polyvalm可求得多项式在给定点的值:函数polyval:在输入变量值代人多项式计算时是以数组为单位的,polyval(p,v)。函数polyvalm:以矩阵为计算单位,进行矩阵式运算,以求多项式的值,polyvalm(p,v)。这两种计算在数值上有很大差别。例如:对同一多项式及变量值分别计算矩阵计算值和数组计算值。12/15/202482.>>p=[11155125];b=[11;11];>>polyval(p,b)ans=192192192192>>polyvalm(p,b)ans=206818120612/15/202483.多项式的乘法由函数conv来实现,此函数同于向量的卷积;多项式的除法由函数deconv来实现,此函数同于向量的解卷。例:计算两个多项式的乘除法。>>p=[2-56-19];poly2sym(p)ans=2*x^4-5*x^3+6*x^2-x+9>>d=[3-90-18];poly2sym(d)ans=3*x^2-90*x-18>>pd=conv(p,d)pd=6-195432-4539-792-162>>poly2sym(pd)ans=6*x^6-195*x^5+432*x^4-453*x^3+9*x^2-792*x-162>>p1=deconv(pd,d)%与p相同p1=2-56-1912/15/202484.多项式的微分由函数polyder来实现。例:对上例中多项式p进行微分计算。>>p=[2-56-19];poly2sym(p)ans=2*x^4-5*x^3+6*x^2-x+9>>dp=polyder(p)dp=8-1512-1>>poly2sym(dp)ans=8*x^3-15*x^2+12*x-112/15/202485.矩阵及相关函数矩阵的基本运算矩阵的加减运算与传统的矩阵运算相同,但在乘法运算中,就有关于算术乘(矩阵乘方)与点乘(点乘方)的区别,下面用示例说明两者的具体差别。>>a=[12;34];>>b=[56;78];>>c=a*bc=19224350>>d=a.*bd=5122132>>a^2ans=7101522>>a.^2ans=1491612/15/202486.在介绍矩阵除法前,先介绍矩阵与线性方程组之间的关系。对于线性方程组Ax=b,其中A为(n×m)阶矩阵:n=m且非奇异时,方程为恰定方程;n>m 方程为超定方程;(方程个数大于未知数的个数)n<m方程为不定方程。(方程个数小于未知数的个数)如果n>m,矩阵除法仍然可以得到方程的解,但不是精确解,而是近似解,该解确保误差向量Ax-b的二范数最小。如果n<m,即存在无穷多解,矩阵除法将会产生包含零元素最多的解,并一定是最小二乘解。12/15/202487.例如:n>m>>A=[1,4,6;3,5,6;7,8,3;4,6,7];>>b=[34,54,57,87];>>x=A\b'x=25.2078-20.520114.8480>>res=A*x-b‘;>>norm(res,2)ans=9.8821例如:n<m>>A=[2445;3451;7836];>>b=[234557];>>x=A\b'x=010.21871.8333-5.0417>>norm(A*x-b',2)ans=2.5619e-01412/15/202488.线性方程组的另一种解法:就是利用伪逆函数pinv:x=pinv*b。例如:>>A=[2445;3451;7836];>>b=[234557];>>y=pinv(A)*b‘y=4.97104.00503.4903-3.3847>>norm(A*x-b',2)ans=2.5619e-01412/15/202489.矩阵函数

这里介绍部分常用的函数。以示例的形式说明。>>A=[123;456;789];>>diag(A)%抽取矩阵的对角线ans=159>>diag(diag(A))%由矩阵的对角线生成对角阵ans=10005000912/15/202490.A=123456789>>tril(A)%抽取矩阵的下三角ans=100450789>>flipdim(A,2)%以第2列为轴线翻转矩阵ans=32165498712/15/202491.A=123456789>>find(A)‘%返回矩阵A的非零元素的存储下标,是列向量,故转置显示ans=123456789>>rot90(A)%矩阵A逆时针旋转90度ans=369258147>>rank(A)%求矩阵A的秩ans=212/15/202492.A=123456789>>det(A)%求矩阵A的行列式ans=0>>cond(A)%求矩阵的条件数ans=5.0524e+016在matlab中,判断矩阵的奇异性一般用函数cond,求矩阵的条件数,即矩阵最大奇异值与最小奇异值的比值。当矩阵的条件数很大时,说明矩阵趋近于奇异。12/15/202493.函数[x,y]=eig(A)可以求出矩阵A的特征值和特征向量的值x为特征向量矩阵,y为特征值矩阵。>>A=[73-2;34-1;-2-13];>>[x,y]=eig(A)x=0.57740.0988-0.8105-0.5774-0.6525-0.49080.5774-0.75130.3197y=2.00000002.39440009.605612/15/202494.Svd函数给出了矩阵的奇异值以及奇异值分解矩阵。[U,S,V]=svd(X)其中X=U×S×V’>>a=[1;1];>>[U,S,V]=svd(a)U=0.7071-0.70710.70710.7071S=1.41420V=112/15/202495.

LU分解:[L,U]=lu(A)又称三角分解,目的是分解成一个下三角阵L和一个上三角阵U的乘积,即A=L×U>>a=[123;241;467];>>[l,u]=lu(a)l=0.25000.50001.00000.50001.000001.000000u=4.00006.00007.000001.0000-2.5000002.5000注意:L实际上是一个“心理上”的下三角矩阵,它事实上是一个置换矩阵P的逆矩阵与一个真正下三角矩阵L1(其对角线元素为1)的乘积。12/15/202496.Chol分解:如果A为n阶对称正定矩阵,则存在一个非奇异下三角实矩阵L,使得A=LLT,当限定L的对角元素为正时,这种分解是唯一的。>>a=[4-11;-14.252.75;12.753.5];>>chol(a)ans=2.0000-0.50000.500002.00001.5000001.000012/15/202497.正交分解:A=QR将矩阵A做正交化分解,使得Q*R=A,其中Q为正交矩阵(其范数为1,指令norm(Q)=1),R为对角化的上三角矩阵。>>a=[111;2-1-1;2-45];>>[q,r]=qr(a)q=-0.3333-0.6667-0.6667-0.6667-0.33330.6667-0.66670.6667-0.3333r=-33-30-3300-312/15/202498.数据的统计分析一般来讲,矩阵的每一列代表统计过程不同的数据结果,而每一行则相应代表不同的样品。统计函数介绍

统计函数中的大部分函数都是针对列进行操作的。下表中列出部分常用的统计函数。回到主目录12/15/202499.函数说明函数说明max最大分量cumsum列累计和min最小分量cumprod列累计积mean平均值或列的平均值sort按升序排列std列的标准差sortrows按升序对行排列var列的方差trapz梯形数值积分corrcoef相关系数cov协方差矩阵sum列求和conv卷积prod列求积hist直方图12/15/2024100.应用实例

数据如下给出了12个学生的英语、数学、物理、化学和哲学的成绩。score=90999897779067875667899976677778889876895666754586677878899088788975856575766374736384769076869483539097979690718353557812/15/2024101.例如:>>score_sum=sum(score)%求各科成绩总分score_sum=9339791005878956>>score_avg=score_sum./12%求各科平均成绩score_avg=77.750081.583383.750073.166779.6667>>score_max=max(score)%求各科的最高分score_max=9099989790>>[score_max,score_max_student]=max(score)%求各科的最高分,

%并返回获得最高分的学生的编号score_max=9099989790score_max_student=1111612/15/2024102.问题:根据上述数据。求的各科的最低分

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论