MatLab编程中文版第二章

更新时间:2024-05-08 18:23:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

目录

第二章MATLAB基础 .................................................................................................................... 1

2.1 变量和数组 ........................................................................................................................ 1 2.2 MATLAB变量的初始化 ................................................................................................... 3

2.2.1 用赋值语句初始化变量 ......................................................................................... 3 2.2.2 用捷径表达式(short expressions)来赋值 ......................................................... 4 2.2.3 用内置函数来初始化 ............................................................................................. 5 2.2.4用关键字input初始化变量 .................................................................................... 6 测试2.1 ............................................................................................................................. 6 2.3 多维数组 ............................................................................................................................ 6

2.3.1 多维数组在内存中的存储 ..................................................................................... 7 2.3.1 用单个下标访问多标数组 ..................................................................................... 8 2.4 子数组 ................................................................................................................................ 8

2.4.1 end函数 ................................................................................................................... 9 2.4.2 子数组在左边的赋值语句的使用 ......................................................................... 9 2.4.3 用一标量来给子数组赋值 ................................................................................... 10 2.5 特殊变量 .......................................................................................................................... 11

测试2.2 ........................................................................................................................... 11 2.6 显示输出数据 .................................................................................................................. 12

2.6.1 改变默认格式 ....................................................................................................... 12 2.6.2 disp函数 ................................................................................................................ 13 2.6.3 用fprintf函数格式化输出数据 ........................................................................... 13 2.7 数据文件 .......................................................................................................................... 13

测试2.3 ........................................................................................................................... 14 2.8 标量运算和数组运算 ...................................................................................................... 15

2.8.1 标量运算符 ........................................................................................................... 15 2.8.2 数组运算和矩阵运算 ........................................................................................... 15 例2.1 ............................................................................................................................... 16 2.9 运算的优先级 .................................................................................................................. 17

例2.2 ............................................................................................................................... 18 测试2.4 ........................................................................................................................... 18 2.10 MATLAB的内建函数 ................................................................................................... 19

2.10.1 选择性结果 ......................................................................................................... 19 2.10.2 带数组输入的MATLAB函数的应用............................................................... 19 2.10.3 常见的MATLAB函数 ...................................................................................... 19 2.11 画图入门 ........................................................................................................................ 19

2.11.1 简单的xy画图的应用 ....................................................................................... 20 2.11.2 打印图象 ............................................................................................................. 21 2.11.3 联合作图 ............................................................................................................. 22 2.11.4 线的颜色,线的形式,符号形式和图例 ............................................................... 22 2.11.5 对数尺度 ............................................................................................................. 24 2.12 例子 ................................................................................................................................ 25

I

例2.3 ............................................................................................................................... 25 例2.4 ............................................................................................................................... 26 例2.5 ............................................................................................................................... 28 2.13 调试MATLAB程序 ..................................................................................................... 29 2.14 总结 ................................................................................................................................ 30

2.14.1 好的编程习惯 ..................................................................................................... 31 2.14.2 MATLAB总结 .................................................................................................... 31 2.15 练习 ................................................................................................................................ 33

2.1 .................................................................................................................................... 33 2.2 .................................................................................................................................... 33 2.3 .................................................................................................................................... 33 2.4 .................................................................................................................................... 33 2.5 .................................................................................................................................... 34 2.6 .................................................................................................................................... 34 2.7 .................................................................................................................................... 34 2.8 .................................................................................................................................... 34 2.9 .................................................................................................................................... 34 2.10 .................................................................................................................................. 34 2.11 .................................................................................................................................. 35 2.12 .................................................................................................................................. 35 2.13 .................................................................................................................................. 35 2.14 .................................................................................................................................. 35 2.15 .................................................................................................................................. 35 2.16 .................................................................................................................................. 36 2.17 .................................................................................................................................. 36 2.18 .................................................................................................................................. 36

II

第二章MATLAB基础

在本章我将向大家介绍MATLAB的基本元素。在本章的章末,你将会编写简单的函数化的工具。

2.1 变量和数组

MATLAB程序的基本数据单元是数组。一个数组是以行和列组织起来的数据集合,并且拥有一个数组名。数组中的单个数据是可以被访问的,访问的方法是数组名后带一个括号,括号内是这个数据所对应行标和列标。标量在MATLAB中也被当作数组来处理——它被看作只有一行一列的数组。

数组可以定义为向量或矩阵。向量一般来描述一维数组,而矩阵往往来描述二维或多维数组。在本书中,当我们讨论一维数组时用向量表示,当我们讨论二维或多维向量时用矩阵。如果在特殊情况下,同时遇到这两种数组,我们就把他们通称为“数组”。

数组的大小(size)由数组的行数和列数共同决定,注意行数在前。一个数组所包含的数据多少可由行数乘列数得到。例如,下列数组的大小为

row1

row2 row3 row4

col1 col2 col3 col4 col5 图2.1一个数组是以行和列组织起来的数据集合,此数组arr含有20个元素,共4行,5列。阴影元素是arr(3,2)

数组 ?1?A?3???5B??1

大小 这是一个3×2矩阵,包含6个元素 34?2??4?6??2 这是一个一维行向量,共有4个元素 ?1???2C????3????4? 这是一个一维行向量,共有4个元素 数组中的单个数据是可以被访问的,访问的方法是数组名后带一个括号,括号内是这个

1

数据所对应的行标和列标。如果这个数组是一个行向量或列向量,则只需要一个下标。例如上面的数组A(2 1)为3,C(2)为2。一个MATLAB变量是一段包含一个数组的内存区,并且拥有一个用户指定的变量名。通过适当的命令和它的变量名随时可以就调用它和修改它。

MATLAB的变量名必须以字母开头,后面可以跟字母,数字和下划线(_).只有前31个字符是有效的;如果超过了31个字符,基余的字符将被忽略。如果声明两个变量,两变量名只有第32个字符不同,那么MATLAB将它们当作同一变量对待。

常见编程错误

确保你所声明的变量名前31个字符是独一无二的。否则,MATLAB将无法辨认出它们的不同。

当你编写程序时,给变量起一个有意义的名字非常的重要。有意义的名字极大的提高了程序的可读性和可维护性。像day,month和year这样的名字意义非常明确,即使第一次看到也能理解。尽管空格不能用在MATLAB变量名中,但是可以用下划线代替空格创造出有意义的变量名。比如,changerate可以写成change_rate.

好的编程习惯

给你的变量起一个描述性的且易于记忆的变量名。例如,货币汇率可以exchange_rate为变量名。这种方法将使得你的程序更加明确且易于理解。

在你所写的程序的开头列出一数据字典(data dictionary)十分的重要.数据字典列举了你在本程序中用到的所有变量的定义。它的定义应包括本条目的所要描述的内容和它在执行时所在的单元。当编写程序时,编定数据字典看似没有必要。但是设想一下,在过了一段时间后,你或其他人要对此程序修改,这时数据字典就显得十分的有用。

好的编程习惯

给每个程序创建一个数据字典以增强程序的可维护性。

在MATLAB语言中是区分字母大小的,也就是说,大写字母和小写字母代表的东西是不同的。所以变量NAME,Name,name在MATLAB中是不同的。所以已用过的小写变量名与一个新建大写的变量名重名,这时使用时要特别地小心。在一般情况下,我们一律用小写字母来表示。

好的编程习惯

在每次用到一个变量时,我们要确保变量名的大小写的精确匹配。在变量名中只使用小写字母是一个好的编程习惯。

两个最常见的变量类型是char型和double型。double型的变量包括由64位双精度浮点数构成的标量或数组。这种变量可以代表实数,虚数和复数。每个值的实部和虚部的变化范

-

围为正负10308~10308,拥有15到16位有效数字。这是基本的数字数据类型。

无论什么时侯,你将一个数值赋值于一个变量名,那么MATLAB将自动建立一个double型变量。例如,下面语句创建了一个以var为变量名的double型变量,包含了一个double型的单个元素,存储了复数值(1+i)? var=1+i; char型的变量包括由16位数值构成的标量或数组,每一个16位数代表一个字符。这个类型的经常用于字符串操作,当一个字符或字符串赋值于一个变量名时,系统会自动建立一个char型变量。例如,下面的这个语句创建了一个char型变量comment,并存储了一个字符串在其内。当这个语执行后,系统将会建立一个1×26的字符串数组。

2

comment='this is a character string'; 像C语言这样的语言中,变量类型和变量在使用之前必须强制声明。这种语言我们叫它强类型语言。相对地,像MATLAB这样的叫做弱类型语言。通过简单的赋值形式就可以创建变量,变量类型取决于创建时的类型。

2.2 MATLAB变量的初始化

当变量初始化时,MATLAB将会自动建立变量。有三种方式初始化MATLAB中的变量: 1.用赋值语句初始化变量

2.用input函数从键盘输入初始化变量 3.从文件读取一个数据

前两种方法我们在这里讨论,第三方法我们将在2.7节介绍。

2.2.1 用赋值语句初始化变量

最简单的创建和初始化一个变量的方法是用赋值语句赋予变量一个或多个值。赋值语句的一般形式如下

var = expression

var是变量名,expression可以是一个标量、一个数组或常量、其他变量和数学运算符号(+、-)的联合。这个表达式(expression)的值是通过一般的数学运算法则计算出来的,然后将产生的结果存储到变量var中。下面是一些用赋值语句初始化的变量: var=40*i; var2=var/5; array=[1 2 3 4]; x=1; y=2; 第一个例子创建了一个double类型的标量变量,存储了一个虚数40i。第二个例子创建了一个表达式var2,把var/5的值存储于内。第三个例子创建了一个数组array,并存储了一个4元素的行向量于内。最后一个例子显示了多个赋值语句可写在同一行,中间用逗号或分号隔开。注意如果在赋值语句执行时变量已经存在,那么这个变量原有的值将被覆盖。

正如第三个例子显示的,数据数组也可以初始化变量。我们可以用是括号()和分号建立数组。所有元素按行阶排序,换句话说,每一行的值从左向右,顶部的行置于最前,底部的行置于最后。在一行内单个数值可用空格或逗号隔开,而行与行之间要与则用分号隔开,或另起一行书写。下面的表达式都是合法的,能用于建立一个变量: 这个表达式创建了1×1数组(一个标量),包含数值3.4.[3.4] 这时括号可以省略. [1.0 2.0 3.0] 这个表达式创建了1×3数组,一维行向量[1 2 3] [1.0;2.0;3.0] ?1???表达式创建了一个3×1数组,一维列向量2 ????3???123?这个表达式创建了一个2×3数组,矩阵?? ?456??123?[1,2,3 这个表达式创建了一个2×3数组,矩阵?? 4,5,6] ?456?是个空数组,没有行,没有列(注意他与元素全为零的数[] 组的区别) 注意一个数组每一行元素的个数必须完全相同,每一列元素的个数也必须完全相同.像[1 2 3?4 5]这样的表达式是非法的,因为第一行有3个元素,第二行有只有2个元素.

[1,2,3;4,5,6] 3

常见编程错误

每一行元素的个数必须完全相同,每一列元素的个数也必须完全相同.试图创建一个不同行(列)拥有不同数目元素的数组,在编译时将会出现错误.

用于初始化数组的表达式可以包括代数符号或事先已经定义好的数组.例如赋值语句 a=[0 1+7] b=[a(2) 7 a] 定义了数组a=[0 8]和数组b=[8 7 0 8]. 当我们创建一个数组时,不是每一个元素都必须定义.如果要定义一个特殊的数组,或只有一个或几个元素没有定义,那么之前的那些元素将会自动创建,并初始化为0.例如,如果数

?000?组c事先没有定义,语句c(2,3)=5将会创建一矩阵c??相似地,指定一个值赋予?。

?005?一个存在的数组,但超过了这个数组的大小。例如,假设存在一数组d=[1 2],下面这个语句 d(4)=4; 将会制造出数组d=[1 2 0 4]. 在每个赋值语句末的分号有特殊的目的:无论在何时一个表达式在赋值语句中被赋值,分号将会中止变量值的重复。如果句末没有分号,变量值将会自动显示在命令窗口(The Command Windows)中。 >> e=[1 2 3;4 5 6] e = 1 2 3 4 5 6 如果在赋值语句末有分号,这种重复将会消失。重复是一个用于检查你的工作极好的方法,但是它降低了运行速度。因此,我们在一般情况下总是禁止重复。尽管如此,重复计算的结果提供了一个强大的应急调试器。如果你不能确定一个特定的赋值语句结果是多少,这时你可以去掉这个语句后的分号,当这个语句编译时,结果会显示在命令窗口(The Command Windows)。

好的编程习惯

在MATLAB赋值语句后加上一个分号来禁止变量值在命令窗口(The Command Windows)的重复。这将大大提高编译的速度。

好的编程习惯

如果你在调试程序时需要检测一个语句的结果,可能把句后的分号去掉,这样结果将会出现在命令窗口(The Command Windows)。

2.2.2 用捷径表达式(short expressions)来赋值

创建一个小数组用一一列举出元素的方法是比较容易的,但是当我们创建包括成千上万个元素的数组怎么办?把每一个元素列举出来则不太现实。

MATLAB提供一种专门的捷径标记法,这种方法用克隆运算符(colon operator)适用于上述情况。克隆运算符指定一系列的数值,它指定了这个系列数的第一值,步增和最后一个值。它的一般顺序始下

first:incr:last

first代表数组的每一个值,incr代表步增量,last代表这个数组的最后一个值。如果步增量为1,那么步增量可省略,而变成了first:last格式。

例如,表达式1:2:10是创建一个1×5行向量[1 3 5 7 9]的简便方法。 >> x=1:2:10 x = 1 3 5 7 9

4

用克隆标记法初始化一个含有一百个元素的数组????,?,??,语句如下

?100100?,2?Angles=(.01:.01:1)*pi 捷径表达式可以联合转置运算符(’)来初始化行向量,或更加复杂的矩阵。转置运算符可以在需要的情况下完成行和列的转换。因为这个表达式 f=[1:4]'; ?1???2产生一个4元素行向量[1 2 3 4],然后将其转换成4元素的列向量f????相似地,表

?3????4?达式 g=1:4; h=[g' g'] ?1?2?将会创建一个矩阵h??3??41??2? 3??4?2.2.3 用内置函数来初始化

数组也可以用MATLAB内置函数创始化。例如,函数zeros可以初始化任何大小的全为零的数组。用许多形式的zeros函数。如果这个函数的参数只是一个标量,那么MATLAB将会创建一个方阵,行数和列数均为这个参数。如果这个函数有两个标量参数,那么第一个参数代表行数,第二个参数代表列数。因为size函数所返回的一个数组的行数和列数,所以它可以联合zeros函数来创建一个相同大小零矩阵。下面是一些用到zeros函数的例子。 a=zeros(2); b=zeros(2,3); c=[1 2;3 4]; d=zeros(size(c)) 这些语句产生下列的数组 ?00??000? a??b????

?00??000??12??00?c??d??? ?

3400????相似地,ones函数产生的数组包含的元素全为1,eye函数通常用来产生单位矩阵,只有对角线的元素为1.其他元素为0.表2.1列出一些用于初始化变量的函数.

表2.1 用于创始化变量的MATLAB函数 函数 作用 zeros(n) 创建一个n×n零矩阵 zeros(n,m) 创建一个n×m零矩阵 zeros(size(arr)) 创建一个与数组arr的零矩阵 ones(n) 创建一个n×n元素全为1矩阵 ones(n,m) 创建一个n×m元素全为1矩阵 eye(n) 创建一个n×n的单位矩阵 eye(n,m) 创建一个n×m的单位矩阵 length(arr) 返回一个向量的长度或二维数组中最长的那一维的长度 size(arr) 返回指定数组的行数和列数

5

2.2.4用关键字input初始化变量

关键字input用来提示使用者和直接从键盘输入初始化变量.当脚本文件(Script files)时,它可以用来提示使用者输入.input函数在命令窗口(The Command Windows)显示提示语句,并等待用户输入一个值.例如,下面的赋值语句: my_val=input('enter an input value:') 当这个语句被编译时,MATLAB打印出字符串enter an input value:,然后等待用户回复.如果要只输入一个数,那么只需要直接键入,如果要输入一个数组,则必须带上中括号([]).不管怎样,当按下回车键时.在窗口输入的任何值都会被储入变量my_val.如果只按下回车键,那么这个变量就存储了一个空矩阵.

如果input函数中有字符's'做为它的第二个参数,输入的数据就被当字符串.因此,语句 in1=input('enter data:'); enter data:1.23 把数值1.23存储到in1中.而语句 in2=input('enter data:','s') enter data:123 把字符串1.23存储到in2中. 测试2.1

本测试提供了一个快速的检查方式,看你是否掌握了2.1和2.2的基本内容。如果你对本测试有疑问,你可以重读2.1和2.2,问你的老师,或和同学们一起讨论。在附录B中可以找到本测试的答案。

1.数组,矩阵,向量有什么区别? 2.回答关于下列矩阵的有关问题

?1.1?C?0.6???1.3?3.21.10.63.4?0.65.50.6??3.1 ?0.0??(a)C的大小是多少?

(b)C(2,3)的值是多少?

(c)列出值为0.6的元素的下标

3.确定下列数组的大小,通过whos或工作空间窗口(The workspace browser)检查你的答案。注意在本练习中后面的数组可能要用到前面数组的定义。

(a) u=[10 20*i 10+20] (b) v=[-1;20;3]

(c) w=[1 0 -9;2 -2 0;1 2 3] (d) x=[u' v] (e) y(3,3)=-7

(f) z=[zeros(4,1) ones(4,1) zeros(1,4)'] (g) v(4)=x(2,1)

4.w(2,1)的值是多少? 5.x(2,1)的值是多少? 6.y(2,1)的值是多少?

7.当语句(g)执行后,v(3)的值是多少?

2.3 多维数组

6

正如我们所看到的,MATLAB的数组可能是一维或多维的。一维的数组可以形象地看作一系列的数垂直地罗列起来,用一个下标就可以调用数组中的元素(如图a)。这样的数组适用于一个变量的函数,例如在规定的时间间隔后一系列的测量温度。

row1 row1 row1 row1

a1(irow) (a)一维数组

row1 row1 row1 row1

col1 col2 col3 col4 col5 a2(irow,icol) (b)多维数组

许多数据的类型需要多变量的函数。例如,我要在5个不同的地方,每个地方测4次温度。在这种情况下,我们的20次测量结果在逻辑上分为五个不同的行,每行有4个测量结果(如图b).在这种情况下,我们就需要两个下标来调用这个数组特定的函数:第一个下标选择行,第二个下标选择列。这样的数组叫做二维数组。二维数组中元素的个数取决于这个数组的行数和列数。

出于问题的需要,MATLAB允许我们创建多维数组。这些数组的每一维对应一个下标,和每一个单个元素都可以通过它的每一个下标被调用。在这个数组中元素的总和取决于每一维中元素的个数。例如,下面两个语句创建了一个2×3×2数组c >> c(:,:,1)=[1,2,3;4,5,6]; >> c(:,:,2)=[7,8,9;10,11,12]; >> whos c Name Size Bytes Class c 2x3x2 96 double array Grand total is 12 elements using 96 bytes 这个数组(2×3×2)包括12种元素,它的内容显示方法和其他数组的显示方法大体相同 >> c c(:,:,1) = 1 2 3 4 5 6 c(:,:,2) = 7 8 9 10 11 12 2.3.1 多维数组在内存中的存储

一个有m行和n列的二维数组包括m×n个元素,这些元素在计算机的内存中将会占有m×n个连续的内存空间。这些数组的元素在内存中是如何排列的呢?MATLAB以列主导顺序分配数组中的元素。也就是说,内存先分配第一列的元素,然后第二列,第三列,??以此类推,直到所有列都被分配完。图2.3说明4×3数组a的内存分配情况。正如我们所看到的,元素a(1,2)是其实在内存分配的第五个位置。在下一节我们讨论用单一下标访问数

7

1 4 7 10 2 5 8 11 (a)

3 6 9 12 ... 1 4 7 10 2 5 8 11 3 6 9 12 ... a(1,1) a(2,1) a(3,1) a(4,1) a(1,2) a(2,2) a(3,2) a(4,2) a(1,3) a(2,3) a(3,3) a(4,3)

(b)

图2.3(a)数组a中的数据 (b)数据a在内在中的布局

组元素和第八章低级I/O接口,内存分配元素的顺序将变得十分重要。

这种分配方式也适用于多维数组。数组的第一个下标增长最快,第二个仅次之,依此类推,最后一个变化最慢。例如,在一个2×2×2数组中,它的元素在内存中的分配顺序是

(1,1,1),(2,1,1),(1,2,1),(2,2,1),(1,1,2),(2,1,2),(1,2,2),(2,2,2)。

2.3.1 用单个下标访问多标数组

MATLAB的特性之一就是它允许使用者或程序员把一个多维数看作一个一维数组,这个一维数组的长度等于多维数组的元素数。如果用一个下标访问一个多维数组,那么元素的排列顺序就是内存的分配顺序。

例如,假设我们要声明一个4×3的数组如下: >> a=[1 2 3 4 5 6 7 8 9 10 11 12] a = 1 2 3 4 5 6 7 8 9 10 11 12 那么a(5)的值为5和a(1,2)的值相同,这是因为元素a(1,2)排在内存第五个位置。 在一般情况下,我们不应使用MATLAB的这一特性。用单个下标访问多维数组可能会带很多的麻烦。

好的编程习惯

在访问多维数组时,总是使用合适的维数。

2.4 子数组

你可以选择和使用一个MATLAB函数的子集,好像他们是独立的数组一样。在数组名后面加括号,括号里面是所有要选择的元素的下标,这样就能选择这个函数的子集了。例如,

8

假设定义了一个数组arr1如下 arr1=[1.1 -2.2 3.3 -4.4 5.5] 那么arr1(3)为3.3,arr1([1 4])为数组[1.1 -4.4],arr1(1:2:5)为数组[1.1 3.3 5.5]. 对于一个二维数组,克隆运算符可以用于下标来选择子数组。例如,假设 arr2=[1 2 3; -2 -3 -4;3 4 5] 将建立一个数组 ?1?arr2=?2???32?343???4 ?5??3???4 ?5???1?在这种定义下,子数组arr2(1,:)为[1 2 3],子数组arr2(:,1:2:3)为?2???3

2.4.1 end函数

MATLAB中有一个特殊的函数叫做end函数,对于创建子数组的下标非常的有用.当用到

一个函数的下标时,end函数将会返回下标的最大值.

例如,假设数组arr3定义如下: arr3=[1 2 3 4 5 6 7 8]; 那么arr3(5:end)将会产生数组[5 6 7 8],arr3(end)将会产生值8. end函数返回的值一般为所要下标的最大值.如果end函数显示有不同的下标,那它将在一个表达式内返回不同的值.例如,假设一个3×4数组arr4的定义如下: arr4=[1 2 3 4;5 6 7 8;9 10 11 12] ?6那么表达式arr4(2:end,2:end)将会返回??10返回值为4.

7118??.注意第一个end返回值为3,第二个12?2.4.2 子数组在左边的赋值语句的使用

只要数组的形(行数和列数)和子数组的形相匹配,把子数组放于赋值语句的左边用来更新数组中的值。如果形不匹配,那么将会有错误产生。例如,下面有一个3×4数组定义如下: >> arr4=[1 2 3 4;5 6 7 8;9 10 11 12] arr4 = 1 2 3 4 5 6 7 8 9 10 11 12 因为在等号左边的表达式的形(2×2)与a相匹配,那么下面的这个赋值语句是合法的。 >> arr4(1:2,[1 4])=[20 21;22 23] arr4 = 20 2 3 21 22 6 7 23 9 10 11 12 注意数组元素(1,1),(1,4)(2,1)和(2,4)得到了更新。相对而言,两边的形不相匹配,则表达式是非法的,例如下面这个表达式。

9

>> arr5(1:2,[1 4])=[20 21] ??? Subscripted assignment dimension mismatch.

常见编程错误

对于涉及子数组的赋值语句,等号两边的形必须相匹配。否则将会产生错误。

在MATLAB中用子数组赋值和用值直接赋值有很大的不同。如果用子数组赋值,那么只有相应的值得到更新,而其他的值保持不变。另一方面,直接赋值,则数组的原有内容全部删除并被新的值替代。例如,假设用一个数组arr4定义如下: >> arr4=[1 2 3 4;5 6 7 8;9 10 11 12] arr4 = 1 2 3 4 5 6 7 8 9 10 11 12 下面的赋值语句,只更新特定的元素: >> arr4(1:2,[1 4])=[20 21;22 23] arr4 = 20 2 3 21 22 6 7 23 9 10 11 12 相对地,下面的赋值语句更新了数组的全部内容,并改变了数组的形 >> arr4=[20 21;22 23] arr4 = 20 21 22 23 好的编程习惯

确保将赋值于子数组和赋值于数组。MATLAB将它们当作两个不同的情况来对待。

2.4.3 用一标量来给子数组赋值

位于赋值语句的右边的标量值总是能匹配左边数组的形。这个标量值将会被复制到左边语句中所对应的元素。例如,假设用一个数组arr4定义如下: arr4=[1 2 3 4;5 6 7 8;9 10 11 12] 下面的表达式将一个值赋值于数组的4个元素。 >> arr4(1:2,1:2)=1 arr4 = 1 1 3 4 1 1 7 8 9 10 11 12 10

2.5 特殊变量

在MATLAB中有许多预先定义好的特殊变量。在MATLAB中这些特殊变量可以随时使用,不用初始化。一些常见的预定义值列在表2.2。 表2.2预定义特殊变量 pi 有15个有效值的π i,j 代表虚数i(?1) Inf 这个符号代表无穷大,它一般情况下是除以0产生的 NaN 这个符号代表没有这个数。它一般由数学运算得到的。例如,0除以0。 clock 这个特殊变量包含了当前的年,月,日,时,分,秒,是一个6元素行向量 date 当前的日期,使用的的字符形式,如30-Dec-2007 eps 变量名是epsilon的简写。它代表计算能机辨别的两数之间的最小数 ans 常用于存储表达式的结果,如果一个结果没有明确的赋值给某个变量 这个些预定义值存储在一般的变量中,所以他们能被覆盖或改写。如果一个新值赋值于其中一个预定义变量,,那么这以后的计算中新值将会替代默认值。例如,考虑下面用于计算以半径为10的圆的周长的语句; circl=2*pi*10 pi=3 circ2=2*pi*10 在第一个语句中,pi有默认值3.14159...,所以周长6.28319是正确的结果,第二个语句重定义pi为3,所以第三个语句circ2为60。在程序中修改预定义值会造成一些不正确的结果,并导致一些微小而难以发现的错误。设想一下,要在1000行的程序中找出一个像这样的错误是多么不容易。

常见编程错误

不要重定义有意义的预定义变量。否则将后患无穷,制造成出小而难以发现的错误。

测试2.2

本测试提供了一个快速的检查方式,看你是否掌握了2.3到2.5的基本内容。如果你对本测试有疑问,你可以重读2.3和2.5,问你的老师,或和同学们一起讨论。在附录B中可以找到本测试的答案。

1. c数组的定义如下,写出下面子数组的内容。 c =

1.1000 -3.2000 3.4000 0.6000 0.6000 1.1000 -0.6000 3.1000 1.3000 0.6000 5.5000 0

(a) c(2,:) (b) c(:,end) (c) c(1:2,2:end) (d) c(6) (e) c(4:end) (f) c(1:2,2:4) (g) c([1 4],2) (h) c([2 2],[3 3]) 2.当赋值语句执行后,下列数组的内容是多少? (a) a=[1 2 3; 4 5 6; 7 8 9]; a([3 1],:)=a([1 3],:); (b) a=[1 2 3; 4 5 6; 7 8 9]; a([1 3],:)=a([2 2],:); (c) a=[1 2 3; 4 5 6; 7 8 9]; a=a([2 2],:);

3.当数组执行后,下列数组a的内容是多少? (a) a=eye(3,3); b=[1 2 3]; a(2,:)=b;

11

(b) a=eye(3,3); b=[4 5 6 ]; a(:,3)=b'; (c) a=eye(3,3);

b=[7 8 9];

a(3,:)=b([3 1 2]); (d) a=eye(3,3);

b=[7 8 9];

a(3,:)=b([3 1 2]);

2.6 显示输出数据

在MATLAB中有许多的方法显示输出数据。最简单的方法是我们已经用过的去掉语句末的分号,它将显示在命令窗口(The Command Windows)中。在这里向大家介绍一些其他的方法。

2.6.1 改变默认格式

当数据重复在命令窗口(The Command Windows)时,整数以整形形式显示,其他值将以默认格式显示。MATLAB的默认格式是精确到小数点后四位。如果一个数太大或太小,那么将会以科学记数法的形式显示。比如,语句 x=100.11 y=1001.1 z=0.00010011 它的输入格式为 x = 100.1100 y = 1.0011e+003 z = 1.0011e-004 改变默认输出格式要用到format命令,可根据表2.3改变数据的输出格式 表2.3输出显示格式 format命令 结果 例子 format short 12.3457 保留小数点后4位(默认格式) format long 12.345678901234567 保留小数点后14位 format short e 1.2346e+00 带有5位有效数字科学记数法 format short g 总共有5个数字,可以用科学记数法,12.346 也可不用 format long e 1.234567890123457e+001 带有15位有效数字科学记数法 format long g 总共有5个数字,可以用科学记数法,12.3456789012346 也可不用 format bank 12.35 美元格式 format hex 4028b0fcd32f707a 用16进制表示 format rat 1000/81 两个小整数的比 format compact 隐藏多余的换行符 format loose 使用多余的换行符 format + + 只显示这个数的正负 所有例子都以12.345678901234567为例子默认的格式可以改变格式以显示更多的有效数字,用科学计数法来显示,精确到小数点后两位,显示或隐藏多余的换行符。

12

2.6.2 disp函数

另一种显示数据的方法是用disp函数。disp需要一个数组参数,它将值将显示在命令窗口(The Command Windows)中。如果这个数组是字符型(char),那么包含在这个数组中的字符串将会打印在命令窗口(The Command Windows)中。

此函数可联合num2str(将一个数转化为字符串)和int2str(将一个整数转化为字符串)来产生新的信息,显示在命令窗口(The Command Windows)中。例如,下面的语句将“the value of pi=3.1416”显示在命令窗口(The Command Windows)中。第一句创建了一个字符型数组,第二句用于显示这个数组。 str=['the value of pi=' num2str(pi)]; disp(str); 2.6.3 用fprintf函数格式化输出数据

用fprintf函数显示数据是一种十分简便方法。fprintf函数显示带有相关文本的一个或多个值,允许程序员控制显示数据的方式。它在命令窗口打印一个数据的一般格式如下:

fprint(format,data)

其中format用于代表一个描述打印数据方式的子符串,data代表要打印的一个或多个标量或数组。format包括两方面的内容,一方面是打印内容的文本的提示;另一方面是打印的格式。例如,函数 fprintf('The value of pi is %6.2f \\n',pi) 将会打印出'The value of pi is 3.14',后面带有一个换行符。转义序列%6.2代表在本函数中的第一个数据项将占有6个字符宽度,小数点后有2位小数。

fprintf函数有一个重大的局限性,只能显示复数的实部。当我们的计算结果是复数时,这个局限性将会产生错误。在这种情况下,最好用disp显示数据。

表2.4 fprintf函数format字符中的特殊字符 format string 结果 %d 把值作为整数来处理 %e 用科学记数法来显示数据 %f 用于格式化浮点数,并显示这个数 %g 用科学记数格式,或浮点数格式,根据那个短,并显示之 \\n 转到新的一行 例如,下列语句计算复数x的值,分别用fprintf和disp显示 x=2*(1-2*i)^3; str=['disp: x = ' num2str(x)]; disp(str); fprintf('fprintf: x = %8.4f\\n',x); 打印的结果如下 disp: x = -22+4i fprintf: x = -22.0000 注意frpintf忽略了虚部。

常见编程错误

fprintf函数只能复数的实部,所以在有复数参加或产生的计算中,可能产生错误的结果。

2.7 数据文件

有许多的方法用于加载和保存MATLAB的数据文件,这些方法将会在第八章中介绍。在这里我们只向大家介绍最简章的save和load命令。

13

save命令用于保存当前MATLAB工作区内的数据到一个硬盘文件。这个命令的基形式如下

save filename var1 var2 var3

filename代表你要保存变量的那个文件,var1,var2等是要保存的变量。在默认情况下,这个这个文件的扩展名为‘mat’,我们称之为MAT文件。如果在filename后面无变量,则工作区的所有内容将会被保存。

MATLAB用一种特殊的复杂形式来存储数据,包括了许许多多的细节,例如变量名和变量类型,数组的大小,以及所有变量值。一个在任何一个平台上创建的MAT文件(pc, mac, unix)在另一个平台上都可以应用。它的缺点是MAT文件的存储格式不能被其他程序读取。如果一个数据必须由其他程序所读取,那么必须转化为ASCII码,并将这些数值写到一个以ASCII码为编码的文件中。但是,当以ASCII的形式存储,像变量名和变量类型这样的信息就会丢失,产生的数据结果将会更大。

例如,假设数组x的定义如下 x=[1.23 3.14 6.28; -5.1 7.00 0]; 命令“save x.dat x -ascii”将会创建一个文件x.dat,包括数据如下 1.2300000e+000 3.1400000e+000 6.2800000e+000 -5.1000000e+000 7.0000000e+000 0.0000000e+000 用这种格式定的数据能被其他语言编写的程序或扩展页读取,所以它能帮助MATLAB程序和其他程序之间共享数据。

好的编程习惯

如果数据需要在matlab和其他程序之间交换使用,那么以ASCII格式存储数据。如果只在matlab中使用那么,应以mat文件的形式存储数据。

MATLAB并不关心ASCII码的扩展名是什么?但是,用户最好用它的传统扩展名“dat”。

好的编程习惯

以“dat”的扩展名保存ASCII数据文件,以区别于以“mat”为扩展名的mat文件。

Load命令与save命令相反。它从硬盘文件加载数据到MATLAB当前工作区。这个命令的基本格式为

load filename

filename代表所加载文件的文件名。如果这个文件是mat文件,那么所有被子加载的变量的变量名的变量类型将和原来一样。如果一个变量包含在工作区间窗口,那么这些数据将会被修复。

MATLAB能够加载由其他程序创建的ascii格式的数据文件。它首先检查所要加载的文件是mat文件还是ascii文件。如果在load语句中加入-ascii中,则强制MATLAB把这个文件看作ASCII文件。这个文件的内容将会被转化为一个MATLAB的数组,这个数组名就所要加载的文件名。例如,假设一个名为x.dat的ascii文件包括下列数据: 1.23 3.14 6.28 -5.1 7.00 0 那么“load x.dat”将会在当前工作区创建一个2×3数组x,包含数据值。

测试2.3

本测试提供了一个快速的检查方式,看你是否掌握了2.6和2.7的基本内容。如果你对本测试有疑问,你可以重读2.6和2.7,问你的老师,或和同学们一起讨论。在附录B中可以找到本测试的答案。

1.如何让MATLAB显示一个实数,带有十五个有效的数字,并有指数形式? 2.下列语句的作用是什么?它的输出是什么?

14

(a) radius = input('Enter circle radius:\\n');

area = pi * radius^2;

str = ['The area is ' num2str(area)]; disp(str);

(b) value = int2str(pi); disp(['The value is ' value '!']);

3.下列语句有作用是什么?它的输出是什么?

value = 123.4567e2;

fprintf('value = %e\\n',value); fprintf('value = %f\\n',value); fprintf('value = %g\\n',value); fprintf('value = .4f\\n',value);

2.8 标量运算和数组运算

在MATLAB赋值语句中的计算,它的一般形式如下 variable_name = expression;

赋值语句计算出等号右边表达式的值,然后赋值于等号左边的变量名。注意这个等号并不是传统意义上的等号,它的意义是:存储表达式的值到左边的变量,由于这个原因,等号在这里应叫做赋值号。像

ii = ii + 1;

这样的语句在数学上是毫无意义的,但在MATLAB语言中,它有其固有的意义。 它的意义是:把变量ii加上1之后,再把值存储到变量ii中。

2.8.1 标量运算符

位于赋值号右边的表达式,可以包含标量,数组,括号和数学符号的任一个有效联合运算。两标量间的标准运算符号如表2.5所示。

当我们需要的时侯,我们可以运用括号来控制运算顺序。括号内的表达式优先于括号外的表达式来计算。例如表达式2^((8+2)/5)的计算顺序如下 2 ^ ( ( 8 + 2 ) / 5 ) = 2 ^ ( 10 / 5 ) = 2 ^ 2 = 4 2.8.2 数组运算和矩阵运算

MATLAB在数组运算中提供了两种不同类型的运算,一种是数组运算(array operations),一种是矩阵运算(matrix).数组运算是一种用于元素对元素的运算.也就是说,这个运算是针对

?13???13??06?两数组相对应的运算使用的.例如,a??,那么b?a?b??????.注意两数

?24???21??05?组的行与列必须相同.否则,MATLAB将产生错误.

数组运算可以用于数组与标量的运算.当一个数组和一个标量进行运算时,标量将会和数组中的每一元素进行运算.例如

?12??56?,则a??a?4???? 3478????相对地,矩阵运算则遵守线性代数的一般规则,像矩阵的乘法.在线性代数中,c=a×b的定义如下:

表2.5 两标量间的数学运算符

运算符 代数形式 MATLAB形式 A+B A+B 加号

15

运算符 减号 乘号 除号 指数

n代数形式 A-B A×B ABMATLAB形式 A-B A*B A/B A^B BA c(i,j)??a(i,k)b(k,j)

k?1?12???13???7?6?例如a??,,那么a?b?a????。注意,在矩阵相乘中,a阵???34???1010???21?的列数必须等于b阵的行数。

MATLAB用一个特殊的符号来区分矩阵运算和数组运算。在需要区分两者不同的时侯,把点置于符号前来指示这是一个数组运算(例如,.*)。表2。6给出的是一些常见的数组和矩阵运算。

表2.6常见的数组和矩阵运算

运算 MATLAB形式 注释 A+B 数组加法 数组加法和矩阵加法相同 数组减法 A-B 数组减法和矩阵减法相同 A和B的元素逐个对应相乘.两数组之间必须有相同A.*B 数组乘法 的形,或其中一个是标量. A*B 矩阵乘法 A和B的矩阵乘法.A的列数必须和B的行数相同. A和B的元素逐个对应相除: A./B 数组右除法 A(i,j)/B(i,j)两数组之间必须有相同的形,或其中一个是标量. A和B的元素逐个对应相除: A.\\B 数组左除法 B(i,j)/A(i,j)两数组之间必须有相同的形,或其中一个是标量. A/B 矩阵右除法 矩阵除法,等价于A*inv(B), inv(B)是B的逆阵 A\\B 矩阵左除法 矩阵除法,等价于inv(B)*A, inv(A)是A的逆阵 AB中的元素逐个进行如下运算A(i,j)^B(i,j), A.^B 数组指数运算 A(i,j)/B(i,j)两数组之间必须有相同的形,或其中一个是标量. 初学者往往混淆数组运算和矩阵运算.在一些情况下,两者相互替换会导致非法操作, MATLAB将会报告产生了错误。在另一些情况下,两种运算都是合法的,那么这时MATLAB进行错误的运算,并产生错误的结果。当我们进行方阵运算时,极易产生这样的错误。两个方阵具有相同的大小,两者之间的数组运算和矩阵运算都是合法的,但产生的结果完全不同。在这种情况下,你要万分的小心。

常见编程错误

在你的MATLAB代码中,仔细区分数组运算和矩阵运算。数组乘法和矩阵乘法极易混淆。

例2.1

假设a,b,c和d的定义如下

16

?10???12? a??b???? c?1??21??0分别指出下列表达式的运算结果 (a) a + b (b) a .* c (c) a * b (e) a + c (f) a + d (g) a .* d 答案:

?3??? d?5 ?2?(d) a * c (h) a * d

?02?这是一个数组或矩阵加法:a?b???。

?22???10?(b) 这是一个数组乘法:a.*b???。

01????12?(c) 这是一个矩阵乘法:a*b???。

??25??3?(d) 这是一个矩阵乘法:a*c???。

?8?(e) 操作非法,两数组形不同

?65?(f) 数组与标量的加法:a?d???。

?76??50?(g) 数组乘法:a.*d???。

105???50?(h) 矩阵乘法:a*d???。

?105?矩阵的左除运算有着十分重要意义,我们必须理解它。一个3×3的线性方程组的形式如下

(a)

a11x1?a12x2?a13x3?b1a21x1?a22x2?a23x3?b2 a31x1?a32x2?a33x3?b3 (2.1)

可以写成如下形式

Ax?B

?a11?A?a21???a31a12a22a32 (2.2)

a13??b1??x1??????a23,A?b2和x?x2 ???????a33???b3???x3???12.2式的结果可以用线性代数的知识来解决。结果是

(2.3) x?AB

因为左除运算A\\B等价于inv(A)*B,所以左除运算是解线性方程的好方法。

2.9 运算的优先级

许多的数学运算写入一个表达式是非常平常的事。例如,考虑初速度为0的匀加速运动的位移表达式

distance = 0.5 * accel * time ^ 2

这个表达式有二个乘法运算和一个幂运算。在这样的表达式中,知道运算的先后顺序是十分重要的。如果幂运算先于乘法运算执行,这个表达式等价于

distance = 0.5 * accel * (time ^ 2)

17

如果乘法运算先于幂运算执行,这个表达式等价于 distance = (0.5 * accel * time) ^ 2

这两个式子将产生不同的结果,所以我们必须清楚它们中那个是正确的。

为了使表达的值精确,MATLAB建立了一系列的规则控制运算的层次或顺序。这些规则一般情况下遵循代数的运算法则。数学运算的顺序如表2.7。

表2.7运算的优先级 优先级 运算 1 括号里的内容先运算,从最里面的括号去运算 2 幂运算,从左向右 3 乘除法,从左向右 4 加减法,从左向右 例2.2

变量a,b,c,d初始化如下 a = 3; b = 2; c = 5; d = 3;

计算如下的MATLAB的赋值语句 (a) output = a*b+c*d; (b) output = a*(b+c)*d; (c) output = (a*b)+(c*d); (d) output = a^b^d; (e) output = a^(b^d);

正如我们看到的,运算的顺序对一个代数表达式的最终值产生重大的影响。 将程序中的每个表达式尽量写清楚,这是十分重要的。编写的程序不仅要能够计算出所要求的值的来,在需要的时侯,还要考虑它的可维护性。你应当经常问自己“六个月后我能看得懂我现在编得程序吗?其他的程序员看到我的代码,他能迅速的理解吗?”。如果在你的心中有所疑虑,那就用更多的括号使之更加清晰。

好的编程习惯

在需要的时侯用括号使用表达式更加清晰和易于理解。

如果在一个表达式中用到括号,那么括号必须平衡。也就是说,左括号数与右括号数相等。如果两者数目不相同,那么将会导致错误的产生。这种错误经常在输入过程中发生,当MATLAB编译器在执行这个命令时被发现。例如

(2+4) /2)

在执行时将会出现一个错误。

测试2.4

本测试提供了一个快速的检查方式,看你是否掌握了2.8和2.9的基本内容。如果你对本测试有疑问,你可以重读2.8和2.9,问你的老师,或和同学们一起讨论。在附录B中可以找到本测试的答案。

1.假设abcd的定义如下,计算下面合法运算的结果,如果不合法,指出原因

1??2?0?1??1? a??b?c?d??3 ?????

?12312??????(a) result = a .* c; (b) result = a * [c c]; (b) result = a .* [c c]; (d) result = a + b * c; (e) result = a + b .* c; 2.求矩阵x,已知Ax=B,

18

legend('f(x)','d/dx f(x)') grid on; 2.11.5 对数尺度

图2.7在同一坐标系内,显示了f(x)=sin2x和它的微分函数的图象

打印数据既可以用对数尺度,也可以用线性尺度。在x,y轴上使用这两种尺度的一种或两种可以组合形成4种不同的坐标系。每一种组合者有一个特定的函数。

1.plot函数的x,y均用线性尺度

2.semilog函数x轴用对数尺度,y轴将用线性尺度 3.semiloge函数x轴用线性尺度,y轴用对数尺度 4.loglog函数两坐标轴将会都用对数尺度。

这四个函数在意义上是等价的,只是坐标轴的类型不同。每一个图象的例子如图2.8所示。

24

图2.8四种不同画图函数的对比。

表2.10 在legend命令中pos的值 值 意义 0 自动寻找最佳位置,至少不与数据冲突 1 在图象的右上角 2 在图象的左上角 3 在图象的左下角 4 在图象的右下角 -1 在图象的右边

2.12 例子

下面的例子将向大家介绍如何用MATLAB解决问题。

例2.3

(温度转换)设计一个MATLAB程序,读取一个华氏温度的输入,输出开尔文温度。 答案

华氏温度和开尔文温度的转换关系式可在物理学课本中找到。其关系式为:

?5?T(开尔文)??T(摄氏度)?32.0??273.15

?9? (2.5)

在物理学参考书中举了一些例子,我们可以用来检验我们程序是否正确。例如 华氏度(oC) 开尔文(K) 212 373.15 沸水的温度 -110 194.26 冰水混合物的温度 我们设计程序的步骤如下 1.提示用户键入华氏温度值 2.读取输入值

3.通过关系式转换为开氏温度 4.输出结果,结束

我们将会用input函数输入华氏温度,用fprintf函数输出结果。 % Script file:temp_conversion.m

25

% % Purpose: % To convert an input temperature from degrees Fahrenheit to % an output temperature in kelvins. % % Record of revisions: % Date Programmer Description of change % ==== ========= ================ % 12/01/97 S.J.Chapman Original code % Tfine variables: % temp_f --Temperature in degrees Fahrenheit % temp_k --Temperature in kelvins %Prompt the user for the input temperature. temp_f=input('Enter the temperature in degrees Fahrenheit:'); %Converttokelvins. temp_k=(5/9)*(temp_f-32)+273.15; %Writeouttheresult. fprintf('%6.2f degrees Fahrenheit = %6.2f kelvins.\\n',... temp_f,temp_k); 我们输入上面的例子中的华氏温度值,以检测程序的正确性。注意用户的输入值已用黑体字标出。 >> temp_conversion Enter the temperature in degrees Fahrenheit:212 212.00 degrees Fahrenheit = 373.15 kelvins. >> temp_conversion Enter the temperature in degrees Fahrenheit:-110 -110.00 degrees Fahrenheit = 194.26 kelvins. 这个结果和物理教科书的结果相同。在本程序中,我们重复出带单位的输入值和输出值.只有带上单们神经质输出才有意义.

按照惯例,任何输入变量和输出变量的单位都应打印出来.

好的编程习惯

当你读取和写入数据时,使用适当的单位

例2.4

电子工程:负载的最大输出功率

一个内阻Rs=50Ω,电动势V=120V的电源驱动一个负载RL。当RL为多少时,RL的功率最大?在这种情况下,功率为多少?画以RL为自变量的RL功率图。

答案:

在本程序中,我们需要改变RL的值,然后计算出每一个RL的功率。RL功率的表达式 为

(2.6)

I代表流经负载的电流。电流可由欧姆定律计算得到。

I?VR总?VRs?RLPL?IRL

2 (2.7)

这个问题解决的步骤如下

1. 创建一个数组。这个数组是以1为起始项,以1步长的等差数组,共100项,这是RL的取值。

2. 计算RL的电流, 3. 计算每个RL的功率。

26

4. 画出RL的功率图,以确定RL为多少时其功率最大。 整个程序的代码如下:

图2.10 供给负载电阻的功率图象 % Script file:calc_power.m % % Purpose: % To calculate and plot the power supplied to a load as % a function of the load resistance. % % Record of revisions: % Date Programmer Descriptionofchange % ==== ========== ===================== % 12/01/98 S.J.Chapman Original code % Tfine variables: % amps --Current flow to load(amps) % pl --Power supplied to load(watts) % rl --Resistance of the load(ohms) % rs --Internal resistance of the power source(ohms) % volts --Voltage of the power source(volts) %Set the values of source voltage and internal resistance volts=120; rs=50; %Create an array of load resistances rl=1:1:100; êlculate the current flow for each resistance amps=volts./(rs+rl); êlculate the power supplied to the load pl=(amps.^2).*rl; %Plot the power versus load resistance plot(rl,pl);

27

title('Plot of power versus load resistance'); xlabel('Load resistance(ohms)'); ylabel('Power(watts)'); grid on; 当这个程序运行时,产生的图象如图2.10。从这个图我们可知当负载电阻为50Ω时,功率最大。最大功率为72W。

注意在本例中,用的是数组运算符.*,.^和./.这些运算符将会使数组amps和pl按元素一一对应计算.

例2.5

用C-14确定年代

一个元素的放射性同位素是不稳定元素的一种特殊形态.在一段时间内,它会自然的衰变为另一种元素.衰变一种呈指数下降的过程.如果Q0是放射性物质在t=0时的初始量,那么它的质量与变量t的关系式为

Q(t)?Q0e??t (2.8)

其中λ代表衰变率.

因为放射性元素的衰变是以一定的速率发生的,我们可以把它当作一个时钟来测定的衰变开始的时间。如果我们知道衰变开始时物质的质量和现在放射性元素剩余的质量,我们可以根据公式(2.8)换算出衰变时间t,即

tdecay?-1?logQeQ0 (2.9)

公式2.9在科学的许多领域有着广泛的应用.例如,考古学家可以根据C14的衰变周期,来确定古生物距今生活的年代.现在活着的生物C14的含量是不变的,所以可以根据古生物C14的现存量来确定古生物的生存年代.已知C14的衰变率λ为0.00012097/年,所以如果C14的剩余量可以通过测量得到,那么我们就可以根据公式2.9算出这个生物活在多少年之前.图2.1向大家展示了以时间为自变量的C14的剩余量函数.

编定一个程序,读取样品中C14剩余量的百分比,计算样品距今的年代,并打印出结果. 这个问题解决的步骤如下

1. 提示用户输入样品中C14的剩余量 2. 读取百分比

3. 将百分比转化成分数

QQ0.

4. 利用公式(2.9)计算出距今的年数 5. 输出结果,结束. 代码如下 % Script file:c14_date.m % % Purpose: % To calculate the age of an organic sample from the percentage % of the original carbon 14 remaining in the sample. % % Record of revisions: % Date Programmer Description of change % ==== ========== ===================== % 12/02/97 S.J.Chapman Original code % Tfine variables: % age --The age of the sample in years % lamda --the radioactive decay constant for carbon-14,in units of 1/years.

28

本文来源:https://www.bwwdw.com/article/49bg.html

Top