• 1. 软件的计算思维陈 文 伟(国防科技大学、海军陆战学院)1
    • 2. 目录1. 计算思维概念2. 软件计算思维概念3. 软件进化中的计算思维4. 数值计算的问题和解决方法 5. 信息系统的基础 6. 结束语2
    • 3. 1. 计算思维概念 计算思维(Computational Thinking)是2006年3 月,美国卡内基· 梅隆大学计算机科学系主任周以真 教授提出的。 在美国计算机权威期刊《Communications of the ACM》杂志上给出的。 定义为,计算思维是运用计算机科学的基础概念进行问 题求解、系统设计、以及人类行为理解等涵盖计算机科学之广度的一系列思维活动。3
    • 4. 陈国良院士提倡“计算思维”用于计算机基础 教育。 现在“计算思维”成为热门词汇,有关论文与 书籍出了不少。在此,我从软件进化规律来讨论“计算思维”。4
    • 5. “思维”是人脑对事物的认识过程。通过思维使人的认识从感性到理性。一般是通过分析、判断和推理来认知事物的本质和真相。科学思维是对自然的本质、运行规律的探索、发现的认知过程。科学是对未知世界的客观规律的探索和发现。5
    • 6. “数学思维”是利用数学的观点(对数学符号、公式进行推演),去思考问题和解 决问题。“工程思维”是利用各种资源进行规划、 统筹,去完成一个工程项目的思维活动。 工程是一个实践活动,需要一步一步去完成具体的项目。6
    • 7. 计算思维采用了一般数学思维方法,工程思维 方法,以及人类的一般科学思维方法。 计算思维是建立在计算过程的能力和机器限制 之内的,不管这些过程是由人还是由机器执行 的。 现在,计算思维逐渐发展到脱离计算机,作为人的一种新思维方式,有人称为广义计算思维。7
    • 8. 计算思维是每个人的基本技能,应当能很好地应用于解决实际问题之中。计算思维的规律能帮助人更好编制计算机程序,使计算机做更复杂的工作。8
    • 9. 2. 软件计算思维概念软件的主体是程序。程序设计是用计算机语言来表达人们要完成的数据处理工作。由于计算机语言受硬件限制,人们编制程序时就要 按计算机语言的要求,改变人的常规思维方式, 建立起计算思维,利用计算思维来指导编写程序。我们来回顾冯· 诺依曼的两大贡献: 采用二进制并把程序存入计算机中!9
    • 10. 2.1二进制程序(目标程序)人们在利用计算器或者算盘作计算时,是直接输入数据进行运算操作的,并给出结果。例如,68+73-56=85,数字和运算符是键入的,其操作过程(计算步骤)是在人的头脑中。能否把操作过程(程序)储存在机器中,让机器来自动执行这个操作过程(程序)呢?10
    • 11. 冯· 诺依曼设计的程序是,十进制的数用二进制的数代替进行运算。把所需运算的数据(包括已知数(68、73、 56)和未知数(后算出的85)),都放入指定的存储器中,即每个数给定一个存储单元。11
    • 12. 计算步骤即程序,用一系列指令组成。每条指令由操作码和数据地址码组成,表 示该操作码对数据地址码中的数据进行 运行操作。最早的机器语言程序就是由一串机器指令组成。12
    • 13. 操作码表示对数据运算和对程序控制的动作。地址码表示数据存放的地址或程序指令的存放地址。它们均用二进制数据表示,书写时用八进制 或十六进制(可以直接转换成二进制)。13
    • 14. 例如操作码:02 加法 05 取数 06 送数数据地址码:1001 x 1002 y 1003 空完成 x + y 的计算程序为: 3001 05 1001 3002 02 1002 3003 06 1003取 x 加 y 送结果其中3001-3003是存储程序的地址。 14
    • 15. 这里的程序完全用操作码和地址码表示,并都用二进制存入计算机中(程序存入计算机中)。这样的程序使操作(运算)不直接和数据发生关系,只和它的存储地址发生关系,程序和数据就分开了,这是一种间接关系。15
    • 16. 程序中只有指令和地址,这样的程序把运 算的复杂性隐藏起来了(运算的复杂性 体现在程序的长短上) 。程序本身变得既简单又便于存储。16
    • 17. 存储程序有一个很大的好处是,当存储数据的地 址中放好了数据后,计算机就能按程序指令的 顺序自动运行。这是计算机之前发明的用于计算的机器(如计算器和算盘等)都做不到的。这是冯· 诺依曼的很大的贡献!计算机叫做存储程序的计算机,原因在此。17
    • 18. 总结一下机器语言程序的特点:①在数据地址码中只放数据,不放运算符。运算符都在操作码中,即运算和数据是分开的;②指令中的操作码是对数据的地址进行操作,而不是直接对数据的操作。这是一种间接操作;③计算机在数据存储好后,能自动运行存储的程序。18
    • 19. 2.2 计算思维的硬件基础计算思维是使计算过程适应计算机要求,冯•诺依曼提出了计算机体系结构。注意:冯•诺依曼是个数学家,不是搞硬件的。他思考的是,机器如何来实现他设计的程序。他提出了实现程序的运行的体系结构。现在计算机已发展了70多年,该体系结构一直没有改变。19
    • 20. 20
    • 21. 计算机内存中既存储“数据”,还存储“指令(程 序)”。这里的指令表示是程序,它包括了机器指 令和数据地址。程序与数据是分开的。把运算和数据分开,这是不符合数学思维的。数学思维中的方程,是把运算(符号表示)和数据(已知数和未知数)紧密结合在一起的。21
    • 22. 例1 线代数方程组的表示数学思维中线代数方程组的表示形式如下。数学思维在解方程时,直接在方程式上进行求解。an1x1  an2x2  annxn  bna11x1  a12x2  an1xn  b1 a21x1  a22x2  a2nxn  b222
    • 23. a11 a12a a1n , x1 b1 , x b 在计算机中是不列出以上方程组的,而是用数组 形式表示出方程的系数和变量,即计算思维的 表示形式如下。    x2 b2        n  n   a2n   ann  a21 a21    n1 an223
    • 24. 它们可以存放在计算机中不同的地方,这便利同类 数据集中存储,方程求解体现在程序的指令操作 中。解方程时只对三个数组进行处理,最后得出xi值。线代数方程组的高斯主元素消去法是通过数组的行、 列指针对系数数组进行消元,把它变成单位距阵后,bi就是xi的解。即:24
    • 25. 0 0, 1 ’  x1 b1  , x b’    0   0 1  01 0      n  nx2 b2      25
    • 26. 计算机程序靠“指针”,在数组中找到指 定的数,靠“缓冲单元”存放最大元素,用它来除同行系数aij和bi。这种计算思维方式(利用指针i和j,通过循环,找到数组中所要的元素;利用“缓冲单元”存储运算中出现的中间数据)是不同于数学思维解方程的。26
    • 27. 例2 运输问题中位势方程的表示数学思维中位势方程为:ci+dj=Dij具体实例如下(其中未知数为ci,dj )。c2+d2=2;c3+d3=4;c2+d4=6;c1+d4=7;c3+d4=8;c3+d1=9。27
    • 28. 在计算机中也是不列出以上方程组的,而是用数组形式 表示出方程的变量和值,即表示形式如下。ci dj i j Dij2 2 23 3 42 4 61 4 73 4 83 1 90cict(i)100djdt(j)000028
    • 29. 方程的求解过程在数学思维中是隨机进行的。 因为,只有在方程中有一个未知数求出,另一个 未知数未求出时,方程才能求解,利用此方程 求出未求出另一个未知数。方程中二个未知数都未求出(此方程不能求解), 或者二个未知数都求出的方程(此方程不必求 解),就跳过此方程。29
    • 30. 在计算思维中,无法直接进行这种隨机选方程的求解,必须采用间接求解方法。首先,对未知数ci,dj 增加标记位,即ct(i)和dt(j),对已求出的变量记为1,对未求出的变 量记为0。上面实例中,有6个方程7个未知数,是一组无穷解。为此,假设c1=0,标志位ct(1)=1。30
    • 31. 求解方程时,在方程表中顺序检查各方程 的标记,符合要求时对此方程求解,不 符合要求时跳过此方程。多次循环就可以解出所有方程。这就是利用间接求解方法解决隨机选方程的求解(后面再讨论)。31
    • 32. 在高级语言中编制程序时,虽然不要求指定数据地址,但是,程序是先把所有数据,按《数据结构》要求列 出:变量、数组、文件等(放在程序的开头)。再用高级语言的语句写程序。语句是对数据的操作。通过编译程序把高级语言程序又变回到二进制程序!32
    • 33. 《数据结构》这门课,是计算机程序设计对数据存储 方式,新提出的需求说明! 如:数据有类型的不同;同类数据集中存放就有数组(一维、二维)的问题;运算的中间数据就有,队列与堆栈的区别; 中间数据缓冲区的设计等等。数据结构的设计好坏,直接影响计算机程序设计的优劣!33
    • 34. 3. 软件进化中的计算思维计算机软件的进化包括:3.1 数值计算的进化;3.2 数据存储的进化;3.3 计算机程序的进化等。34
    • 35. 3.1 数值计算的进化  初等函数 微积分运算解方程35
    • 36. (1) 加(+)是最基本运算 (2) 减(-)是利用减数的补数(求反加1),变减为加说明:负数是原码的补数。1)  ① 原码。数值的二进制。 ② 反码。二进制的各位取反(0变1,1变0)。 ③ 补码。反码的最低位上加1。 36
    • 37. (3)乘(×)是把乘变成累加 如:5×3=5+5+5,即5加3次(4)除(÷)是把除变成累减的次数, 如: 6÷3为6-3-3=0,减了2次,即商为237
    • 38. x x x x7x x x3(1)三角公式 (2)指数公式 3 5 sin x      1! 3! 5! 7! 2 ex 1    1! 2! 3! 2)初等函数 ← 初等函数的定义不是加減乘除,需要利用台劳级 数公式来计算的,即变成加减乘除运算.取级数的项数在于满足计算精度。 38
    • 39. f (x)  limf (x) n f(x)dx lim f(xk)xk1n f (x)dx  f (x )x,x0f(x) f(x0) xx0,f (x) f (x0) x x0b ax0bka k1变成(2)积分运算(求和)3)微积分运算 ← (1)微分运算(差分化)变成取△x 尽量小,就能满足误差精度 39
    • 40. d f (x)dx dx dx f (x2) f (x1)二阶导数的差分方程22d  df (x)  xf (x1) f (x0) x  xf (x2)2f (x1) f (x0) x2高阶导数类似处理。40
    • 41. 一阶和二阶导数的结点关系41
    • 42. u u un1 nu  x y2u ux偏微分方程的差分方程22j jn j 2n j1n j1u y说明:n表示y方向的增长,j表示x方向的增长 42
    • 43. 偏导数结点关系图 yxx43
    • 44. 偏微分方程边值问题的求解一般是在一个 区域内进行,区域中的点是未知数,区域边 界点是巳知数。 偏微分方程差分化后,经过整理就变成了 以区域中点的未知数形成的线代数方程组。 偏微分方程的求解就变成了线代数方程组的求解(加减乘除)44
    • 45. 汽轮机转子的网络划分45
    • 46. 微分方程数值计算的价值 传统的数学分析方法(解析求解-表达式推演,得 到的解是表达式)只能解决少数的较简单的和典型的微分方程的求解。微分方程的数值计算方法,无论是常系数还是变系数,是线性还是非线性,都能得到解决。解决的手段是差分方法(加减乘除),让计算机来完成。46
    • 47. 4)数值计算进化小结 (1)数值计算进化的创新现代数学在解方程时,经常有求不出解析解的矛盾问题。在求解方法上,把求解析解变换成求数值解,就不存在 不能求解的问题。 这种计算方法的改变用创新变换表示为: TI(现代数学的解析求解)= 计算数学的数值求解 47
    • 48. 例如,微分方程的求解,无论是常系数还 是变系数,是线性还是非线性,用数值 求解方法,它们都能求出解。计算机进行数值求解是数学史上一次最大的一次进化过程。48
    • 49. 数值计算的进化意义数值计算使数学真正走向实用化!科学家对自然现象推出的微分方程,通过数值计算,用于实际问题,达到了:用“计算”代替“实验”!这个意义非凡。 “实验”需要大量的经费和时间,而“计算”则化的代价要小很多。49
    • 50. 附注人们把科学研究的方式,规范为四个范式:第一范式为实验研究; 第二范式为理论推导; 第三范式为数值计算; 第四范式为大数据分析。50
    • 51. (2) 数值计算进化中的计算思维数值计算进化的创新主要是在扩大计算机的计算能力。 把不能在计算机上的运算,变换成能在计算机上运算。数值计算的计算思维是,通过回归变换把数学中的函数、 微积分、方程求解等非算术运算都要变换成算术运算 的加减乘除。具体表示为:TR(非算术运算的数学计算)= 加减乘除运算51
    • 52. 加、减、乘、除运算又回归到加法运算。在计算机硬件中,用加法器来完成加法运算。这是一种逆向的回归变换,化繁杂为简单、化困难为容易,使计算机能够有效地计算。52
    • 53. 3.2 数据存储的进化数据有结构化和非结构化的二种。结构化数据即十进制数据,需要将十进制转换成 二进制数据,就可以在计算机中存储和运行。非结构化数据如汉字、图像、声音、视频等其本 身是不能在计算机中存储的。这样非结构化数 据需要转换。53
    • 54. 1)结构化数据存储的进化结构化数据存储的进化可以概括为:变量 → 数组 → 线性表 → 堆栈和队列 →数据库 → 数据仓库54
    • 55. (1)变量  线性表变量:计算公式中的基本元素,分配一个存储地址。数组:相同类型的一维、二维数据集合,存储地址是连续的。线性表:不同类型数据的集中存储。如学生表中含:姓名、性别、年龄等不同 类型数据集合。55
    • 56. (2)堆栈与队列用于特殊运算而暂时存放的数组或线性表堆栈:对进栈的数据采用后进先出的处理方式,如对急诊病人的处理。队列:对进队的数据采用先进先出的处理方式,如对一般病人的处理。56
    • 57. (3)数据库通过数据库管理系统管理的数据文件。数据库管理系统(数据库语言)的主要功能为:①建立数据库描述数据库的结构并输入数据。②管理数据库控制数据库系统的运行;进行数据的检索、插入、删除和修改的操作;③维护数据库修改、更新数据库; 恢复故障的数据库;④数据通信完成数据的传输。⑤数据安全。设置一些限制,保证数据的安全。57
    • 58. 按决策主题重 新组合 (4)数据仓库 数据仓库是大量数据的集合,用于支持管理中决策制定 过程。 DB1 DBiDBnDW多维数据二维数据 58
    • 59. 数 数据仓库结构 高度综合数据层 轻度综合数据层 元当前基本数据层据 历史数据层 59
    • 60. 数据库与数据仓库的比较数据库用于管理业务数据仓库用于决策支持60
    • 61. 数据库用于管理业务数据库存储当前的现状数据,用于管理业务(商业计算)。(1)不同的业务(人事、财务、设备等)需要建立不同的数据库。(2)随时间、业务的变化随时修改数据(3)数据库是共享的数据61
    • 62. 管理业务(商业计算)管理业务(商业计算)主要是利用数据库来完成 (1)对数据库的查询、浏览来掌握现状如:记录查找时“=”表示数值相等或字符相同(2)对数据库的处理是对数据库中记录的增加、删除、修改工作对记录编码用到“﹥、=”如:工资中加入奖金,减去房租。(3)对数据库的统计计算只用到初等运算 (  )62
    • 63. 数据仓库的用于决策支持数据仓库存储的数据包括:当前数据、历史数据和汇总数据。用于决策支持。(1)历史数据用于预测(2)从汇总数据的比较(不同角度)中发现问题(3)从祥细数据中找出原因63
    • 64. 数据库与数据仓库的对比 DB 数据 数据量小 代表当前数据 一次操作数据量小 可更新的 支持管理 DW 数据 数据量大(100 倍) 代表过去的数据 一次操作数据量大 不更新 支持决策64
    • 65. 数据仓库的决策支持利用汇总数据的比较来发现问题利用多维数据分析找出原因利用历史数据进行预测分析利用不同层次汇总数据(不同粒度数据)适应不同层 次管理人员的决策支持65
    • 66. 结构化数据存储的进化小结数组一般用于数值计算,数据库用于管理业务, 数据仓库用于决策支持。 计算机的数据存储量愈来愈大,数据种类也愈 来愈多,这样使计算机处理问题的能力也愈 来愈强。 数据存储是计算机重要组成部分,数据存储的 进化是计算机进化的一个大方面。 66
    • 67. 2)非结构化数据(多媒体)的转变非结构化数据(多媒体)本身是不能存入计算机的。 为了把它变成结构化数据存入计算机,需要对它作一个变换。这就必须把多媒体数据二值化(0,1表示, 不运算)。最早把计算机程序存入计算机中,就是把计算程序用 二进制程序来表示。后来为解决汉字和多媒体如何 存入计算机的矛盾问题,再次采用了用二值数据表 示汉字和多媒体,这是计算机的大进化,使计算机 进入了多媒体时代。67
    • 68. (1)汉字表示①英文字母、数字、标点符号等用ASCII码值表示如“A”的码值65,数字“0”的码值48。②汉字编码一个汉字在计算机中的内码占两个字节,第一个字节用于区号,第二个字节用于位号。汉字的形状是方塊体的多笔画的字,采用了二值数据 的点阵形式来表示。这使计算机就能存储汉字,并 能处理汉字。这使计算机的处理能力上升了一步。68
    • 69. (2)图像的表示图像看成点(像素)的集合,每个像素的颜色用三个字节(24位)表示。任何颜色由红、绿、蓝三色混合而成,三色各占一个字节,一个字节中各位的0或1的不同表示,构成了不同的颜色浓度。一幅图像在计算机中表示为一个长度惊人的0、1(二值数据)串。 图像用点阵数据表示,使计算 机就能存储图像,并能处理图像。从而使计算机 进入了多媒体时代。69
    • 70. (3)视频的表示视频是连续播放一系列图像。每幅图像称为帧。每秒播出帧的数目在24~30幅图像时,就是像电影一样的视频。由于视频数据量太大,一般采取MPEG压缩技术,相邻帧只记录前面帧的变化部分。 不记录前面帧的重复部分,就可以节省大 量的存储空间。70
    • 71. 3)非结构化数据进化的回归变换非结构化数据存入计算机是一个矛盾问题。只有通过二值化才能变成结构化数据存 入计算机。非结构化数据进化过程概括为:二进制程序 → 汉字的二值化→ 图像、声音、视频的二值化。71
    • 72. 非结构化数据进化的回归变换表示为: TR(多媒体数据)= 二值数据 这种变换也是逆向回归变换。解决了多媒体数据存入 计算机的矛盾问题,使计算机进入多媒体时代。 进化过程用创新变换表示为: TI(黑白计算机时代)= 多媒体计算机时代这种变换是正向变换。72
    • 73. 4) 数据存储进化中的计算思维结构化数据(十进制)的进化从变量到数组,到文件,到数据库,到数据仓库。它的进化中的计算思维是,数据量愈来愈大,数据类 型也更多。但是,它们都要回归到二进制数据在计 算机中运行。非结构化数据(程序、汉字、多媒体等)的计算思维是,在用了二值数据(0,1)表示后,才能在计算机中运行。多媒体数据的应用,使计算机从黑白计算机进化到了 多媒体计算机,极大地丰富了计算机的应用范围, 也使计算机处理问题的能力更强。73
    • 74. 数据是计算机解决实际问题的基础。在计算机中,数据和程序是分开来存储的。程序中的运算只跟数据的地址打交道, 这是计算思维的重要特点!数据存储是计算机重要组成部分,数据存 储的进化是计算机进化的一个大方面。74
    • 75. 3.3 计算机程序的进化计算机程序的进化可以概括为:二进制程序 → 汇编程序 → 高级语言程序→ 程序生成75
    • 76. 1) 二进制程序二进制程序也称机器语言程序,可直接在计算机上运行,目前我们称为目标程序。我国60年代的第一台计算机(电子管)103型 (仿苏联的M3),以及后来的104、109型等 多台计算机,提供的都是机器语言(二进制)。76
    • 77. 2) 汇编程序 汇编程序是将二进制(或八进制、十六进制)程 序中的数字用字母符号(助记符)代替。 使用汇编程序简化了繁琐的数字。 上例程序的汇编程序为:LDA x ADD y STA r取 x 加 y 送结果77
    • 78. 汇编程序便利书写,虽然程序中书写是变量x、y, 但是,汇编程序运行时还是要返回到二进制程序。 程序中的变量仍然要用它的地址单元来表示。 这时,变量的地址单元是由机器的解释程序来分配的。它不同于人编制的二进制程序,其变量的地址单元是程序员分配的。汇编程序通过解释程序返回到二进制程序。78
    • 79. 3)高级语言程序及编译 (1)高级语言程序高级语言程序是用接近自然语言和数学语言编写的程序。 它接近人们的习惯,便利非专业人员编写。高级语言程序种类很多: 完成数值计算的高级语言有:C、Pascal、ADA等; 完成数据库操作的高级语言有:Foxpro、Orecle等; 完成知识推理的高级语言有:Prolog、Lisp等。 高级语言程序要先对所有的数据元素(变量、数组等) 都要指定清楚,便利编译程序分配地址单元。高级语言程序仍然是对数据的间接操作。79
    • 80. (2)高级语言的程序结构高级语言的程序结构归纳为三种基本结构的组 合,这三种基本结构是:顺序、选择、循环。任何复杂的程序都是这三个基本结构的嵌套组 合,这种程序设计思想称为结构化程序设计。它使程序的运算能力提高了一大步。80
    • 81. 进化过程表示为:“顺序、选择、循环”结构 → 任何复杂的程序这种程序结构保证了程序的正确性。在“程序设计方法学”中给出了正确性的证明。它克服了二十世纪60年代的软件危机(程序长了(成百上千条)以后很难编译成功)。81
    • 82. (3)高级语言程序的编译高级语言程序同样要返回到二进制程序,这就要利用编译程序编译程序包括词法分析、语法分析、代码生成。它的技术原理相同于人工智能中的专家系统。 即利用文法(知识)对程序中的语句进行归约(反向推理)或推导(正向推理),既要检查语句是否合符文法,又要将语句编译成中间语言或机器语言。82
    • 83. 计算机程序的本质还是二进制程序。转换过程如下:源程序 →(编译程序)→ 二进制程序(目标程序)用回归变换表示为:TR(源程序)= 二进制程序83
    • 84. (4)表达式的数学思维与计算思维的差异表达式的数学思维要求,计算时要按照符号优先级规定:先乘除,后加减,括号优先。程序的计算思维,不能按此规定进行,因为不能 用“顺序、选择、循环”结构的方式编制程序 来。84
    • 85. 表达式的的计算思维,采用了波兰逻辑学家J.Lukasiewicz 1951年提出的逻辑运算无括号的记法:(1)前缀表达式—波兰式; (2)后缀表达式—逆波兰式。它将人习惯的中缀表达式变成后缀表达的逆波兰式。逆波兰式把表达式中的括号去掉了,把加减乘除的 优先级别变成了前后顺序关系,这就适合计算机 的顺序处理。85
    • 86. 例如:u*v+p/q → uv*pq/+a * (b+c) → abc+ *在“编译程序”书中,将中缀表达式变成后缀表达的逆波兰式,占了很大的篇幅。一般采用递归子程序的方法或者利用一个符号栈来完成这种转变。86
    • 87. 表达式的数学思维与计算思维差距甚远!把数学思维的表达式变成计算思维的表达式,是编译程序中最复杂的部分。87
    • 88. 4)计算机程序进化小结计算机程序的进化主要是从二进制程序到高级语言程序。高级语言的优点体现在:(1)高级语言便利了程序的编写;(2)高级语言的计算思维是,程序结构采用“顺序、选择、循环”作为基本结构。复杂的程序采用三个 基本结构的嵌套组合。这样,既规范了计算机程序的设计思想,又保证了程序的正确性。88
    • 89. (3)将很多标准的程序段(如初等函数子程序等),通过连接程序直接嵌入到用户程序中, 极大地简化了编程度的烦琐工作,也扩充了计 算机的应用范围;(4)高级语言的应用促进了新语言的出现:面向对象语言、数据库语言、网络编程语言以及第四代语言(程序生成)等陆续出现。89
    • 90. 计算机程序进化中的计算思维,是采用了回归变换,表示为:TR1(对数据的操作)= 对数据的地址操作; TR2(高级语言程序)= 二进制程序;TR3(任何复杂的程序)= 顺序、选择、循环的嵌套组合;TR4(中缀表达式)= 逆波兰式。90
    • 91. 这些回归变换是化繁为简、化难为易的逆向变换。计算机程序的原理仍然很简单,但其功能却大大提高了。从本质来说就是,把数学思维变为计算思维91
    • 92. 4.数值计算的问题和解决方法4.1 程序编制正确,运行结果错误 1) 误差的积累产生的错误 2) 出现死循环3) 计算公式中隐含的不合理4.2 间接计算法1) 二进制程序采用了间接计算法2) 方程组的随机求解问题的间接求解法92
    • 93. 4.1 程序编制正确,运行结果错误程序运行的错误会严重地打击人的积极性,很多人从此望而却步。编程序要求人们养成沉着、耐心的良好习惯!编出的程序一般都要经过多次试算才能成功。一般采取的方法是分段查错,必要时进行人工手算(按照程序步骤计算)。我通过手算发现了如下几种情况。93
    • 94. 1) 误差的积累产生的错误计算机上的计算都是有误差的近似计算(由字长决定的)。当小数点的位置取得较少时(如取小数点后两位数),误差的积累会向小数点方向传播。当误差积累到小数点前的个位数时,错误就会出现。表现为正数变成负数!例如,在物资分配数由正数变成负数,这是不合理的。解决的办法就是加大数据的精度(例如,将小数点后两位数加大为小数点后四位数),使误差积累不到小数点前的个位数。94
    • 95. 2) 出现死循环程序出现死循环,如何去查呢?同样利用 手算方法!手算很繁琐,但这是最有效 的方法。例如,在运输问题在求基本解时,若出现:非零解个数 < 行数 + 列数 - 1该情况就称为是退化现象,程序就会出现死循环。95
    • 96. 一般《运筹学》书中都不说明,误认为是个别现象。但在现实中是经常出现的,如何解决呢?一般书中更是没有提及。这里体现了数学思维的局限性!计算思维则要求一定要解决这个问题,把结果要算出来!这里体现了工程思维的特点!96
    • 97. 我们经过思考,唯一的办法是:需要把最后的“零解” 找到,把它加到非零解中,使非零解的个数满足等 式的要求,程序就不会出现死循环。这个“零解”不是一个隨便的零解。而是在找到倒数第二个非零解时,若所有的供应量为零,所有的销量也为零时,在距离矩阵中,还有一行或一列没有被划去,此行 (或列)与最后划去的列(或行)的交叉处,就是 我们需要的“零解”。97
    • 98. 这是我们通过实践去补充一般书中,数学思维被忽略的问题。这是计算思维的要求。计算思维要求和工程思维那样,一定要算出结果来!类似的问题还有,你不去解决它,程序就走不下去。 编程人员不是被动者(按给定的算法编程序),应该 是解决问题的主动者(能解决一般被忽略的问题)。这里要求程序员的计算思维除了有数学思维以外,还要有工程思维!98
    • 99. 3) 计算公式中隐含的不合理 有些公式中含有加权系数,它是人为给定的,在有些 问题中会帶来计算错误,即把正数变成负数。例如,在物资分配中,当总供应量小于总申请量(△S) 时,需要对申请单位进行削减。 各申请单位设置了一个优先级别w(p)(p=1、2、 3、4四个级别),分配时先满足级别高的单位(如 p=1级)。 其它级别单位用它的申请量SQ(p)減去加权削减量 δ(p),作为它的分配量FB(p)。 99
    • 100. 公式为:非一类p单位的加权w(p)申请数量(p=2、3、4)为:计算非一类单位的削减量:δ(P)=△S· (SQ(p)· w(p))/SP)非一类单位的分配数为:FB(p)=SQ(p)-δ(p)PSP= SQ(p) · w(p)100