《第1章-数值计算与计算机(共15页).doc》由会员分享,可在线阅读,更多相关《第1章-数值计算与计算机(共15页).doc(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上第1章 数值计算与计算机现代科学计算离不开计算机,计算机科学技术的发展为数值计算技术的发展提供了基础。计算机的计算是通过计算机软件或程序来实现的,其硬件和软件的工作状况影响计算精度和速度。在计算机硬件、操作系统和计算方法一定的情况下,合理地设计计算程序是提高计算精度和速度的主要途径。要编写出一种高效率的计算程序,需要具备很多知识,既需要掌握一定的编程技术,也需要对计算机的特点有所认识。同时,还需要了解计算机操作系统以及编程语言的发展史。只有这样,才能知道如何设计最先进的计算程序。1.1 计算机发展史与数值模式计算工具是在人类生活的实际需要中发展起来的,现代计算机的诞生
2、是人类文明的必然产物,它的诞生使数值模式的发展和数值天气预报成为可能。1计算工具发展史计算工具简称算具,是帮助人们计算的工具,它的发展是与计算技术发展相联系的。随着生产的发展和社会的进步,算具经历了从简单到复杂、从低级到高级的发展过程,其历史可追溯至远古时期。人的手指是一种天然的计算工具,也是最古老的计算工具之一。远古时期,人们借助手指计数。可是,人类手指只有10个,不能进行更复杂的计算,于是人们使用小石头、贝壳、木棍、草绳等作为运算工具。算筹、算盘是人类最早的手动计算工具。我国春秋时期出现的算筹,是世界上最古老的算具,例如,春秋战国时期的老子中记述了“善数者不用筹策”。根据史书的记载和考古材
3、料,我国古代的算筹实际上是一根根同样长短和粗细的小棍子,多用竹子制成,也有用木头、象牙、金属等材料制成的,因此,在英语中,“算筹”被翻译成“Counting rod”(计数棒)。古代算筹不仅是正、负整数与分数的四则运算和开方的运算工具,而且还包含着各种特定的演算。算筹促进了中国古代数学的早期发达与持续发展。在算筹之后,随着社会的进步,我国劳动人民又发明了算盘作为运算工具。早在公元15世纪,算盘已经在我国广泛使用,后来流传到日本、朝鲜等国。算盘已经基本具备了现代计算器的主要结构特征。在此之后,1642年法国人帕斯卡设计出了机械式加法机,这是世界上第一台机械式数字计算机。为了制作这台机器,帕斯卡花
4、了3年时间。这台加法机是利用齿轮传动原理,通过手工操作来实现加、减运算的。帕斯卡的加法机当时在法国引起了轰动。世界上第一台能够自动运算的计算器,是1822年由英国数学家巴贝其发明的,是以蒸汽为动力代替人类进行具体运算。1946年发生了人类历史上一件划时代的大事世界上第一台电子数字计算机ENIAC在美国诞生。2计算机发展历程电子计算机在短短的几十年里经过了电子管、晶体管、集成电路(IC)和超大规模集成电路(VLSI)等阶段的发展,使计算机的体积越来越小、功能越来越强、价格越来越低、应用越来越广泛,目前正朝着智能化计算机方向发展。第一代计算机(约从1946年到1958年),体积较大,运算速度较低,
5、存储容量不大,而且价格昂贵,使用也不方便。为了解决一个问题,所编制的程序的复杂程度难以表述。这一代计算机主要用于科学计算,只在重要部门或科学研究部门使用。第二代计算机(约从1958年到1965年),全部采用晶体管作为电子器件,与第一代计算机相比,其运算速度提高了近百倍,而体积只有原来的几十分之一。在软件方面,开始使用计算机算法语言。这一代计算机不仅用于科学计算,还用于数据和事务处理以及进行工业控制。第三代计算机(约从1965年到1970年),主要特征是以中、小规模集成电路为电子器件,并且出现操作系统,使计算机的功能越来越强,应用范围越来越广。它们不仅用于科学计算,还用于文字处理、企业管理、自动
6、控制等领域,出现了计算机技术与通信技术相结合的信息管理系统,可用于生产管理、交通管理、情报检索等领域。第四代计算机(约从1970年到1981年)采用大规模集成电路(LSI)和超大规模集成电路(VLSI)为主要电子器件制成的计算机。例如,80386微处理器,在面积约为10mm l0mm的单个芯片上,可以集成大约32万个晶体管。第五代计算机(约从1981年到现在)把信息采集、存储、处理、通信和人工智能结合一起具有形式推理、联想、学习和解释能力。它的系统结构将突破传统的冯诺依曼机器的概念,能够实现高度的并行处理。有趣的是,算盘和计算机的发明都与中国古代的易经相关。有人研究发现,算盘的结构与中国易经中
7、的河图相似。计算机的二进制也是与中国易经八卦结构排列相对应的,八卦图其实是一种八进制图形。3数值模式与计算机数值模式是数值求解基于有限认识的基础上建立的描述某种物理、化学等变化规律的近似理论模型,它是一种离散化的数值模型,是数值模拟和预报的一种工具。可以说,没有电子计算机,也就不会有数值模式的发展。数值模式有不同的种类,如大气模式、海洋模式、生物模式等。按尺度划分,有小尺度、中尺度和大尺度预报模式等;按时间划分,有短期、中期和长期预报模式等;按其离散化和求解方法,有网格点模式、谱模式等。数值模拟大气运动可以帮助进行天气预报,这种思想可追溯到20世纪20年代英国数学家Richardson的工作。
8、Richardson(1922)论述了数值预报的原理和可能性,并且应用完全的原始方程组,并对欧洲地区的地面气压场进行了6个小时的预报,但结果很不理想。这次失败曾使人们一度对数值天气预报的可能性产生怀疑。直到第二次世界大战结束之后,由于电子计算机的出现,加上气象观测网以及高空观测的发展,数值模式和天气预报又引起了人们的注意。1950年,Charney等人用准地转正压模式,在电子计算机上首次成功地对北美地区500百帕高度的气压场,做了24小时的预报。这一结果的公布被认为是数值模式和数值预报发展的重要里程碑。而当时所用的计算工具是一台可编程式的电子数字积分计算机。借助计算机,从Charney等的成功
9、工作开始,数值模式和数值预报步入了繁荣发展的时期。数值模式的发展与计算机的发展紧密相联,计算机由传统的单核CPU的处理器发展为多核CPU的处理器,而数值模式也由单CPU的串行计算,发展到多CPU的并行计算,这大大提高了模式的计算速度。随着计算机发展,数值模式的计算方式、程序结构也将不断得到改进,这将使数值模式的模拟能力和预报能力不断得到提高。1.2 计算机软件与数值模式比较数值模式是一种特殊的计算机软件,它与一般的计算机软件有很多共同之处,但它们之间又存在一定的差别。1.2.1 计算机软件和数值模式的特点计算机软件是指计算机系统中的程序及其文档。计算机程序简称为程序,是指一组指示计算机每一步动
10、作的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。文档是为了便于了解程序所需的阐明性的技术资料。程序必须装入机器内部才能工作,文档不一定保存在计算机里。在一定意义上,数值模式可以称为一种计算机软件,它与一般软件程序一样,具有以下特性。1程序的静态与动态属性(1)静态:程序就是用计算机语言描述某一问题的解决步骤,其表示是静态的。(2)动态:程序代码通过编译或解释成计算机指令代码,称为可执行程序。它的动态执行就是人们常说的“进程”。2程序是由程序语言抽象的符号表达计算机的指令代码是以二进制表示的机器码。在高级设计语言以八进制、十进制、十六进制表示。因为语言越高级,越好使用,翻译程序的
11、任务越重,所以程序设计语言对软件开发起很大作用。3程序是对数据施行算法的过程程序中包括一定的算法和数据。程序执行后,对数据进行了加工或提供了一组动作的计算办法,即算法。它使数据由初始态变为终止态,并且,同样的数据改变可使用不同的算法实现。程序的数据一般用于刻画事物的属性和状态。合理设计数据结构是提高程序质量的先决条件。4程序具有分层嵌套的结构程序的结构是分层嵌套的,例如,主程序P调用子程序A,而A又调用子程序B,环环相扣,而子程序都具有一定的通用性。若不采用此种结构,虽然可以实现同样的程序功能,但将增加计算程序代码长度。数值模式与一般的商业软件有一定的不同。一般商业软件具有很强的人机对话界面操
12、作,适合于广大的人群使用,趋向于简单化操作发展;而数值模式的重点在于计算,其模式本身不仅具有一般软件的设计结构,而且具有物理、化学等规律的描述以及一定的计算方法,只适合专业技术人员来操作。数值模式与一般的商业软件最大的不同在于,数值模式运行结果的正确性有一定的不可知性,而一般的商业软件运行结果的正确性可以立即得到证实。数值模式计算结果的正确与否只有在事件发生后才能确定,有时实测资料也无法获得,正因为如此,有些数值模式的计算结果虽然看上去似乎“合理”,但实际上可能存在一些代码描述错误。因此说,数值模式的发展比一般商业软件的开发难度更大,要求更高。然而,在编写数值模式时,也需要像编写计算机软件一样
13、,只有掌握一定的规则、技巧,才能提高程序的性能和便于以后的维护。1.2.2 计算机软件与数值模式的发展计算机软件的发展可以看作数值模式发展的晴雨表。了解了软件的发展,在一定的程度上有助于发展数值模式。数值模式与商业软件的发展具有一定的相似性。1计算机软件发展计算机软件可以分为系统软件(操作系统、数据库等)、支撑软件(高级语言编译器、程序库、CASE工具等)和应用软件。计算机软件随着计算机硬件的发展而发展。计算机软件发展的历史不长,世界上第一台电子数字式计算机ENIAC于1946年2月在美国宾夕法尼亚大学正式投入运行,自那时起,计算机软件业才开始萌芽。计算机软件的发展具体表现在计算机系统、编程语
14、言、程序结构和计算方式等方面的发展,它们之间又是相互联系的。(1)计算机操作系统的发展首先,所谓的操作系统是指计算机系统中的一个系统软件,它是管理和控制计算机系统中的硬件和软件资源、合理地组织计算机工作流程以及方便用户使用的程序集合。操作系统是随着计算机硬件的发展和人们对于计算机技术要求的提高而逐步发展形成的。早期的计算机没有操作系统,人们是通过各种操作按钮来控制计算机的。后来出现了汇编语言,操作人员通过有孔的纸带将程序输入电脑进行编译和运行。由于程序难免有误,机器通常会中途崩溃。这给用户带来极大的不便,并且不利于设备和程序的共用。为了解决这些问题,于是出现了操作系统。计算机操作系统的发展经历
15、了两个阶段。第一个阶段为单用户、单任务的操作系统,继CP/M操作系统之后,还出现了C-DOS、M-DOS、TRS-DOS、S-DOS和MS-DOS等磁盘操作系统。第二个阶段为多用户多道作业和分时系统。其典型代表有UNIX、Xenix、OS/2以及Windows操作系统。分时的多用户、多任务、树形结构的文件系统以及重定向和管道是UNIX的三大特点。其中,UNIX系统是1969年问世的,最初是在中小型计算机上运用。最早移植到80286微机上的UNIX系统,称为Xenix。Xenix系统的特点是短小精悍,系统开销小,运行速度快。经过多年的发展,Xenix已成为十分成熟的系统。MS-DOS是在IBM-
16、PC及其兼容机上运行的操作系统,它起源于SCP86-DOS,是1980年基于8086微处理器而设计的单用户操作系统。后来,微软公司获得了该操作系统的专利权,配备在IBM-PC上,并命名为PC-DOS。Windows是微软公司在1985年11月发布的第一代窗口式多任务系统,它使PC开始进入了所谓的图形用户界面时代。Linux是目前全球最大的一个自由软件,它是一个可与UNIX和Windows相媲美的操作系统,具有完备的网络功能。Linux最初由芬兰人Linus Torvalds开发,其源程序在Internet上公开发布,由此,全球电脑爱好者可以根据自己的意愿参与Linux某一方面功能的完善或开发。
17、因此,Linux将发展成为一个全球最稳定的、最有应用前景的操作系统之一。总之,计算操作系统的出现是人们对计算机技术要求的必然结果,它的发展将会使计算速度不断得到提高,并且使人们更加方便地进行数据共享、程序代码和设备公用。同时,也将给数值模式的计算提供更良好的工作环境。(2)编程语言的发展早期程序员们是使用机器语言来进行编程运算的,并直接对以数字表示的机器代码进行操作。机器语言是用由“0”和“1”组成的二进制代码表示的、计算机能直接识别和执行的一种机器指令的集合。使用机器语言是十分痛苦的,特别是在程序有错需要修改时,更是如此。而且,由于每台计算机的指令系统往往各不相同,所以,在一台计算机上执行的
18、程序,要想在另一台计算机上执行,必须重新编写程序。为了减轻使用机器语言编程的痛苦和便于阅读,人们进行了一种有益的改进,把机器代码用英文字符串来表示,于是出现了汇编语言。从最初与计算机交流的痛苦经历中,人们意识到,应该设计一种语言,这种语言接近于数学语言或人的自然语言,同时又不依赖于计算机硬件,编出的程序能在所有机器上通用。经过努力,IBM公司的John Backus领导的研究小组于1954年首次推出了第一代Fortran(Formula Translator)语言。Fortran语言以它的简洁、高效性,成为此后几十年科学和工程计算的主流语言,除了Fortran以外,还有ALGOL60等科学和工
19、程计算语言。随着计算机应用的深入,产生了使用计算机来进行商业管理的需求,于是COBOL这类商业和行政管理语言出现了,并一直流行至今。早期的这些编程语言都是面向计算机专业人员的,为了普及编程语言,使计算机更为大众化,美国的达尔摩斯学院的Thomas Kurtz和John Kemeny于1964年编制了一种入门级的Basic语言,这种语言简单易学、功能较全,比较适合初学者,广泛用于中小型、微型计算机中。20世纪60年代初,结构化程序设计的思想就已产生,1960年第一种结构化程序设计语言ALGOL被推出。在这种思想的指导下,20世纪70年代初,人们又推出了两种典型的结构化程序设计语言,一种是PASC
20、AL语言,另一种是C语言。PASCAL语言,以17世纪法国数学家兼哲学家Blaise Pascal的名字命名,1970年问世,是由ALGOL 60发展而来的结构化编程语言,能够利用组合块结构及多种数据类型。这种语言直观易懂,可用于科学计算,也可用于编写系统程序,它是由瑞士苏黎世工学院的教授Niklano Wirth编制的。C语言,最早由贝尔实验室的Dennis Ritchie开发,于1972年正式发表。C语言具有高级语言和汇编语言的双重特色,书写简便灵活,有助于缩短程序的长度,提高工效,便于移植,常用于编写系统软件,主要是为专业程序员设计的。20世纪80年代,在软件设计思想上,又产生了一次革命
21、,其成果就是面向对象的程序设计。在众多的面向对象语言当中,最为突出的就是C+语言。1980年,美国贝尔实验室的Bjarne Strotstrup博士及其同事开始对C语言进行改进和扩充,最初被称为“带类的C”,1983年才取名为C+。这种语言继承了C语言的所有优点,如简洁性和高效性,同时引入了面向对象的思想,如类、封装、继承、多态等。像任何人类的自然语言一样,C+语言提供一种表达思想和概念的方法,当问题变得大而复杂时,使用C+语言来解决问题将会比使用其他语言更加容易、更加灵活。在最早的面向对象语言中,除了C+以外,还有一种纯面向对象语言也十分流行,如Smalltalk语言等。20世纪90年代,计
22、算机图像技术和网络技术发展占主导地位,一些相关的编程语言被发展起来。1991年,美国微软公司推出了Visual Basic(简称VB)。Visual意即可视的、可见的,是指在开发时不需要编写大量代码去描述界面元素的外观和位置,只需把预先建立好的对象拖放到屏幕上的相应位置。翌年,即1992年,美国微软公司又推出了Visual VC+语言。在这段时期,出现的另一种编程语言是Java,它诞生于1991年,最初被称为OAK语言,是SUN公司为一些消费性电子产品而设计的一个通用环境。在网络出现之前,OAK可以说是默默无闻,直到网络的出现,才被重视。1995年,美国Sun Microsystems公司正式
23、向IT业界推出了Java语言,该语言具有安全、跨平台、面向对象、简单、适用于网络等显著特点,当时以Web为主要形式的互联网正在迅猛发展,Java的出现迅速引起所有程序员和软件公司的极大关注,目前Java已成为动态网页和网络数据库访问程序的主要编写工具。2000年后,编程语言继续发展,又涌现出很多的新语言,如VB.NET、C#、J#等。这些语言集合了许多其他语言的优点,并增加了新的功能。例如,2000年随Microsoft.NET Framework一起发布的Microsoft C#集合了C以及C+,甚至Java的许多优点;与C+相比较,C#语言中的class类安全性更强。总之,编程语言的发展经
24、历了从机器语言、汇编语言到高级语言的历程。编程语言的发展史也是人们不断追求更高的独立于硬件的抽象化、模块化和封装化的历史。(3)程序结构设计的发展程序结构设计是伴随编程语言的变化而发展的。程序结构设计经历了无序化、结构化程序设计、面向对象程序设计和组件模型等发展过程。结构化程序设计的思想是在20世纪60年代末、70年代初为解决“软件危机”而形成的。在以往的编程过程中,人们经常使用转移语句(GOTO),虽然它可以使程序的控制流程强制性地转向程序的任意一处,然而,如果一个程序中多处出现这种转移语句,将会导致程序流程无序可寻,程序结构杂乱无章,使人难以理解和阅读,并且容易出错。为此,人们提出了结构化
25、程序设计的思想。结构化程序设计使程序可读性强、容易理解、便于维护,它是面向对象设计的基础。PASCAL语言、C语言等的编程特点具体地表现了这种思想。为了进一步使程序设计合理化,从20世纪80年代后期开始,人们又提出了面向对象程序设计(Object Oriented Programming,OOP)方法,C+语言的出现是这种思想的明显体现。面向对象程序设计所包括的内容有类(class)、封装性、继承性、多态性等。C+语言中的class与C语言中的struct在应用上有点类似,但class可以包括函数、初始函数和析构函数(或入口函数和出口函数)等,并且class的成员有不同的保护级别(如priva
26、te、protected、public)。封装是人们对现实世界中解决问题时,为了简化问题,对研究的对象所采用的一种信息屏蔽技术。封装后,使用者只需要知道输入和输出的几个有限变量,而不需要知道其内部的实现过程。继承是指一个对象直接使用另一对象的属性和方法,通过继承,程序开发者既可以继续使用前人编写的函数代码,又可以增加新的函数,这大大减少了重复工作。多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作,从而实现“一个接口,多种方法”,通过函数名或运算符重载和虚函数来实现。在同一种语言下,面向对象程序设计为程序员的软件开发提供了极大的方便,然而,随着编程语言和不同应用程序数量的增大,
27、并且不同软件商需要进行一些技术保护,在这种形势下,需要发展一种封装性好,并且具有连接这些软件功能的单独程序,于是,在20世纪末,在传统面向对象技术的基础上,人们又发展了组件模型技术。目前主要流行两种组件模型:COM(以及建立在COM基础之上的DCOM)组件模型、CORBA组件模型。 COM(the Component Object Model)是一种平台独立的、分布式、面向对象的系统,用于创建可互操作的二进制软件组件。COM是微软的“对象链接和嵌入”(简称OLE),ActiveX(可用于Internet的组件),以及许多其他技术的基础。DCOM(the Distributed Componen
28、t Object Model)扩展COM,以支持不同计算机之间、互联网间的对象间通信。 CORBA(the Common Object Request Broker Architecture)是OMG(the Object Management Group)制定的、开放的、独立于开发商的体系结构和基础构造,通过CORBA,计算机应用程序可以通过网络协同运作。CORBA组件能运行于任何一种平台之上,特别是在UNIX平台上,它已经成为编写分布式应用程序以及中间件的标准组件模型。CORBA从一开始就是为了成为一种跨平台的分布式组件标准,经过多年的发展,已经成为一种成熟、完备的组件模型。总之,软件程序
29、结构设计思想的变化是计算机技术发展的反映和必然结果,程序结构的设计远远没有达到完美的程度。从长远看,目前程序结构的设计还处于初级阶段,如同人类产生之前的单细胞生物的进化阶段。未来的软件将会出现高度智能化,可以自复制、繁殖、信息储存等。未来计算机软件结构演变将会像生命进化一样向前发展。(4)计算机工作结构的变化计算机有两种工作结构,即串行计算和并行计算。所谓串行计算就是指令只能串行执行,即指令序列只能按照事先安排好的次序顺序地执行。所谓并行计算分为时间上的并行和空间上的并行。时间上的并行就是指流水线技术,而空间上的并行则是指用多个处理器并发地执行计算。处理器由单核向多核的转变使并行计算成为可能。
30、并行算法的产生是与实际应用问题的需求紧密联系的,其主要原因有两个方面:一是因为通过并行计算,可以提高计算速度;二是由于计算机电路设计有一定的物理极限。单个处理器的线宽的扩展总有一天要达到物理极限,所以不得不转向多核。从历史上看,20世纪70年代末至80年代初是并行算法研究的顶峰时期,获得了递归问题向量化的成果。随着多向量处理并行计算机(以Cray公司为代表,中国的则是银河系列)的出现,既要考虑多处理机间的任务级大粒度并行,又要考虑单处理机上向量级细粒度并行的算法在20世纪80年代初期和中期比较流行。基于SIMD并行计算机设计的并行算法在20世纪80年代中期较热门,但因缺乏通用性,过分依赖机器,
31、程序设计复杂,随着20世纪80年代后期高性能计算机的发展,很快被淘汰。20世纪90年代中期后,并行算法研究渐渐面向实际而内容有所拓宽,不但研究并行算法的设计与分析,同时也兼顾并行机体系结构和并行程序设计。与计算机硬件发展相比,自从1950年第一台并行计算机EDVAC问世以来,并行软件技术几十年来没有获得突破性的进展,特别是分布式计算技术,自动并行识别技术等。要想改变这种局面,并行算法需要走商业道路,正如美国加州大学伯克利分校计算机科学教授Culler等(Culler, et al.,1998)所说:“尽管并行计算的学术历史在时间上不算短,在内容上也很丰富,但从根本上改变这一学科现状的是和商用技
32、术的紧密结合。”虽然并行算法还没有发展成熟,但前途一片光明,随着计算机技术的发展,未来并行算法软件的开发将会给商家带来无限的机遇。2数值模式的发展数值模式的发展主要体现在模式种类和模式结构两个方面。模式种类的发展主要与社会发展的需要相关,而模式结构的发展主要与计算机技术的发展相关。(1)数值模式发展历程自20世纪20年代英国数学家Richardson提出数值预报思想后,在一段时间里,数值模式的发展一直处于停滞状态,直到20世纪50年代数字电子计算机的出现,才使数值天气预报成为可能。到20世纪50年代后期,美国和欧洲部分国家的天气预报员开始把由计算机产生的天气图作为参考基础。20世纪60年代,计
33、算机的能力增强使区域天气模拟变为全球大气模拟成为可能。这使得科学家们能够进行气候模拟,即长期大气平均状态。大气环流模式(GCMs)开始在全世界传播开来。20世纪70年代,GCMs已成为气候研究的主要工具,在这以前人们主要是通过地区或区域气象资料的收集整理并进行统计。在同一时期前后,气候学家开始关心大气中二氧化碳的积累的、长期的、可能的影响,以及研究人类活动对全球变化的影响。与此同时,海洋模式工作者开始建立海洋环流模式(OGCMs)并进行类似的计算机模拟工作。因为海洋是气候系统的主要组成部分,气候模式工作者开始把OGCMs 与GCMs 进行耦合,以便进行全球大气研究。20世纪80年代,国际政府部
34、门协商如何对待气候变化问题。全球气候学家团体,政府间气候变化专门委员会(IPCC)成立以便为这些协商提供建议。1992年,世界多数国家共同签署了联合国气候变化纲要公约(FCCC)。全球变化问题使数值模式的发展越来越受到重视,这是因为数值模式是全球变化研究的最有效的工具之一。目前世界上已发展了多种数值模式,并且世界各国共同实施了一系列国际模式比较计划(AMIP、PILPS、CMIP等)。(2)数值模式结构变化与计算机硬件、软件一样,数值模式发展也是经历了从简单到复杂,由低级到高级的发展阶段。数值模式结构变化与计算机发展相联系,这决定了在模式程序中需要考虑物理过程的复杂程度。20世纪90年代以前,
35、由于计算机技术的限制,加之数值模式本身的发展还不完善,数值模式结构非常简单,如一维模式,二层模式等。为了克服计算机计算速度的不足,人们还设计出了距平模式、谱模式等。早期的模式既简单又单一,很多模式计算方案都是针对某些物理化学过程而设计的,如陆面模式、积雪模式、水文模式、水波模式等。随着计算机技术的发展,这些单一的计算方案如今与大气模式耦合在一起,逐步发展成为一种功能强大的集合模式。在这个集合体中,不同的物理过程可能使用统一的计算模块,同一物理化学过程可以有不同的计算方法。随着数值模式和计算机技术的发展,模式中考虑物理过程越来越精确,模式的结构越来越细,分辨率越来越高,模式积分的时间越来越长。从
36、前面讲到的软件结构发展史可以看到,其发展经历了无序化、结构化、面向对象程序设计和组件模型等发展过程。同样,数值模式结构的发展经历了类似的发展过程。这种发展过程如同其他任何事物的发展过程一样,即从分工到协作的发展。1.3 程序设计对计算的影响计算机对计算的影响包括计算速度和计算误差。这两个方面的影响又分别来自计算机硬件和软件。计算误差产生的原因很多,如把方程式离散化后产生的截断误差、舍入误差(把看成3.14159)、人为过失误差等。同样,影响计算速度的因素也有很多,如计算机硬件性能、计算方法、程序结构等。虽然计算机硬件对计算速度和精度的影响是客观事实,然而可以从软件方面弥补这种不足。这里重点分析
37、计算机程序对计算速度和精度的影响。1.3.1 计算方法对计算精度的影响对于这类误差,人们研究的很多。它产生于计算者所采取的计算方法,不同的计算方法可能产生不同的误差。对于数值模式来说,网格分布特性和迭代方法等都会带来一定的计算误差。因此,在程序设计前,需要选择合适的计算方法。网格分布特性对数值计算误差有一定的影响。这类误差来源于网格空间距离的大小、积分计算的时间步长、网格单元几何形状、物理方程的差分格式等。网格单元的几何形状,可分为三角形、四边形等。差分格式可分为显式、隐式和半隐式等。在数值计算时,不完全迭代总会产生一种所谓的不完全迭代误差。它是由数值计算所得出的当前解与在同一套网格上离散方程
38、的精确解之间的偏差,亦即迭代终止时离散方程的当前与精确解的偏差。在实际计算时,多数情况下,由于离散方程采用迭代方法求解时,不可能达到绝对收敛,必须给定某些限制条件使迭代过程停止。这种条件很多,如规定相邻两次迭代的解的相对偏差小于允许值;规定离散方程的余量小于一定值;给定迭代次数等。因而,如果迭代结果偏差不为0,就会产生截断误差。1.3.2 程序设计对计算精度的影响即使采用同样的计算方法,若计算程序结构不同,也会产生一定的计算误差。由于计算机只能对有限位数进行运算,一般数必须要进行舍入,这就产生了计算误差或舍入误差。1程序变量类型设置对计算结果的影响在编写程序时,每个变量都有一种类型,如字符型、
39、整型、实数型、双精度型等。每种类型规定了在程序运行时这些变量在计算内存里所占的位数,即内存空间的大小。例如,字符型占1个字节,整型占2个字节,实数类型占4个字节,双精度占8个字节。一个字节占8 bits。在C语言中,每个变量都需要给出数据类型说明。在有些编程语言,如Fortran中,可以采用变量的隐含说明,即不需要进行变量的类型说明。当变量的类型给定后,变量所能容纳的最大数值也就确定了。例如,表示两个字节整型变量所能容纳的最大数是65535(0xFFFF)。如果超过这个数,计算结果就会出错。在Fortran程序中,若变量类型本应使用双精度却采用单精度的,则会出现计算结果错误。例如,使用程序1-
40、1计算阶乘,如果变量使用单精度类型,当输入数小于14时,计算结果是正确的,否则,不正确,因为超过了变量类型的容量。程序1-1program test_precisioncall factorial(13)call factorial(14) call factorial(15) contains subroutine factorial(n) real sum sum=1 do i=1,n sum=sum*i enddo print*,n,! ,sum end subroutine end program运行以上程序,将得到表1-1所示的单精度值。与双精度计算结果比较,可以看出,当n13时,单
41、精度的计算结果不正确。表1-1 不同精度下阶乘计算结果比较阶乘单精度(32-bit)双精度(64-bit)13!14!15!00002程序结构对计算结果的影响程序结构的设计方法也对计算结果有影响。在计算机精度一定的条件下,不同的程序设计方法也会使计算产生一定的误差。例如,对于等式:(1-1)当n为一个大的整数时,使用左、右代数式计算,所得到的结果会有一定的差异。可见,计算步骤越多、过程越复杂,产生计算误差的可能性越大,计算速度越慢。1.3.3 程序设计对计算速度的影响程序设计不仅对计算精度有影响,而且对速度也有影响。同样,这种影响可能来自程序员所采用的计算方法、程序结构,以及程序编译器或系统软
42、件等。1程序结构的影响程序结构对计算速度的影响是显而易见的,如对式(1-1)左边与右边进行计算。再如,把代数式:x3+3x2+3x+1变换成(x+1)3,对于前者,计算机CPU要进行9次操作;对于后者,只需6次操作,显然,后者的计算速度快。常见影响计算速度的另一种情况是,在程序设计时使用重复计算。在实际计算中,重复计算的形态各种各样。例如,在一个循环结构中,设置常数赋值语句,见程序1-2。程序1-2a=10b=20do k=1,100 x=a+b y=x*xenddo再如,在程序中,对相同的表达式或函数进行重复计算,见程序1-3,其中x是一个变量,f(x)表示为一个函数。程序1-3x=10y=
43、f(x)*f(x)可以看出,以上程序对函数f(x)进行了重复计算。因为对于一定的x值,f(x)的值是确定的,因此,对f(x)函数只需计算一次,其计算结果可使用一个临时变量来保存,如y1=f(x),y=y1*y1。2计算环境的影响系统软件对程序计算速度的影响也是很好理解的。一般来说,用低级语言编写出的程序比用高级语言编写的速度快,程序员自己编写的程序比借用其他现成模块的速度快。这是因为低级语言与计算机机器语言比较接近,不需要过多地转换翻译过程,因此计算速度较快。对于第二次开发程序或解释程序,在计算时,需要经历一些转换过程,因而计算速度相对较慢。从前面介绍的计算机技术发展可以看到,当今的计算机软件
44、技术就像给衣服上打“补丁”一样。一种软件可拆分为各个部件,每个部件可以由不同的开发商来完成。然而,使用这些“产品”需要满足一定的规则和标准,因而影响计算速度。对于数值程序模块之间的耦合,在某种程度上,与商业软件借用其他现成模块的操作类似。目前,各种单一模式之间没有统一标准,在对它们进行耦合时,需要进行一些数据格式转换,这在一定程度上影响了计算速度。1.4 数值误差与科学预测数值计算中存在模型描述误差、初始误差、计算误差等,这些误差的存在影响了科学预测的准确性。1初始误差与蝴蝶效应 有句成语叫做“差之毫厘,失之千里”,意思是说,开始时虽然相差很微小,结果会造成巨大的错误。所谓的“蝴蝶效应”说明的
45、就是这种现象。蝴蝶效应是美国麻省理工学院气象学家洛伦兹(Lorenz)1963年提出的一个观点,他通过对一个简化的大气动力学方程进行积分,计算后发现,当对初始气象场作微小的改变后,则可以得到两种截然不同的结果。这种现象被戏称为南美洲亚马逊河流域热带雨林中的一只蝴蝶,煽动几下翅膀,就可能在几周后引起美国得克萨斯的一场龙卷风。这种现象也告诉我们,初期计算误差对长期积分计算结果可能会产生很大的影响。如何消除计算误差对计算结果的影响是气象、地震等预测时需要面临的问题。为了减少计算误差的影响,目前人们常采用了一种所谓的“集合预报”。这种技术是把多个数值模式,或者单个数值模式使用不同的初始值进行积分,对所
46、得的结果加以平均,以此做出预报。实践证明,集合平均预报优于单一的数值预报。2初始误差与计算结果蝴蝶效应是指微小的初始值变化,亦可以理解为,微小的初始误差,可以导致不同的计算结果。实际中,并不是所有的初始误差都会导致不同的计算结果,相反,在某些数值计算中,虽然初始条件不同,却能得到相同的解。例如,重复使用同一气象强迫场对陆面过程模式进行积分,即使初始条件不一样,最后都能得到相同的平衡态。初始误差对数值解影响可用图1-1所示的实例来说明。假设有一个碗和一个自上向下掉落的小球,当碗口向下时,小球掉到碗底部上,当受力不均衡时,它将会滑落到不同的方向;相反,当碗口向上时,小球将会掉到碗中,最后落在碗底。
47、前者好比蝴蝶效应,后者好比数值计算有唯一确定解。图1-1 数值计算初始误差影响的示意图1.5 数值计算中值得注意的几个问题在数值计算中,经常会碰到一些计算式出现“病态”,例如,一个较大加上或乘以一个极小的数;有时为了使计算式分母不为0,人为地给定一个非常小的数;等等。这些对计算结果有什么影响,如何解决这些问题?值得我们去思考。1避免大数吃小数由于计算机精度影响,如果有效数位小于大数加(减)小数的数位,那么就会出现大数“吃”小数的现象(徐士良,2002),如。要避免大数吃小数问题,就要在运算时,合理地安排计算式的排列顺序。2避免先截断后运算在数值计算中,如果对一个变量值进行先截断,然后再进行计算
48、,就会产生误差,这种截断是由于变量类型变换等原因引起的。例如,把一个双精度的数赋值给单精度的变量,然后又再采用双精度计算。因此,为了提高计算结果的精度,在数值计算时需要选择合理的变量类型。3避免使用复杂计算式在计算时,有时为了方便,不对计算式进行化简而直接计算,这样就使计算复杂化,既浪费了计算时间,也影响了计算速度。因此,在数值计算前,需要先对计算式进行化简,然后计算,特别是针对大型的数值模型。4正确处理小分母问题在物理学中,“小分母问题”是一个非常重要的科学问题,它与扰动有关。18世纪天文学家在研究天体运动扰动时就发现了“小分母问题”。在物理方程中,如果分母等于0,往往会发生奇异现象。例如,庞加莱研究表明,在动力学中,共振方程解中带来具有分母1/(n11+n22)项,其中n1和n2都是非零整数,1和2为角速度,只要相空间中的点满足n11