1.1.4 计算的方法和过程
计算方法是一种研究并解决数学问题的数值近似解方法,是在计算机上使用的用于求解数学问题的方法,既有数学类课程中理论上的抽象性和严谨性,又有实用性和实验性的技术特征。计算方法在科学研究和工程技术中的应用非常广泛。例如,在航天航空、地质勘探、汽车制造、桥梁设计、天气预报和汉字字样设计中都有计算方法的踪影。因此,计算方法是一门理论性和实践性都很强的学科。
计算方法研究的基本问题是如何把复杂数学模型的求解从实际问题中抽象出来,尽可能有效地转化为对有限数位的数的有限次数的四则运算,在此基础上再进一步研究如何结合计算机的特点进行数值计算的基本方法。
计算过程就是执行算法的过程,把问题转化为一步一步按规则执行的机械求解过程,各种计算语言都是形式语言,软件开发过程实质上就是程序员们对客观世界问题域的形式化的过程。程序员们先建立问题的模型,再用计算机语言加以恰当的表达,最后输入计算机进行计算。
计算的过程基本如下:
(1)需要对一个复杂的科学技术问题进行分析,根据提出的问题和条件进行约简和抽象,从而建立数学模型。
随着科学技术对研究对象的日益精确化、定量化和数学化,随着计算机的广泛应用,数学模型已成为处理科技领域中各种实际问题的重要工具,并在自然科学、社会科学与工程技术的各个领域中得到广泛应用。数学模型是连接数学与实际问题的桥梁,对数学模型而言,数学是工具,解决问题是目的。在建模过程中,从要解决的问题出发,引出数学方法,最后再回到问题的解决中去。
(2)同一类问题的求解方法存在多种,因此需要根据实际问题对计算精度和计算效率的要求选择合适的计算方法,根据采用的计算方法设计正确的算法。
(3)构建解决问题所需要的计算环境。包括计算机的硬件系统、软件系统,所需要的数据以及所使用的网络环境。
(4)运用程序设计方法学所阐明的原则、原理和技术编写程序,要综合考虑程序执行的时间、空间等问题。
用某种计算机语言写出该算法的程序,并输入计算机,计算机将按照程序指令的要求自动处理,并输出计算结果。
使用计算机解决问题时需要用程序设计语言对问题的求解加以描述。实质上,软件是问题求解的一种表述形式。显然,如果软件能够直观地表现求解问题的方法,则软件不仅易于被人理解,而且易于维护和修改,从而提高了软件的可靠性和可维护性。此外,如果按人们通常的思维方式来建立问题域的模型,则可以提高公共问题域中的软件模块化和重用化的可能性。软件开发的过程就是使用各种计算机语言将人们关心的现实世界映射到计算机世界的过程。
(6)运行、调试和完善程序。查出程序执行过程中出现的错误并改正,使程序能够顺利通过并得出正确结果。程序测试则是使程序在各种可能情况下均能正确执行。
(7)文档资料编写。写出程序的设计、维护和使用说明书。存档和备查始终贯彻整个解题的过程。
可以看出,计算方法的运用过程本身就是一个将复杂任务分解为若干简单任务的过程,并且每个任务都需要选择合适的方法,按照一定的规范逐步处理,处理过程中需要根据具体情况对方法进行调整,甚至从头再来。因此,计算方法运用的每个步骤都能体现计算思维的理念,学习计算方法对培养计算思维具有重要的意义和良好的作用。
随着计算机的发展与普及,继实验方法、理论方法之后,计算已成为科学实践的第三种手段,求解各种问题的计算方法已被广泛应用于自然科学、社会科学等领域。
这里所谈的计算方法是广义上的计算方法,它是利用计算机求解问题的一般方法与过程,它的任务是提供在计算机上实际可行的、理论可靠的、计算复杂性好的各种方法。
利用计算机求解问题的一般过程如图1.4所示。
图1.4 问题求解的过程
狭义上的计算方法是研究怎样通过计算机所能执行的基本运算,求解各种问题的解。更确切地说,它是对给定问题的输入数据和所需计算结果之间关系的一种明确的描述。
对于许多问题的计算,既可以用类似于计算函数的方法来进行,也可以用表(一种数据结构)处理的方法进行,甚至还可以用逻辑公式演绎推导的方法来进行。在实现技术上,既可以用递归技术计算,也可以用迭代技术、程序变换技术或其他技术进行计算。
求解一个给定的可计算或可解的问题,不同的人常常编写出不同的但都是正确的程序。这是由两个问题所决定的:一是与计算方法密切相关的算法问题;二是程序设计的技术问题。
既然求解同一个问题可以有不同的方法、算法和程序,那么,怎样来判断算法和程序的优劣呢?如果依据一个算法设计了一个计算某一问题的程序,然后对其进行程序变换,假设经过程序变换得到的程序仍然是计算这个问题的,那么,这个新程序所对应的算法和原来的算法一样吗?即程序变换是否改变算法呢?如何确保算法和程序的正确性?从上述两个例子,我们已认识到算法、程序与数学之间存在着密切的联系。要解决上面的问题,没有数学和计算科学理论的支持是不行的。
在计算科学中,人们已经认识到:一个问题,当它的描述及其求解方法或求解过程可以用构造性数学描述,而且该问题所涉及的论域为有穷,或虽为无穷但存在有穷表示时,那么,这个问题就一定能用计算机来求解;反过来凡是能用计算机求解的问题,也一定能对该问题的求解过程数学化,而且这种数学化是构造性的。这是由于构造性数学的构造性特征保证了计算方法的可行性,两者之间是相容的。在计算科学的发展过程中,计算方法同算法始终是紧密联系在一起的,有时候计算方法就是算法,有时候计算方法离算法还有一定的距离,如某一方法仅仅只能表示为一个过程而不能表示成算法。
当一个问题的求解有了计算方法和算法时并不等于就完事了。在许多情况下,找到求解一个问题的计算算法只是走完了第一步。至于现实是否可以计算,则取决于算法的存在性和计算的复杂性,即取决于该问题是否存在求解算法,算法所需要的时间和空间在数量级上能否接受。要注意的是:有的问题虽然存在求解问题的计算方法,但不存在算法。研究其原因,大致有两种可能:一是计算方法可能不是构造性的;二是虽为构造性的,但计算方法不能保证计算过程在任何初值的情况下都能结束。