计算工具,如何编程计算器

计算器 1
计算工具 第1章 引言 工程专业是专门用来解决实际问题的一类专业。
它利用数学和科学的原理,解决实际工程问题,这些问题涉及建筑结构、机械、电子线路和其他各种物理系统和器件。
计算机之所以成为工程师们的实用工具,是因为它具有数值分析和数据处理的能力。
工程专业的毕业生,不管他们来自哪个学科,都必须精通众多的计算工具和计算软件。
未来的工程专业毕业生必须能够熟练使用以下工具或软件: ●通信工具(e-mail和短消息)●搜索工具●字处理工具(用来撰写报告和备忘录)●演示工具(用于音频和视频演示)●数据获取工具(读取和应用来自实验的数据)●计算工具(编程、数据分析、方程求解和绘图)除了上述适用于所有工程专业的基本工具外,还有一些专门的计算机工具软件,它们是各自工程领域的重要组成部分。
这些工具有:●实体模型和计算机辅助设计软件(用于机械和民用工程师)●电子线路仿真软件(适用于电子和计算机工程师)●有限元分析软件(适用于机械、民用和电子工程师)●高级程序设计语言(适用于计算机和软件工程师)●统计分析软件(适用于工业工程师)本教材专门用来介绍如何把计算工具应用于实际工程问题中。
在各工程领域里人们已经开发了各种类型的数学分析和数据处理的计算工具。
虽然没有一个可称得上是“标准” 第Ⅰ部分计算工具 的工具可以供所有的工程师们使用,然而本书要介绍的两个软件包——MATLAB和Excel却是人们熟知并且广泛使用的两个软件。
我们之所以介绍这两个软件包,不仅因为它们是最受工程师们欢迎的计算机工具,还是因为它们正好代表两种不同的计算工具,即编程工具和电子表格工具。
虽然这两个工具提供了截然不同的解决工程问题的方法,但是它们之间仍然存在一些相似性,特别是在数据的表示、存储和处理的方法方面。
掌握这些相似性是很有必要的,因为它们提供了一种这些工具和其他计算工具都通用的程序设计语言。
在本章,读者要学习以下内容:●掌握解析解与算法解之间的差别。
●掌握算法设计(algorithmdevelopment)和算法的伪代码表示。
●掌握编程工具与电子表格工具的主要区别。
●掌握数据存储和处理的基本术语。
●掌握精确度与精度之间的差别。
1.1解析解和算法解 本书中所指的计算工具允许我们自动对工程问题进行数学分析。
为了更好地理解在工程问题中使用计算工具存在的优点和局限性,我们必须理解解析解和算法解两者之间的本质区别。
我们考虑一个经典的抛物运动例子。
该问题在普通物理课中已经讨论过。
假设从一个玩具炮架在角度为35º方向发射一个初速度为10m/s的小球,如图1-1所示。
工程师们经常需要回答以下这些问题:炮弹可达到的最高高度、落地的位置和总的飞行时间。
图1-1 1.1.1数学模型 解决该问题的第一步是建立一个数学模型,工程师利用这个模型预测炮弹的飞行规律。
本例中要用到运动学的基本定律。
为此,工程师们画出该系统的一个草图,如图1-2所示。

4 第1章计算工具 max 35° 图1-
2 要建立能够描述炮弹运动规律的数学方程,我们必须做出决策——此模型要包括哪些内容。
为此,我们必须在模型的准确性(是指方程预测系统行为的能力)与模型的简洁性方面做出平衡。
在本例中,我们做出以下假定: ●地面是水平的。
●发射点在水平地面上。
●不需要考虑风的阻力。
要做出这样的假定,或者简化假设,需要有相当强的工程判断力。
工程师们要确定,在方程中考虑上述这些因素所带来的复杂性不会明显影响方程的准确度。
在本例中,基于这些假设,就可以利用物理学中的基本原理,写出如下所示的两个方程,它们描述了炮弹飞行的高度和水平距离与时间的关系: h(t)=vtsinθ−1gt2 (1.1)
2 x(t)=vtcosθ (1.2) 这里,h代表炮弹的高度,x是炮弹飞行的水平距离,v是它的初速度,θ是发射的角 度。
g是重力加速度。
t是发射后的时间(单位为s)。
有了这个模型,工程师们现在要选择 一个可以求解此方程的方法。
我们现在就要对比该问题的解析解与算法解。
1.1.2解析解 解析解是精确解,它是基于对代数、微积分等数学原理的应用。
在前面刚建立的模型 里,可以求出它的解析解。
为了求得炮弹飞行的最高高度,我们对方程(1.1)求导数: dh(t)
=vsinθ−gt (1.3) dt 当这个导数为零时,炮弹飞行的高度达到极限(最大值或最小值)。
把这个导数设置为
0, 并求t的值,有: t=vsinθ (1.4) g 假如炮弹的初速度、角度和重力加速度等都已知,则可以把它们的值代入上式,经代 数运算后,得到:
5 第Ⅰ部分计算工具 ⎛⎜ 10.0 m ⎞⎟ sin(35.0 o ) t=⎝s⎠ (1.5) ⎛⎜⎝9.81sm2⎞⎟⎠ 其结果是0.585s。
这表示,炮弹经过0.585s后到达最高点。
把这个值代入方程(1.1), 得到: h(t=0.585s)=⎛⎜⎝10.0ms⎞⎟⎠(0.585s)sin(35.0o)−12⎛⎜⎝9.81sm2⎞⎟⎠(0.585s)2(1.6) 计算得到最高高度hmax=1.68m。
为了确定整个飞行时间和水平距离,我们利用方程(1.1),求得炮弹的高度为零时的时间: ⎛⎜⎝10.0ms⎞⎟⎠tsin(35.0°)−12⎛⎜⎝9.81sm2⎞⎟⎠t2=0(1.7)利用代数运算,提出因子t,得到两个解: t=0和: ⎛⎜ 10.0 m ⎞⎟ sin(35.0 o ) t=⎝s⎠ =1.17s (1.8) ⎛⎜⎝4.91sm2⎞⎟⎠ 工程师们知道,对应于发射时刻t=0,t=1.17s是炮弹落地的时刻。
把这个值代入方程 (1.2),就可以求得炮弹在1.17s里飞行的距离。
x(t = 1.17s) = ⎛⎜10.0 m ⎞⎟ (1.17s) cos(35.0o ) (1.9) ⎝s⎠ 得到的水平距离为9.58m。
我们用标准的单位把上述结果表示为表1-
1。
飞行的最大高度水平距离总飞行时间 表1-1解析解的结果1.68m9.58m1.17s 1.1.3算法解 算法解是一个近似解。
它是利用计算机程序来求解问题的。
在求解算法解的过程中,工程师必须定义一系列步骤或规则,按照这些步骤或规则,得到问题的算法解。
通常,算法解要利用算法原理求解工程问题,因此,虽然求得的解是近似解,但是它的好处是不需
6 第1章计算工具 要把复杂的数学方法应用到该问题。
算法解的求解方法通过下面的实例来说明。
工程师现在面对一个方程,根据这个方程可以计算炮弹在任意时刻t的高度。
已知炮 弹在发射和落地时高度都为零,在其之间的某个时刻,它到达最高点。
在飞行的前半部分,飞行高度逐渐增大,在后半部分,飞行高度逐渐减小。
如果能确定这样一时刻:在这一时刻,高度不再增大,并且开始减小,那么这一时刻就是最高点的位置。
我们设计了以下的算法,确定炮弹到达最高点的时刻。
以下是该问题的求解步骤,即算法的伪代码: ●步骤1:设出发时刻t=
0,高度h=
0。
●步骤2:给时间t增加一个微小增量Δt,得到新的时间t(即tnew=t+△t)。
●步骤3:把tnew的值代入方程(1.1),计算h的值,我们称这个值为hnew。
●步骤4:比较h与hnew的大小:•如果h把tnew赋给t, 把hnew赋给h,即t=tnew,h=hnew。
跳转到步骤
2。
•如果h>hnew,则表示高度开始减小,这告诉我们,炮弹在h附近的某个位置达 到最高点(或者在h与hnew之间,或者在前一个时间间隔)。
●步骤5:假设最高点出现在该间隔的开始时刻,即hmax=h。
算法解实质上是解决问题的“路线图”(roadmap),它本身不是一个答案,但它是可以得到一个答案的一系列确定的步骤。
该算法的主要计算部分是在步骤2~步骤
4,在得到求解结果之前,需要反复执行步骤2~步骤
4,但是我们事先无法确定,为得到一个算法解需要跳回到步骤2多少次。
注意,这个算法解仅使用了算术运算。
不同于解析方法,算法解不需要使用微积分或代数原理。
然而,我们必须注意到,算法中使用了近似方法:只是在t的某些特定时刻求得高度h,实际上,很可能最高点出现在这些特定时刻之间的某一个时刻。
如果工程师用时间步长0.1s重新执行上述算法解,在步骤2~步骤4的反复执行过程中,每个变量的值变化如表1-2所示。
循环 1234567 t(s)00.10.20.30.40.50.6 表1-2hmax求解过程每次循环的变量值 Tnew(s)0.10.20.30.40.50.60.7 h(m)00.520.951.281.511.641.68 hnew(m)0.520.951.281.511.641.681.61 步骤4判断 hhnew,赋值hmax=h,算法结束 最后,该算法得到的结果是h的最大值hmax=1.68m。

7 第Ⅰ部分计算工具 继续讨论这个问题,现在设计一个算法,求解炮弹落在水平地面上的位置。
高度值为零表示炮弹落地的位置,炮弹落地的时刻就是炮弹总的飞行时间。
现在的算法如下: ●步骤1:设出发时刻t=
0,高度h=
0。
●步骤2:给时间t增加一个微小增量Δt,得到新的时间t(即tnew=t+Δt)。
●步骤3:把tnew的值代入方程(1.1),计算h的值,我们称这个值为hnew。
●步骤4:判断hnew的值。
•如果hnew>
0,表示炮弹还在飞行,把tnew赋给t,把hnew赋给h,即t=tnew,h=hnew。
跳转到步骤
2。
•如果hnew<
0,则表示炮弹在h与hnew之间的某个位置击中地面。
●步骤5:代入t=t+tnew公式,求得总飞行时间的近似值。
flight
2 ●步骤6:把tflight代入方程(1.2)求得炮弹飞行的水平距离。
算法结束。
再次执行上述算法,并把时间步长设置为0.1s。
算法过程中每一步各变量值如表1-
3 所示。
循环123456789101112 t(s)00.10.20.30.40.50.60.70.80.91.01.1 表1-3求炮弹飞行的水平距离过程每次循环的变量值 Tnew hnew 步骤4的判断 (s) (m) 0.1 0.52 0.2 0.95 0.3 1.28 0.4 1.51 0.5 1.64 0.6 1.68 0.7 1.61 0.8 1.45 0.9 1.19 1.0 0.84 1.1 0.38 1.2 -0.17 hnew
>
0,跳转到步骤
2 hnew>
0,跳转到步骤
2 hnew>
0,跳转到步骤
2 hnew>
0,跳转到步骤
2 hnew>
0,跳转到步骤
2 hnew>
0,跳转到步骤
2 hnew>
0,跳转到步骤
2 hnew>
0,跳转到步骤
2 hnew>
0,跳转到步骤
2 hnew>
0,跳转到步骤
2 hnew>
0,跳转到步骤
2 hnew<
0,根据t=t+tnew计算tflight,并利用方程1.2 flight
2 计算飞行距离,算法结束 工程师把上述两个算法的结果以表1-4的形式报告给相关部门。

8 第1章计算工具 飞行的最大高度飞行的水平距离总飞行时间 表1-4算法解的结果1.68m9.42m1.15s 1.1.4解析解与算法解的比较 通过比较解析解和算法解的过程和结果,我们就不难发现两种求解方法的本质。
两种方法的最重要差别是:解析解是准确解。
只要采用正确的代数和微积分原理,和正确的算术运算,则解析解得到的结果精确度可以达到给定数所允许的有效位数。
与此相反,算法解是近似解,不需要求得方程的精确解,但是需要计算方程在自变量t在某些特定值下的值。
时间的这些特定值,被称为离散值,离散的结果会影响结果的准确性。
根据算法解的性质,算法解只可能出现在时间t的某些离散值下,或两个离散值的中间值下。
但是,尽管算法只能得到近似解,但是我们可以控制两个离散点之间的间隔。
减小算法中的时间增 量Δt的值,可以提高解的准确度。
例如,我们把循环中的Δt值设置为0.001s,则得到的 结果与解析解一样。
但是,为了得到这个准确值,算法中从步骤2~步骤4的循环次数要增大许多倍(求hmax的循环次数从原来的7次变为1680次)。
算法解的本质决定了算法解是近似解。
提高算法解的准确度的办法是减小两个离散点之间的间隔,这要增加算法的循环次数。
当需要得到一个较高准确度的结果时,用手工实现算法解已被证明为不切实际的。
然而,在实际极限之内,这不过是数十次、或数百次,甚至数千次重复执行算法中的某些步骤。
这是因为算法解很容易用计算机工具来实现。
本章前面两个算法的文字描述说明了问题求解方法的详细步骤。
这些文字描述被称为伪代码。
计算机程序设计语言,如本书后面将要介绍的MATLAB软件,很容易把独立于软件的伪代码转化为面向某个特定软件的计算机代码,关键是要提供计算机能够执行的指令。
虽然计算机也可以用来执行解析解中的运算,但是算法解的执行却能最体现出计算机工具的特征。
既然解析解是准确解,算法解是近似解,那么为什么我们还使用算法解呢?在前面这个例子里,根本不需要算法解,因为我们很容易得到它的解析解。
具有微积分和代数背景知识的工程师很容易得到解析解。
在这种情况下,当然解析解是我们的首选。
但是,在一些实际的工程专业领域里,情况并非总是如此。
即使我们在大学本科阶段的学习中,也会遇到一些用数学知识无法解决的问题,甚至遇到一些根本不存在解析解的问题。
正是在这些情况下,算法解可以解决那些用解析解很难求解或者不能求解的问题。
如果读者曾经在可编程的图形计算器里使用过求根函数求解高次代数方程的解,那就是表示使用了由可编程图形计算器设计并实现的算法解技术。
(读者是否意识到,计算器给出的结果竟然是近似值?) 算法解的另一个特点是某个问题的求解算法不是唯一的。
设计求解算法需要数学推理能力和创造力的结合。
计算机科学家的目标是开发出效率高、运行时短、所需内存容量小的计算算法。
在本书里,我们将把重点放在实现和使用标准的求解算法上,但是在工程计
9 第Ⅰ部分计算工具算领域里工程师将不断提出新型的、原创性的工程问题解决算法。
1.2工程计算的方法 在本书中,我们将介绍工程计算两种不同的实现方法:编程工具和电子表格。
编程工具允许我们把伪代码算法翻译成为计算机能够识别的指令集。
这些指令集就是计算机程序或计算机代码。
现在有很多编程语言供实际工作中的工程师们使用。
在本书中,我们利用MATLAB平台引入编程工具的概念。
作为一个例子,我们把求炮弹最大飞行高度的伪代码算法转化为MATLAB指令,如下所示。
在本书的第3章和第4章将详细介绍MATLAB程序的设计过程。
1%MATLABcodeforfindingmaximumheight 2%Definitionofinputvariables 3t=0;%Initialtime 4h=0;%Initialheight 5t_new=0;%Newtime 6h_new=0;%Newheight 7delta_t=.1;%Timestep 8v=10;%Initialspeed 9theta=35;%Launchangle 10g=9.81;%Gravity 11%Checkfordecreasingheight 12whileh_new>=h; 13 h=h_new 14 t=t_new; 15 %Takeonetimestep 16 t_new=t+delta_t; 17 %CalculateheightperEq.1.1 18 h_new=v*t_new*sind(theta)-0.5*g*t_new^2; 19end; 20%Computeandoutputmaximumheight 21h_max=h 在用程序实现算法时,编程工具允许我们使用逻辑判断结构。
在使用计算机计算的初期,用户利用编程工具提供的指令集与计算机进行通信。
尽管程序语言的外表以及与机器通信的界面已经有很大的发展,但是把算法翻译成特定软件的指令的思想仍然是计算的一个标准的模式。
电子表格工具是一个完全不同的计算模式。
它代表一个很大的数据表。
电子表格的用户在表格的某些单元格里输入数据,在另一些单元格里输入使用这些数据的数学方程和逻辑表达式。
这种表格结构为我们提供了直观的图形方式的数据处理和计算方法。
但是它与我们在编程方法中使用的逐步求解指令集有明显的差别。
尽管计算的图形化方法是非常吸引人的,但是在电子表格中,与伪代码算法的直接联系有时并不十分明显。
虽然市场上有很多电子表格软件,但是我们使用微软公司开发的Excel软件作为本书的电子表格平台。
10 第1章计算工具作为一个例子,我们用一个电子表格实现前面的炮弹最大飞行高度的算法,得到的数据如图1-3(只显示数值结果)和图1-4(显示单元格里的计算公式)所示。
图1-
3 图1-
4 在本书的后面章节里,我们将介绍工程问题的各种求解方法。
重点介绍这两种工程求解方法各自的优点和缺点。
有些问题适合于编程方法,而另一些问题适合于电子表格求解方法。
这就是说,本书介绍的MATLAB工具和Excel工具都是非常先进的、功能强大的计算工具,并且在某种程度上,它们都分别结合了每种方法的最好的特性。
Excel提供了一个编程界面,使得我们可以使用比较传统的计算机代码处理和填充表格里的单元格。
而MATLAB为我们提供了矩阵编辑界面,它的外观和作用与电子表格相似。
这两个工具都为我们提供了图表绘制、方程求根、最优化和其他一些常见的操作运算,用户利用这些运算可以访问工程问题求解的高级算法。
本书的目标涉及两个方面。
第一是要把读者培养成熟练使用这两个计算工具的高手;第二是针对某个实际工程问题,读者能够选择一个合适的解决方法。
1.3数据表示 尽管这两种不同的计算方法存在一些差别,但是在某些方面它们还是存在一些共性。
11 第Ⅰ部分计算工具 这些共性表现在数据表示、存储和操作。
在本节中,我们将介绍数据表示这个概念,并把它与本书中使用的MATLAB和Excel工具联系起来。
1.3.1变量与函数 变量是一个量的符号表示,这个量的值不止一个。
考虑以下方程: y=3x2+
6 (1.10) 在该方程里,x和y都是变量,它们可以取多个值。
我们经常称变量为自变量或因变量。
当一个变量的值由其他变量决定时,就称它为因变量。
通常,在写方程时,总是把因变量写在方程等号(=)的左侧。
例如,在方程(1.10)里,我们认为y是因变量,因为它的值由自变量x的值决定。
当然,也可以改写上述方程,把x移到方程的左侧,如下所示: x=y−63 (1.11) 这就表示y就是自变量吗?不能只看方程的形式,还要分析问题的本质,才能决定哪个是自变量。
我们可以肯定,x和y不可能同时为自变量,因为当我们给其中一个变量设置值,就可以从方程中求得另一个变量的值。
回到前面的炮弹转变的例子。
我们将炮弹的飞行高度表示成如下所示的方程: h(t)=vtsinθ−1gt22 (1.12) 其中,v=初始速度;t=时间;θ=发射角;g=重力加速度。
在该方程里,有5个量用符号来表示。
但是它们并非全部都是变量。
初速度、发射角 度和重力加速度是常量而非变量。
在仅从方程来看这并不十分明显,但是从问题的说明来 看就一目了然了。
假如我们改变一下问题的描述,要求在不同角度情况下计算在
t=2s时的 高度。
此时,时间t是常量,而发射角度是变量,但是方程的形式不变。
在另一个问题里, 我们需要知道炮弹在任意发射角能够达到的最大高度,在这种情况下,高度、发射角度和 时间都是变量。
回到原来的问题。
此时,初速度、发射角和重力加速度都是常量,因此可以认为高度 是时间的函数。
我们总是把
h(t)写在方程的左侧,如方程(1.1)所示。
因此t是自变量,而高 度h的值取决于t的值。
对函数的更准确的定义是:函数是一个数学运算,输入一个值或 一组值,返回单个值。
这个输入值就是函数的参数。
Excel和MATLAB都有很多内置函数。
其中许多函数只需要一个参数。
例如在MATLAB 里cos()函数的输入参数是角度的弧度,函数值是它的余弦值。
有些数要求多个参数。
例 如,Excel有一个名为ROUND()的函数,它要求两个参数:需要四舍五入的数和小数位数。
还有一些函数的参数个数是可变的。
在Excel里,AVERAGE()是一个求平均值的函数。
在 MATLAB里,有很多函数使用数组或矩阵作为参数,我们将在后面章节里讨论这个问题。
(注意,本书约定,MATLAB的函数用斜体字表示,Excel函数用大写字母表示。
) 12 第1章计算工具 1.3.2标题与数组 在第1.1节的算法解例子里,我们根据自变量t(时间)的值进行计算,时间t每增加
个Δt,就需要计算炮弹飞行高度一次。
对此进行反复计算,直到高度开始减小为止,这表 示炮弹已经到达最大高度。
选择时间的增量为0.1s,我们再次把分析结果列在表1-5里。
循环 1234567 T(s)00.10.20.30.40.50.6 表1-5炮弹飞行的算法结果 Tnew(s)0.10.20.30.40.50.60.7 h(m)00.520.951.281.511.641.68 hnew(m)0.520.951.281.511.641.681.61 在电子表格求解方法中,我们需要对电子表格的单元格进行运算。
其结果与表1-5相似。
在电子表格里,单元格里的一个数值被称为一个标量(scalar)。
但是在MATLAB等编程语言里,采用另外一种不同的格式表示运算结果。
我们在算法中可以使用t、tnew、h和hnew变量。
在每次循环中,要覆盖这些变量的前一次循环的值。
这样做,就是把每个变量当作一个标量,允许每个变量只有一个值。
但是如果希望保留每次循环的结果,我们要用什么方法?有时我们还要绘制高度随时间的变化图,为此需要把这些运算结果保存在内存里,但是我们又不可能给每个数值一个唯一的变量名(例如,用t1、t2、t3……表示每个时间值)。
如果这样的话,需要对这个问题进行顺序计算,而不能用循环进行计算。
实际上,我们可以用数组保存运算结果。
一个数组是一个可以表示多个值的变量。
例如,时间t可以是一个保存7个值的数组。
数组的某个值要通过索引引用。
索引就是一个整数,它表示某个值在数组里的位置。
我们不妨把索引看成是地址。
以这里的时间t为例,它有7个地址,分别用1~7表示。
在每个地址都保存时间t的一个值,如表1-6所示。
索引
1 时间(s)
0 表1-6数组t的结构
2 3
4 5
6 7 0.1 0.2 0.3 0.4 0.5 0.6 在数组名后面的括号里使用索引值表示(或者数组名的下标表示)数组的某个元素。

如,t
(5)=0.4s,t3=0.2s。
还要注意,数组的索引必须是整数,而且它是从1开始的,之后逐个加
1。
刚入门的程序员最容易犯的错误有: 13 第Ⅰ部分计算工具 ●总喜欢用0作为数组的索引。
在我们的例子里,时间的第一个值是
0,因此我们总是情不自禁地用t
(0)=0表示第一个元素。
在MATLAB里这会引起以下的错误: >>t
(0)=0?
Subscriptindicesmusteitherberealpositiveintegersorlogicals. ●总喜欢使用非整数索引。
例如,语句“t(0.1)=0.1”也会出现同上面一样的错误信息。
●不是用加1的递增方法访问每个元素。
例如,假设在一个实验中,每隔10s记录温度的值。
假设第一个温度值为100º
C,然后就写出这样的语句T(10)=100。
这样做虽然不会造成错误,但是这样会得到一个从T
(1)~T
(9)都为0的数组,如下所示。
>>T(10)=100T=000000000100 出现上述3种错误的原因是我们混淆了自变量与索引的关系。
记住,索引仅是数组里表示地址的值,它本身不是变量。
上面曾提到数组t是一维数组。
即只需要一个索引整数就可以确定数组中的某个值。
除了一维数组外,还有二维数组。
例如在表1-5里,每次循环都有两个时间值:t和tnew。
与其把这些值保存在两个不同的一维数组里,不如把它们保存在一个二维数里。
我们规定第一个索引的值可以取1和
2,分别表示t和tnew,第二个索引表示循环的次数,则这14个时间值都可以保存在一个数组里。
例如,根据这种方法,t(1,5)=0.4,t(2,5)=0.5。
1.3.3矩阵与矢量 一维或二维数组经常被称为矩阵。
矩阵不仅是一种高效存储数据的方法,更重要的是,它还可以直接进行许多数学运算。
事实上,MATLAB这个名字就是代表Matrix(矩阵)和Laboratory(实验室)。
最初设计MATLAB这个程序的目的就是进行矩阵运算。
在第7章和第8章里,我们将学习简单的矩阵数学运算,并且利用矩阵方法求解方程组。
一个矩阵的大小由它的行数和列数确定。
例如,下面这个矩阵是一个3×2矩阵(读作3行2列矩阵)。
它有3行2列元素: ⎡32⎤ ⎢7⎢ −5⎥⎥ ⎢⎣612⎥⎦ 在MATLAB里,我们常称一维数组为矢量。
如果一组数排列成单行形式,我们称它为行矢量。
如果一组数排列单列的形式,我们称它为列矢量。
因此一维数组也被称为列矩阵或行矩阵。
必须提醒读者,在物理学和工程力学中,矢量还有另一个定义,即矢量(avectorquantity) 14 第1章计算工具 是指一个用大小和方向来定义的量。
例如,速度是一个矢量。
要准确定义一个速度,不仅需要确定它的大小(速率),还需要确定它的方向。
定义矢量的一个方法是定义它在x、y和z三个方向上的分量。
当然这三个分量可以用一维数组来表示,这正好符合MATLAB的矢量定义。
由于这两个不同的定义可能会给我们带来混淆,因此在本书中,当我们需要表示一维数组时,就不会使用矢量(vector)这个词,而是用一个更加普通的术语——数组来表示多值变量,用矩阵(matrix)表示需要进行矩阵数学运算的一维或二维数组。
在Excel里,我们也可以表示和操作数组。
可将输入到电子表格单元里的数据看成矩阵,可以把矩阵运算应用到这些单元格上。
在Excel里,这些运算使用预先编制好、专门为矩阵运算而开发的函数来实现。
Excel不同于MATLAB,后者是专门为矩阵运算而开发的。
在MATLAB里,矩阵和标量的运算使用相同的数学符号,而在Excel里矩阵运算需要特殊符号。
在本书的第7章将介绍这些运算方法。
1.3.4准确度与精度 准确度与精度经常互换使用,但是在计算应用程序中它们还是有不同的含义。
准确度是指某个计算值与实际值的接近程度,它本身是一个模型的函数。
例如,在前面求炮弹最大发射高度的例子里,所取的时间步数越多,求得的结果越接近“准确的”解析解。
此外还要注意这个模型里的几个假设,例如,我们忽略了风的阻力的影响。
这个假设也会影响解的准确度。
解的精度取决于输入值的正确性和这些数据在计算机里的存放形式。
例如,在炮弹发射这个例子里,发射角是35º,但是这个角度值准确吗?这要取决于炮弹的发架的设置和角度的测量。
这个角度值可能是精确到度,或精确到十分之一度或精确到5º。
在科学领域里,通常输入变量的测量值的精度是已知的,计算结果的精度取决于输入值的有效位数。
对于带小数点的数,它的有效位数定义为第一位非零数字与最后一位之间的位数。
考虑下面的例子: 1214.556位有效数字1214.55138位有效数字0.000122位有效数字10.000127位有效数字在进行运算时,运算结果的精度由输入值的最小精度决定。
对于加法和减法运算,这意味着,结果中小数点右侧的位数必须等于输入值中小数点右侧的最少位数。
例如:6.778+3.5=10.310.0–0.0012=10.0对于乘法和除法运算,运算结果的有效位数必须等于输入值的有效位数的最小值。
例如: (7.553)(5.52)=41.71.0/4.5567=0.90有些量是准确值。
例如,1ft正好等于12in。
因此,如果我们要把11.556in转换为ft,则结果是: 15 第Ⅰ部分计算工具 (11.556in)⎛⎜1ft⎞⎟=0.96300ft⎝12in⎠ 在这种情况下,⎛⎜1ft⎞⎟这个值有无穷位有效数字。
⎝12in⎠ 不带小数点的数的精度一般都是无法确定的。
例如,我们前面讨论过,炮弹的发射角度35º的精度就是如此。
工程问题经常出现这种情况,即总是存在一些输入量的精度无法确定。
因此,前面介绍的与精度有关的运算规则不能使用,还必须说明有效数字的位数。
许多工程教材建议为最终结果保留3位有效数字(有的教材建议如果第一位有效数字是
1,要保留4位有效数字)。
用手工进行运算时,中间结果的有效数字位数应该保留比最终结果多几位有效位数字。
例如,如果把sin(35º)的值舍入为0.57,就不可以在最终的结果里保留多于2位的有效数字。
用计算机求解时,不会对中间结果进行舍入操作,因此最终结果的精度通常取决于输入值的精度。
这里必须使用“通常”这个词,因为在有些情况下,如运算中同时用到很大和很小的数,用计算机计算也会产生累积误差。
例如,当我们利用一种名为有限元分析方法的计算技术分析机械结构时,需要求解数千个模拟方程,如果在这些方程中的数值相差几个数量级,则求解算法的程序必须想办法使计算误差最小化。
就工程专业的学生和正在实习的工程师们经常遇到的问题而言,这不会成为一个问题。
Excel和MATLAB里的数值的精度到底是多少呢?Excel保留15位有效数字。
而在默认情况下,MATLAB以双精度形式存储数值,它的精度也是15位。
这里的“双精度”这个术语是指存储这样一个数需要用两个字节的计算机内存存储,而单精度数是指存储这样的一个数需要占用一个字节的计算机内存。
在计算机的早期发展阶段,内存空间非常有限,因此只有为了确保运算精度时才使用双精度数值。
使用双精度数也会增加计算时间。
今天,由于计算机的硬件价格非常低,而且CPU运算速度非常快,因此,几乎没有必要使用单精度数。
尽管如此,MATLAB还是支持单精度数。
因此当我们需要处理超大规模数据集时,可以使用单精度数。
关于准确度和精度,有一点需要特别引起读者的注意。
许多学生在用手工计算时,很自然会把运算结果舍入到一定精度,但是当他们用计算机程序求解一个工程问题时,总是在计算结果的报告里,包括了显示在计算机屏幕上的全部位数。
我们这样做就是把计算机求解过程看成是一个黑盒,根本没有考虑到在输入与输出之间的运算过程。
在计算机求解结果的报告中,如果我们使用合适的有效位数,就会给他人这样的印象:我们了解与该问题有关的一些假设和近似条件。
工程专业的学生和实习工程师们必须正确理解计算结果,引用计算结果时要使用合理的有效位数,不要照搬计算机的输出结果。
1.4习题
1.说明解析解与算法解之间的区别。

2.设计一个伪代码算法,求函数f(x)=3x2−12.4x+3与x轴的两个交点。

3.考虑第1.1.1节中使用的炮弹模型。
(a)利用本节中的运动方程,假设发射速度为10.0m/s,设计一个伪代码算法解,当发 16 第1章计算工具 射角至少为多大时,炮弹发射的最大高度可达2.5m?
(b)假设角度离散值的间隔为5º,用手工方法执行这个算法解,用表格的形式输出每
步的执行结果。
(c)求出该问题的解析解,并与算法解的结果进行比较。

4.考虑第1.1.1节中介绍的炮弹飞行问题。
要求炮弹飞越在发射点的正前方8m处的 一堵5m高的墙,求出发射速度和发射角度的关系。
假设炮弹的最大发射速度已知。
设计一个求解该问题的算法解的伪代码。

5.设计一个算法的伪代码,决定10个数当中有多少个是偶数。

6.一位工程师需要测量若干钢筋的直径和长度,得到的结果如表1-7所示。
计算它的截面积和体积,并用正确的有效数字汇报测量和计算结果。
钢筋ABCDEFGHIJ 0.125in0.13in0.1250in0.01250in0.38in0.3750in0.3750in1.2in1.20in1.200in 表1-7直径 长度12.80in1.1ft1.1ft1.067ft8.11in8.110in8.1in5.29in5.290in5.3in
7.利用计算机搜索并记录钢铁的密度,用这个密度值,计算习题6中的每个钢筋的质量。
并用正确的有效数字输出计算结果。

8.找到并阅读著名的工程历史学家HenryPetroski的文章“FailedPromises”,该文章发表在1994年1月~2月的《美国科学》杂志上。
写一个摘要,介绍该文章里与工程计算领域有关的内容。
9.1969年7月,美国实现了把人送到月球的宏伟目标。
考虑到当时的计算机硬件和软件条件,这确实是一个奇迹。
阅读美国国家航空和宇宙航行局(NASA)历史处编写的阿波罗飞行杂志(http://history.nasa.gov/afj)上PhillParker的文章“theApolloOn-boardComputers”(阿波罗飞船上的计算机)。
写一篇摘要,对比阿波罗工程使用的计算工具与今天可以使用的工具。
17

标签: #孩子 #文件 #文件 #服务器 #文件 #文件 #危房 #坐标