MATLAB——数学建模基础教程

上传人:雅*** 文档编号:15528187 上传时间:2020-08-17 格式:PPTX 页数:183 大小:963.56KB
收藏 版权申诉 举报 下载
MATLAB——数学建模基础教程_第1页
第1页 / 共183页
MATLAB——数学建模基础教程_第2页
第2页 / 共183页
MATLAB——数学建模基础教程_第3页
第3页 / 共183页
资源描述:

《MATLAB——数学建模基础教程》由会员分享,可在线阅读,更多相关《MATLAB——数学建模基础教程(183页珍藏版)》请在装配图网上搜索。

1、MATLAB数学建模基础教程,主讲者:高陈燕,MATLAB数学建模基础教程,MATLAB的概述 MATLAB程序设计基础 MATLAB在数值计算中的应用 MATLAB的符号计算 MATLAB的图形处理,MATLAB程序设计基础,MATLAB语言的基本要素 MATLAB语言的核心矩阵 单元型数据和结构型数据 M文件 流程控制语句,2020年8月17日3时51分,4,MATLAB语言的基本要素,变量 变量不需要事先声明,也不需要指定变量类型,它会自动根据所赋予变量的值或对变量的操作来确定变量的类型;赋值过程中,如果变量已存在,则用新值代替旧值,以新的类型代替旧的类型。 变量的命名规则: 变量名区分

2、大小写; 变量名长度不超过31位,第31位之后的字符被忽略; 变量名以字母开头,变量名中可以包含字母、数字、下划线,但不能使用标点。 变量一般为局部变量,即仅在其调用的M文件内部有效;若要定义全局变量,须在变量前加关键字global。,Matlab语言主要是由几个基本要素构建而成的,其中包括变量、常量、数值、字符串、运算符及标点等。,回到主目录,2020年8月17日3时51分,5,常量 matlab中预定义的一些特殊的量。 i,j 虚数单位 Realmin 最小的正浮点数, pi 圆周率 Realmax 最大的浮点数, eps 浮点运算的相对精度 Inf 无穷大 NaN Not-a-Numbe

3、r ,表示不定值 例如: pi ans = %ans是默认的结果变量 3.1416,2020年8月17日3时51分,6,1/0 Warning: Divide by zero. ans = Inf 0/0 Warning: Divide by zero. ans = NaN,2020年8月17日3时51分,7,定义变量时应避免与常量名相同,如果改变了某个常量的值,可以用“clear+常量名”命令来恢复该常量的初始设定值。,pi=1 pi = 1 clear pi pi ans = 3.1416,2020年8月17日3时51分,8,数值 数值缺省为实数保留小数点后4位浮点数表示。其输入格式与C语

4、言一致:如:9 -73 0.1999 1.475e6 输出格式由format命令控制,只是影响屏幕显示效果,不影响内部存储和计算。下面以pi为例。,format long;pi ans = 3.14159265358979 format long e;pi ans = 3.141592653589793e+000 format long g;pi ans = 3.14159265358979,2020年8月17日3时51分,9, z=2*exp(pi/3i) z = 1.0000 + 1.7321i,Matlab语言还提供了复数的表达和运算功能。复数的基本单位表示为i或j。例如: 如果是表达式

5、,必须在虚部的数值与i、j之间使用乘号。, sin(pi/3)+cos(pi/3)j ? sin(pi/3)+cos(pi/3)j Error: Unexpected MATLAB expression. sin(pi/3)+cos(pi/3)*j ans = 0.8660 + 0.5000i,2020年8月17日3时51分,10,字符串 字符串用单引号输入或赋值; 字符串的每个字符都是都是字符数组的一个元素; 字符串和字符数组基本上等价。, s=i love you s = i love you, size(s) ans = 1 10, s(2) ans = s(10) ans = u,字符

6、串的每个字符(包括空格)都是字符数组的一个元素。 在matlab中,字符串与字符数组或矩阵基本上是等价的。,2020年8月17日3时51分,11,如果在字符串内使用单引号时,可以用连续两个单引号表示。例如:,字符串之间的转换函数: double 字符串转换为数值代码 num2str 数字转换为字符串 int2str 整数转换为字符串 mat2str 矩阵转换为字符串 str2num 转换字符串为数字, double(s) %s=i love you ans = 105 32 108 111 118 101 32 121 111 117, s=its good s = its good,2020

7、年8月17日3时51分,12, a=1:5 a = 1 2 3 4 5 b=num2str(a) b = 2 3 4 5 a*2 ans = 2 4 6 8 10 b*2 ans = 98 64 64 100 64 64 102 64 64 104 64 64 106,2020年8月17日3时51分,13,matlab对字符串的操作与C语言中的几乎完全相同: strcat 链结串 strcmp 比较串 strvcat 垂直链结串 strncmp 比较串的前n个字符 findstr 在其他串中找此串 upper 转换串为大写 lower 转换串为小写 blanks 生成空串 deblank 移去

8、串中空格 ,例如:把前面的字符串s转化成大写。s=“it good” upper(s) ans = ITS GOOD,执行字符串的功能用eval来实现。 t=1/(a*b-1);a=2;b=3;c=eval(t) % 可以在一行中表示。 c = 0.2000,2020年8月17日3时51分,14,运算符 在matlab语言中运算符包括算术运算符、关系运算符和逻辑运算符。其中算术运算符见右表: 其中点运算是指操作元素点对点的运算,也就是说矩阵内元素对元素之间的运算,点运算要求参与运算的变量在结构上必须是相似的。 例如:,2020年8月17日3时51分,15, a=1,2,3;4,5,6;7,8,

9、9 a = 1 2 3 4 5 6 7 8 9 b=1 2 3 4 5 6 7 8 9 b = 1 2 3 4 5 6 7 8 9, c=a*b c = 30 36 42 66 81 96 102 126 150 d=a.*b d = 1 4 9 16 25 36 49 64 81,思考: 题目:通过描点法得到sin(x)xcos(x)函数在0-pi区间上的曲线。 提示:通过点运算获得。(附件diancheng。txt),2020年8月17日3时51分,16,Matlab语言的关系运算符如右表: 当判断一个矩阵是否为空矩阵时,一般不用“=”,而应当使用函数isempty。,2020年8月17日

10、3时51分,17,Matlab语言的逻辑运算符如右表: 进行逻辑判断时,所有非零数值均被认为为真,而零为假;在逻辑判断结果中,判断为真时输出1,为假时输出0. 三种运算符中,它们的优先级关系先后为:算术运算符、关系运算符、逻辑运算符。,2020年8月17日3时51分,18,a=1:3;4:6;7:9; x=5; y=ones(3)*5; xa=xb=0 1 0;1 0 1;0 0 1;,ab=a a(:,3)=zeros(5,1) a = 17 24 0 8 15 23 5 0 14 16 4 6 0 20 22 10 12 0 21 3 11 18 0 2 9 a1=all(a(:,1)10

11、) a1 = 0,a2=all(a3) a2 = 1 1 0 0 0 a11=any(a(:,1)10) a11 = 1 a22=any(a10) a22 = 1 1 0 1 1,2020年8月17日3时51分,20,标点 在matlab中一些标点符号也被赋以特殊的意义,或表示要进行一定的运算等,如下表:,2020年8月17日3时51分,21,下面对上表中各标点作进一步的介绍。 首先,用冒号来定义行向量。 基本格式:xx1:step:x2(初始值:步长:尾元素数值限) xx1:x2 (默认步长为1) 注意:这里强调x2为尾元素数值限,而不是尾元素值。当x2-x1恰为步长的整数倍时,x2才能成为

12、尾值。 例如:,2020年8月17日3时51分,22, a=1:2:12 a = 1 3 5 7 9 11 a=12:-2:1 a = 12 10 8 6 4 2 a=1:6 a = 1 2 3 4 5 6 a=2:2:12 a = 2 4 6 8 10 12,2020年8月17日3时51分,23,其次,通过使用冒号,可以截取指定矩阵中的部分。例如:, a=1:18;a=reshape(a,3,6) %重组矩阵 a = 1 4 7 10 13 16 2 5 8 11 14 17 3 6 9 12 15 18 a1=a(:,1:3) %提取矩阵a的第1到3列元素组成的子矩阵。 a1 = 1 4

13、7 2 5 8 3 6 9 a2=a(1:2,3:end) a2 = 7 10 13 16 8 11 14 17,思考:B1=a(1:3,:)?,2020年8月17日3时51分,24,分号在matlab语言中所起的作用是作为分隔行的标志,这里包括在矩阵定义中对行的区分以及在程序代码中对行的划分。在矩阵定义中,分号之间的数据被认为是矩阵的同一行。对于以分号结尾的行语句,matlab语言不会把其运算结果显示在命令窗口中。 逗号主要起两个作用。其一是逗号是函数参数的分隔符,也是矩阵下标的分隔符。其二是逗号也是区分矩阵列的标志,在同一行中,逗号分隔开的是各个列。 括号是调整运算先后次序的标点,可以通过

14、引用括号来调整运算次序。 矩阵的定义需要使用中括号。此外,中括号可以表示空矩阵,并通过该空矩阵实现对矩阵的部分删除。以下举例:,2020年8月17日3时51分,25, a=1,2,3,4;5,6,7,8;4,3,2,1;8,7,6,5 a = 1 2 3 4 5 6 7 8 4 3 2 1 8 7 6 5 a(:,1:2)= a = 3 4 7 8 2 1 6 5 b=a(1 3,:) b = 3 4 2 1,2020年8月17日3时51分,26,大括号是单元型数据所特有的标点。后面介绍。 小数点“.”,它起到了数学符号的作用;而作为点运算的标志符,它又构成了各种各样的点运算;最重要的是它可作

15、为结构型数组应用时的专有符号。 “”为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: Unexpected MATLAB expression.,2020年8月17日3时51分,27,在matlab语言中,一行内在“%”之后的文字均被认为是对M文件或程序代码的解释部分。 “!”可以在命令窗口直接调用操作系统命令,

16、例如DOS命令,并将结果展示在命令窗口中,比如在命令窗口中调用“!dir c”,以显示C盘的文件列表。 单引号作为字符串的标示符而存在,同时,它在矩阵运算中也表示矩阵的转置运算及复数的共轭值。,2020年8月17日3时51分,28, a=1,2,3,4;5,6,7,8 a = 1 2 3 4 5 6 7 8 a ans = 1 5 2 6 3 7 4 8 s=3-4i;s ans = 3.0000 + 4.0000i,回到主目录,2020年8月17日3时51分,29,MATLAB语言的核心矩阵,矩阵的生成 直接输入小矩阵(最简便的方法) 注意点: 输入矩阵时要以“ ”为其标识,即矩阵的元素应在

17、“”内部。 矩阵的同行元素之间可由空格或“ ,”分隔,行与行之间用“;”或回车符分隔。 矩阵元素可为运算表达式。 无任何元素的空矩阵也合法。,回到主目录,2020年8月17日3时51分,30,A = 1,2,3; 4,5,6; 7,8,9 A = 1 2 3 4 5 6 7 8 9,a=1 2 3 4 5 6 7 8 9 a = 1 2 3 4 5 6 7 8 9,创建带有运算表达式的矩阵: b=sin(pi/3),cos(pi/4);log(9),tan(pi/4);% 什么样的结果?,2020年8月17日3时51分,31,利用中括号将小矩阵合成一个大矩阵 b=1,2;3,4; a=b,b;

18、b2,b*3 a = 1 2 1 3 3 4 2 4 7 10 3 6 15 22 9 12 从外部文件引用矩阵(excel,txt) (shuju1,shuju2),2020年8月17日3时51分,32,特殊矩阵的生成 常用的特殊矩阵 空 阵: 单 位 阵: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) 产生一个mn的均匀分布的随机矩阵,2020年8月17日3时51分,33, eye(2,3) ans =

19、 1 0 0 0 1 0 zeros(2,3) ans = 0 0 0 0 0 0 ones(2,3) ans = 1 1 1 1 1 1 v=5 6 7;a=diag(v) a = 5 0 0 0 6 0 0 0 7, eye(2) ans = 1 0 0 1 zeros(2) ans = 0 0 0 0 ones(2) ans = 1 1 1 1,如果已知a为方阵,则v=diag(a)可以提取a的对角元素构成向量v。,2020年8月17日3时51分,34,其他特殊矩阵 compan 友矩阵函数 magic 魔方矩阵 hankel Hankel矩阵 rosser 对称特征值测试矩阵 hilb

20、 Hilbert矩阵 pascal Pascal矩阵 invhilb 反Hilbert矩阵 vander 范德蒙矩阵 其中,compan(c),结果是生成一以向量c为系数的多项式的特征矩阵。hilb所生成的hilbert矩阵的特点是矩阵中的元素值为1/(i+j-1)。,2020年8月17日3时51分,35,单元型数据和结构型数据,单元型变量 单元型变量是matlab语言中较为特殊的一种数据类型。本质上讲,单元型变量为任意类型的多维数组。 单元型变量可有两种方式:一种是用赋值语句直接定义,另一种是由cell函数预先分配存储空间,然后对单元元素逐个赋值。 在直接赋值过程中,与在矩阵的定义中使用中括

21、号不同,单元型变量的定义需用大括号,而元素间用逗号隔开。,回到主目录,2020年8月17日3时51分,36,a=1,2;3,4 a = 1 2 3 4 b=1:4,a,abcd b = 1x4 double 2x2 double abcd cellplot(b) %图形显示单元型变量的内容 celldisp(b) %显示单元型变量的内容 b1 = 1 2 3 4 b2 = 1 2 3 4 b3 = abcd,2020年8月17日3时51分,37,单元型变量元素的引用采用大括号为下标标识,用小括号只显示该元素的压缩形式。例如:,b2 ans = 1 2 3 4 b(2) ans = 2x2 do

22、uble,注意:单元型变量的元素不是以指针方式保存的。 思考:如果改变了上例中的a矩阵,那么单元型变量b中的第二个元素改变不?,2020年8月17日3时51分,38,单元型变量与矩阵的另一个区别是单元型变量自身可以嵌套。例如: c=cell(1,3) %另一种定义法 c1,1=1:4; c1,2=a; c1,3=b;% b=1:4,a,abcd c c = 1x4 double 2x2 double 1x3 cell c33 ans = abcd,2020年8月17日3时51分,39,结构型变量 在matlab语言中结构型变量的定义也有两种方法,其一是直接赋值定义,其二是由函数struct定义

23、。以指针操作符“.”连接结构型变量名与属性名。 直接赋值时,应当指出结构中的属性名。例如: A.a1=abcd; %字符串类型 A.a2=1; %数值类型 A.a3=1,2,3,4; %数组类型 A A = a1: abcd a2: 1 a3: 1 2 3 4 思考:如何引用结构型变量名A中a1属性的c元素。,2020年8月17日3时51分,40,由函数struct定义结构型变量,其调用格式如下: 结构型变量名=struct(元素名1,元素值1,元素2,元素值2,) B=1,2;3,4; C=struct(c1,1,c2,B,c3,abcd) C = c1: 1 c2: 2x2 double

24、c3: abcd C.c2 ans = 1 2 3 4,2020年8月17日3时51分,41,结构型变量可以嵌套定义。例如: C.c1=A %前面结构型变量A C = c1: 1x1 struct c2: 2x2 double c3: abcd C.c1.a1 %嵌套结构型变量的引用 ans = abcd,2020年8月17日3时51分,42,M文件,所谓M文件就是由matlab语言编写的可在matlab语言环境下运行的程序源代码文件。Matlab语言中的M文件可分为命令式(script)和函数式(function)两种形式。M文件可在matlab的程序编辑器中编写,也可在其他的文本编辑器中编

25、写,并以“.m”为扩展名加以保存。 命令式文件 命令式文件就是命令行的简单叠加,matlab会自动按顺序执行文件中的命令。值得注意的是,命令式文件在运行过程中可以调用matlab工作域内所有的数据,而且所产生的所有变量均为全局变量。,回到主目录,2020年8月17日3时51分,43,函数式文件 函数式文件主要用于解决计算中的参数传递和函数调用的问题。函数式的标志是它的第一行为function语句。函数式文件可以有返回值,也可以没有。函数式文件执行之后,只保留最后结果,不保留任何中间过程,所定义的变量也仅在函数内部起作用,并随着调用的结束而被清除。即除无特殊声明外,其变量均为局部变量。 注意:

26、存储函数式M文件时文件名要与主函数名相一致。,2020年8月17日3时51分,44,函数式文件: function abcd(a,b) c=a+b d=b-a 保存为abcd.m 在工作窗口中调用: a=2;b=3,4,5,6; abcd(a,b) c = 5 6 7 8 d = 1 2 3 4 c %结果是什么?,命令式文件: a=2; b=3 4 5 6; c=a+b; d=b-a; 保存为:abcd.m 在工作窗口中调用: abcd %文件名即可 c c = 5 6 7 8 d d = 1 2 3 4,2020年8月17日3时51分,45,函数变量及变量作用域 变量主要有输入变量、输出变

27、量及函数内部变量。 输入变量相当于函数的入口数据,是一个函数操作的主要对象。函数的作用就是对输入变量进行加工以实现一定的功能。函数的输入变量为形式参数,即只是传递变量的值而不是变量的地址,函数对输入变量的一切的操作和修改如果不依靠输出变量传出的话,将不会影响工作空间 中该变量的值。 matlab语言提供了函数nargin来控制输入变量的个数,即可以实现不定参数输入的操作。 例如:在函数test1中,如果调用过程时只提供一个输入变量,则求该输入变量的模;如果是两个输入变量,则求两个输入变量的和,2020年8月17日3时51分,46,%如果调用过程时只提供一个输入变量,则求该输入变量%的模; 如果

28、是两个输入变量,则求两个输入变量的和 function c=test1(a,b) if nargin=1 c=norm(a); elseif nargin=2 c=a+b; end 在工作窗口调用: a=2 3 4 a = 2 3 4 test1(a) ans = 5.3852 b=3; test1(a,b) ans = 5 6 7,2020年8月17日3时51分,47,同时,matlab语言还提供了另一个针对输入变量的函数varargin。该函数可以实现不定数目输入变量的函数的程序设计。此时,对函数的一切输入变量均将存储在以varargin命名的单元型数组中。 例:在函数test2中,实现如

29、下功能: 通过使用函数varargin,用户可以输入任意多个学生的 数学、英语及语文的成绩,然后求各科目的平均值。 程序如下:,2020年8月17日3时51分,48,function mathavg,englishavg,chineseavg=test2(varargin) s=length(varargin); %求数组的长度 mathsum=0; englishsum=0; chinesesum=0; for j=1:s mathsum=mathsum+vararginj(1); englishsum=+vararginj(2); chinesesum=+vararginj(3); end

30、 mathavg=mathsum/s; englishavg=englishsum/s; chineseavg=chinesesum/s; 思考:此函数如何调用。,2020年8月17日3时51分,49,与输入变量相对应,matlab语言对输出变量也提供了相应的函数,如nargout、varargout等。具体的使用与函数nargin和varargin相似。 下面给出一个综合应用示例。 示例函数test3中,综合使用了函数nargin、nargout、narargin、narargout等,函数目的是求各学生(总数不确定)的个人平均成绩,以及指定科目的平均成绩等。,函数test2的调用:90,8

31、9,60分别表示数学、英语、语文的成绩 a,b,c=test2(90,89,60,79,89,66,99,98,100) a = 89.3333 b = 32.6667 c = 33.3333 思考:如果多个学生的成绩是同一科目的成绩放在一个数组中,如何修改test2函数。,2020年8月17日3时51分,50,function vararout=test3(lessons,varargin) inputnum=nargin; lessonnum=length(lessons); outputnum=nargout; for i=1:lessonnum switch lessons(i) ca

32、se math vararout1=sum(varargin1:inputnum(1); case english vararout2=sum(varargin1:inputnum(2); case chinese vararout3=sum(varargin1:inputnum(3); end end for i=1:inputnum varargouti+3=sum(varargini(:); end,2020年8月17日3时51分,51,在matlab中,函数内部定义的变量除特殊声明外均为局部变量。如果需要使用全局变量,则应当使用命令global定义,而且在任何使用该全局变量的函数中都应

33、加以定义,在命令窗口中也不例外。 注意:变量之间必须以空格分隔,而不能用逗号分隔。 示例:,function avgs=test4(A) global s ss %定义全局变量 m,n=size(A); for i=1:m s(i)=sum(A(i,:); end ss=sum(s); avgs=ss/(m*n);,调用test4: a=4 3 5;6 7 8;3 5 7;1 3 4; test4(a) ans = 4.6667 global s ss ss ss = 56 s s = 12 21 15 8,2020年8月17日3时51分,52,子函数与局部函数 Matlab中也可以定义子函数

34、,用来扩充函数的功能。在函数文件中题头定义的函数为主函数,而在函数体内定义的其他函数均被视为子函数。子函数只能为主函数或同一主函数下的其他的子函数所调用。 示例:,function c=test(a,b) %主函数 c=test1(a,b)*test2(a,b); function c=test1(a,b) %子函数1 c=a+b; function c=test2(a,b) %子函数2 c=a-b;,2020年8月17日3时51分,53,局部函数与子函数的区别是:局部函数可以被其父目录下的所有函数所调用,而子函数则只能被其所在M文件的主函数所调用;在函数编辑的结构上,局部函数与一般的函数文件

35、的编辑相同,而子函数则只能在主函数文件中编辑。,2020年8月17日3时51分,54,程序设计的辅助函数 用户交互函数 键盘输入函数包括函数input及keyboard。 函数input用于提示用户输入指定参数的值,调用格式: var=input(提示性语句) 其中,“提示性语句”将给出相应的提示信息以告知用户输入的对象,在这种调用过程中,用户可以有键盘输入任何的可计算的表达式或已赋值的当前工作空间中的变量名,而且返回至变量var中的值也是数值型,所有的输入以回车键加以确认。,2020年8月17日3时51分,55,第一种调用格式: a=input(input examplen) input e

36、xample 1+4 a = 5 ischar(a) ans = 0,第二种调用格式: b=input(input examplen,s) input example 1+4 b = 1+4 ischar(b) ans = 1,函数input的另一种调用格式: var=input(提示性语句,s) 以该格式调用时,input函数将视用户键盘输入的一切字符为字符型赋予变量var,而不对其进行任何计算。在提示型语句中可以用“n”来控制显示时的换行。例如:,2020年8月17日3时51分,56,另一种输入函数为keybroad,该函数出现在M文件中时,将终止程序的运行,此时用户可以查看运算过程中各变

37、量的值必要时也可进行适当的干涉及编辑。同时该函数在matlab语言中均可应用,直到键入return并回车,这时程序返回中断处,继续执行其余代码。 matlab也提供了一种中断函数pause,其调用格式: pause(n) 该命令的作用是中断程序运行并等待n秒。如果不带参数,则程序无限期中断,直到用户在键盘上键入任意键。,2020年8月17日3时51分,57,流程控制语句,Matlab语言的流程控制语句主要有for、while、if-else-end和switch-case这四种语句。 for语句 for循环语句是流程控制语句中的基础,使用该循环语句可以以指定的次数重复执行循环体内的语句。 fo

38、r循环语句的调用形式: for 循环控制变量=(可以是已定义的向 量,也可在for循环语句中定义) 循环体 end,回到主目录,2020年8月17日3时51分,58,for i = 1:4 % 初始值:步长:终值(步长默认为1) for j = 4:-1:1 H(i, j) = 1/(i+j-1); end end 结果: H H = 1.0000 0.5000 0.3333 0.2500 0.5000 0.3333 0.2500 0.2000 0.3333 0.2500 0.2000 0.1667 0.2500 0.2000 0.1667 0.1429,2020年8月17日3时51分,59,

39、循环次数的设定还可以由mxn矩阵来实现,此时,整个循环将执行n次,并且每次循环变量为一列向量。例如:,a=1 2 3 4;5 6 7 8; s=0; for i=a i s=s+1; end,i = 1 5 i = 2 6 i = 3 7 i = 4 8 s= ?,2020年8月17日3时51分,60,while语句 while循环语句与for循环语句不同的是,前者是以条件的满足与否来判断循环是否结束的,而后者则是以执行次数是否达到指定值来判断的。 while循环语句的一般形式: while 循环体 end 循环判断语句为某种形式的逻辑判断表达式。当表达式的值为真时就执行循环体内的语句;否则退

40、出。当循环判断语句为矩阵时,当且仅当所有的矩阵元素非零时,逻辑表达式的值为真。 例如:,2020年8月17日3时51分,61,n = 0; while 2n 100 n = n + 1; end,从例子中可以看出while循环语句与for循环语句是有异曲同工之处的。但是两者还是有区别的,for循环语句一般适用于已知到循环次数,而不知道循环运算目标的问题;while循环语句则一般适用于已知循环运算目标,而循环次数未知的问题。 break语句:当程序流程运行至该命令时,则不论循环控制变量是否满足循环判断语句,均将退出当前循环,执行循环后的其他语句。 continue命令:当程序流程运行至该命令时,

41、会忽视其后的循环体操作转而执行下一层的循环。,2020年8月17日3时51分,62,例1.计算级数:S=1+2+22+23+263=,法一: s=0; i=0; while i n=0:1:63; S=sum(2.n),2020年8月17日3时51分,63,if-else-end语句 if-else-end语句的一般形式: if 逻辑值为“真”时执行语句 else 逻辑值为“假”时执行语句 end 例如: if a=1 a=a+1; else a=a+2; end,2020年8月17日3时51分,64,在程序设计中,也常碰到需要进行多重逻辑选择的问题,这时可以采用if-else-end语句的嵌

42、套形式: if 逻辑值1为“真”时执行语句 elseif 逻辑值2为“真”时执行语句 elseif else 当以上所有的逻辑值均为“假”时执行语句 end,2020年8月17日3时51分,65,If AB greater elseif AB less elseif A=B equal else error(Aand B are different data) end,解读这段程序: a=10000; n=0; z=1; while z a n = n + 1; if mod(n,2)=1 continue end z=2n-1; if isprime(z)%是否质数 break end en

43、d,2020年8月17日3时51分,66,switch-case语句 switch-case语句是用于解决多分支判断选择的问题。 switch-case语句的一般表达形式: switch case 选择判断值1 选择判断语句1 case 选择判断值2 选择判断语句2 otherwise 判断执行语句 end,2020年8月17日3时51分,67,例如: code=1 switch code case -1 disp(error); case 0 disp(write in English); case 1 disp(write in Chinese); otherwise disp(write

44、 in French); end 结果: write in Chinese,注意:在matlab语言中,即使有多条case判断语句为真,也只执行所遇到的第一条为真的语句。不必像C语句那样,在每条case语句后加上break语句防止继续执行后面为真的case条件语句。,2020年8月17日3时51分,68,例:求鸡兔同笼问题:鸡兔同笼,头共36,脚共100.求鸡、兔各几只? 程序如下: i=1; while 1 if mod(100-2*i,4)=0 上述程序中有两个错误,请指出!,2020年8月17日3时51分,69,MATLAB在数值计算中的应用,数值计算的基本要素及相关函数 数据的统计分析

45、 曲线拟合及插值 数值分析,2020年8月17日3时51分,70,数值计算的基本要素及相关函数,MATLAB语言在数值计算中的基本要素主要有数组、多项式和矩阵。 数组及相关函数 数组的创建 数组的定义相当简捷,主要有三种格式: xx1:step:x2 (初始值:步长:尾元素数值限) y=linspace(x1,x2,n) (初始值:终止值:数组元素个数)n默认为100 y=logspace(x1,x2,n) (初始值:终止值:数组元素个数)n默认为50,回到主目录,2020年8月17日3时51分,71,例如: a=1:2:12 a = 1 3 5 7 9 11 b=linspace(1,10,

46、10) b = 1 2 3 4 5 6 7 8 9 10 c=logspace(0,2,10) c = 1.0000 1.6681 2.7826 4.6416 7.7426 12.9155 21.5443 35.9381 59.9484 100.0000,2020年8月17日3时51分,72,数组的操作 例如:,a = 1 3 5 7 9 11 a(3) %取a数组中的第3个元素 ans = 5 a(2:5) %取数组a中第2个元素到第5个元素 ans = 3 5 7 9 a.2 %数组的平方 ans = 1 9 25 49 81 121 length(a) %检测数组的长度,返回数组的元素个

47、数 ans = 6,2020年8月17日3时51分,73,多维数组 多维数组从某种角度来看,它是矩阵在维数上的扩张,实际上也是矩阵中的一个特例。它可以是数值型、字符型、单元型或结构型等。 多维数组在创建及处理上与一维数组或普通矩阵有很大的不同。其创建方法有很多,可以仿照一维数组的定义,也可以通过matlab的有关函数来创建。 直接赋值: 例如: A(:,:,1)=1 2 3;4 5 6;6 7 8; A(:,:,2)=7 8 9;5 6 7;3 2 1; A(:,:,3)=9 8 7;6 5 4;2 3 4;,2020年8月17日3时51分,74,注意多维数组的显示方法: A A(:,:,1)

48、 = 1 2 3 4 5 6 6 7 8 A(:,:,2) = 7 8 9 5 6 7 3 2 1 A(:,:,3) = 9 8 7 6 5 4 2 3 4 A(2,3,2)=?,数组A就像一个分块矩阵,每块都是3x3的矩阵。,2020年8月17日3时51分,75,还可以简单的只对其中某一维的元素进行赋值。系统会根据赋值的情况来确定该变量的具体维数结构并将其他未赋值的元素自动赋为零。例如:, B(:,:,3)=1,2;3,4; B B(:,:,1) = 0 0 0 0 B(:,:,2) = 0 0 0 0 B(:,:,3) = 1 2 3 4, C(:,2,:)=1 2 ; 3 4; C C(

49、:,:,1) = 0 1 0 3 C(:,:,2) = 0 2 0 4 问:e(:,2,:)=1 2 3; 4 5 6将是什么样的数组? S(2,:,:)=1 2 3;4 5 6?,1 2 3 4,2020年8月17日3时51分,76,matlab语言中也提供了相应的函数来创建多维数组,如rand、ones、zeros等。其使用方法与创建一维数组相同。 例如:, D=rand(2,3,2,2) %该例中显示了四维数组。% 类似于2x2的分块矩阵,每块都是2x3的矩阵。 D(:,:,1,1) = 0.9501 0.6068 0.8913 0.2311 0.4860 0.7621 D(:,:,2,

50、1) = 0.4565 0.8214 0.6154 0.0185 0.4447 0.7919 D(:,:,1,2) = 0.9218 0.1763 0.9355 0.7382 0.4057 0.9169 D(:,:,2,2) = 0.4103 0.0579 0.8132 0.8936 0.3529 0.0099,2020年8月17日3时51分,77,函数cat也是创建多维数组的一个实用的工具。 其调用方法:cat(dim,A1,A2,) 输入参数中的dim为定义的维数,A1、A2等为构建数组的元素。例如:, E=cat(4,1 2;3 4,5 6;7 8) E(:,:,1,1) = 1 2 3

51、 4 E(:,:,1,2) = 5 6 7 8,2020年8月17日3时51分,78,多项式及相关函数 多项式的定义 多项式的定义如下: 对于多项式 ,用以下行向量表示: 这样就把多项式的问题转化为行向量的问题了。,2020年8月17日3时51分,79,最简单的多项式输入即为直接的向量输入,matlab自动将向量元素按降幂顺序分配给各系数值。 例如:输入多项式x3-5x2+6x-33. p=1 -5 6 -33; poly2sym(p) %此函数可将多项式向量表示成符号多项式形式 ans = x3-5*x2+6*x-33,2020年8月17日3时51分,80,多项式的操作 下表是matlab中

52、较常用的多项式函数。,2020年8月17日3时51分,81,多项式求根函数roots的调用格式: roots(P) 通过该函数可以求得方程p=0在复数范围内的解。 例如: 函数poly与roots相对应,其作用是由多项式对应的方程的根来创建多项式。 例如:, p=1 0 3 2 1 1; r=roots(p) r = 0.3202 + 1.7042i 0.3202 - 1.7042i -0.7209 0.0402 + 0.6780i 0.0402 - 0.6780i, poly(r) ans = 1.0000 0.0000 3.0000 2.0000 1.0000 1.0000,可见roots

53、与poly是互逆运算。 注意:由poly创建的多项式最高次系数为1.,2020年8月17日3时51分,82,Matlab中通过函数polyval和函数polyvalm可求得多项式在给定点的值: 函数polyval:在输入变量值代人多项式计算时是以数组为单位的,polyval(p,v)。 函数polyvalm:以矩阵为计算单位,进行矩阵式运算,以求多项式的值,polyvalm(p,v)。 这两种计算在数值上有很大差别。 例如:对同一多项式及变量值分别计算矩阵计算值和数组计算值。,2020年8月17日3时51分,83, p=1 11 55 125;b=1 1;1 1; polyval(p,b) a

54、ns = 192 192 192 192 polyvalm(p,b) ans = 206 81 81 206,2020年8月17日3时51分,84,多项式的乘法由函数conv来实现,此函数同于向量的卷积; 多项式的除法由函数deconv来实现,此函数同于向量的解卷。 例:计算两个多项式的乘除法。, p=2 -5 6 -1 9; poly2sym(p) ans = 2*x4-5*x3+6*x2-x+9 d=3 -90 -18; poly2sym(d) ans = 3*x2-90*x-18 pd=conv(p,d) pd = 6 -195 432 -453 9 -792 -162 poly2sym

55、(pd) ans = 6*x6-195*x5+432*x4-453*x3+9*x2-792*x-162 p1=deconv(pd,d) %与p相同 p1 = 2 -5 6 -1 9,2020年8月17日3时51分,85,多项式的微分由函数polyder来实现。 例:对上例中多项式p进行微分计算。, p=2 -5 6 -1 9; poly2sym(p) ans = 2*x4-5*x3+6*x2-x+9 dp=polyder(p) dp = 8 -15 12 -1 poly2sym(dp) ans = 8*x3-15*x2+12*x-1,2020年8月17日3时51分,86,矩阵及相关函数 矩阵的

56、基本运算 矩阵的加减运算与传统的矩阵运算相同,但在乘法运算中,就有关于算术乘(矩阵乘方)与点乘(点乘方)的区别,下面用示例说明两者的具体差别。, a=1 2;3 4; b=5 6;7 8; c=a*b c = 19 22 43 50 d=a.*b d = 5 12 21 32, a2 ans = 7 10 15 22 a.2 ans = 1 4 9 16,2020年8月17日3时51分,87,在介绍矩阵除法前,先介绍矩阵与线性方程组之间的关系。对于线性方程组Axb,其中A为(nm)阶矩阵: n=m且非奇异时,方程为恰定方程; nm 方程为超定方程;(方程个数大于未知数的个数) nm,矩阵除法仍

57、然可以得到方程的解,但不是精确解,而是近似解,该解确保误差向量Ax-b的二范数最小。 如果nm,即存在无穷多解,矩阵除法将会产生包含零元素最多的解,并一定是最小二乘解。,2020年8月17日3时51分,88,例如:nm A=1,4,6;3,5,6;7,8,3;4,6,7; b=34,54,57,87; x=Ab x = 25.2078 -20.5201 14.8480 res=A*x-b; norm(res,2) ans = 9.8821,例如:n A=2 4 4 5;3 4 5 1;7 8 3 6; b=23 45 57; x=Ab x = 0 10.2187 1.8333 -5.0417

58、norm(A*x-b,2) ans = 2.5619e-014,2020年8月17日3时51分,89,线性方程组的另一种解法:就是利用伪逆函数pinv:x=pinv*b。 例如:, A=2 4 4 5;3 4 5 1;7 8 3 6; b=23 45 57; y=pinv(A)*b y = 4.9710 4.0050 3.4903 -3.3847 norm(A*x-b,2) ans = 2.5619e-014,2020年8月17日3时51分,90,矩阵函数 这里介绍部分常用的函数。以示例的形式说明。, A=1 2 3;4 5 6;7 8 9; diag(A) %抽取矩阵的对角线 ans = 1

59、 5 9 diag(diag(A) %由矩阵的对角线生成对角阵 ans = 1 0 0 0 5 0 0 0 9,2020年8月17日3时51分,91,A = 1 2 3 4 5 6 7 8 9 tril(A) %抽取矩阵的下三角 ans = 1 0 0 4 5 0 7 8 9 flipdim(A,2) %以第2列为轴线翻转矩阵 ans = 3 2 1 6 5 4 9 8 7,2020年8月17日3时51分,92,A = 1 2 3 4 5 6 7 8 9 find(A) %返回矩阵A的非零元素的存储下标,是列向量,故转置显示 ans = 1 2 3 4 5 6 7 8 9 rot90(A) %

60、矩阵A逆时针旋转90度 ans = 3 6 9 2 5 8 1 4 7 rank(A) %求矩阵A的秩 ans = 2,2020年8月17日3时51分,93,A = 1 2 3 4 5 6 7 8 9 det(A) %求矩阵A的行列式 ans = 0 cond(A) %求矩阵的条件数 ans = 5.0524e+016 在matlab中,判断矩阵的奇异性一般用函数cond,求矩阵的条件数,即矩阵最大奇异值与最小奇异值的比值。当矩阵的条件数很大时,说明矩阵趋近于奇异。,2020年8月17日3时51分,94,函数 x,y=eig(A) 可以求出矩阵A的特征值和特征向量的值 x为特征向量矩阵,y为特

61、征值矩阵。,A=7 3 -2;3 4 -1;-2 -1 3; x,y=eig(A) x = 0.5774 0.0988 -0.8105 -0.5774 -0.6525 -0.4908 0.5774 -0.7513 0.3197,y = 2.0000 0 0 0 2.3944 0 0 0 9.6056,2020年8月17日3时51分,95,Svd函数给出了矩阵的奇异值以及奇异值分解矩阵。 U,S,V=svd(X) 其中XUSV,a=1;1; U,S,V=svd(a) U = 0.7071 -0.7071 0.7071 0.7071 S = 1.4142 0 V = 1,2020年8月17日3时5

62、1分,96,LU分解:L,U=lu(A) 又称三角分解,目的是分解成一个下三角阵L和一个上三角阵U的乘积,即ALU,a=1 2 3;2 4 1;4 6 7; l,u=lu(a) l = 0.2500 0.5000 1.0000 0.5000 1.0000 0 1.0000 0 0 u = 4.0000 6.0000 7.0000 0 1.0000 -2.5000 0 0 2.5000,注意:L实际上是一个“心理上”的下三角矩阵,它事实上是一个置换矩阵P的逆矩阵与一个真正下三角矩阵L1(其对角线元素为1)的乘积。,2020年8月17日3时51分,97,Chol分解:如果A为n阶对称正定矩阵,则存

63、在一个非奇异下三角实矩阵L,使得ALLT,当限定L的对角元素为正时,这种分解是唯一的。,a=4 -1 1;-1 4.25 2.75;1 2.75 3.5; chol(a) ans = 2.0000 -0.5000 0.5000 0 2.0000 1.5000 0 0 1.0000,2020年8月17日3时51分,98,正交分解:AQR 将矩阵A做正交化分解,使得Q*R=A,其中Q为正交矩阵(其范数为1,指令norm(Q)=1),R为对角化的上三角矩阵。,a=1 1 1;2 -1 -1;2 -4 5; q,r=qr(a) q = -0.3333 -0.6667 -0.6667 -0.6667 -0.3333 0.6667 -0.6667 0.6667 -0.3333 r = -3 3 -3 0 -3 3 0 0 -3,2020年8月17日3时51分,99,数据的统计分析,一般来讲,矩阵的每一列代表统计过程不同的数据结果,而每一行则相应代表不同的样品。 统计函数介绍 统计函数中的大部分函数都是针对列进行操作的。下表中列出部分常用的统计函数。,回到主目录,2020年8月17日3时51分,100,20

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!