第1章 数值计算与计算机 1
1.1 计算机发展史与数值模式 1
1.2 计算机软件与数值模式比较 3
1.2.1 计算机软件和数值模式的特点 3
1.2.2 计算机软件与数值模式的发展 4
1.3 程序设计对计算的影响 9
1.3.1 计算方法对计算精度的影响 9
1.3.2 程序设计对计算精度的影响 10
1.3.3 程序设计对计算速度的影响 11
1.4 数值误差与科学预测 12
1.5 数值计算中值得注意的几个问题 13
1.6 本章小结 14
思考题 15
主要参考文献 15
第2章 数据储存格式变换和压缩 16
2.1 计算机中数的表示和运算 16
2.1.1 计算机内数的表示方法 16
2.1.2 原码、反码和补码 18
2.1.3 位运算方法 18
2.1.4 Little-Endian Big-Endian 20
2.1.5 不同系统下数据格式变换 20
2.2 几种常见的数据压缩算法 22
2.2.1 行程编码 23
2.2.2 Huffman编码 23
2.2.3 算术编码 23
2.2.4 LZ系列算法 24
2.2.5 整数编码 28
2.3 LZSS压缩实例 29
2.3.1 环形字符串缓冲区 29
2.3.2 二叉查找树的应用 30
2.3.3 LZSS算法的实现方法 30
2.4 本章小结 35
思考题 35
主要参考文献 36
第3章 几种自我描述格式文件 37
3.1 文件概述 37
3.1.1 文件的组织结构 37
3.1.2 文件的存取方式 38
3.1.3 文件的访问方式 38
3.2 GRIB文件及其使用工具 39
3.2.1 GRIB2的格式 39
3.2.2 GRIB2压缩方法 41
3.2.3 GRIB2格式数据访问 42
3.3 HDF文件及其使用工具 44
3.3.1 HDF5文件 44
3.3.2 HDF5工具软件 45
3.3.3 HDF5库简介 46
3.3.4 使用HDF5库的实例 47
3.4 NetCDF文件及其使用工具 50
3.4.1 NetCDF文件 51
3.4.2 NetCDF工具软件 52
3.4.3 NetCDF库简介 52
3.4.4 使用NetCDF库的实例 53
3.5 并行HDF和NetCDF库的接口简介 57
3.6 本章小结 58
思考题 58
主要参考文献 59
第4章 无微分算法及其应用实例 60
4.1 方程求解算法 60
4.1.1 使用反拉格朗日多项式求解方程 60
4.1.2 二分法算法 62
4.1.3 试位法算法 62
4.1.4 雷德斯算法 63
4.1.5 反二次插值试位法算法 65
4.2 单元函数的极值搜寻计算 66
4.2.1 黄金分割搜寻 67
4.2.2 斐波那契搜寻 68
4.3 多元函数的极值搜寻计算 70
4.3.1 Nelder-Mead算法 70
4.3.2 多元方向设置算法 78
4.3.3 现代随机优化算法 82
4.4 无微分算法的应用实例 87
4.5 本章小结 88
思考题 89
主要参考文献 89
第5章 高精度计算程序设计 91
5.1 高精度数的基本表示方法 91
5.1.1 高精度数的储存形式 91
5.1.2 高精度整数与小数 92
5.1.3 数字存放顺序 92
5.1.4 数的进制设置 92
5.1.5 数的输入与输出转换 93
5.2 高精度加法和减法 94
5.3 高精度乘法的直接计算 98
5.3.1 高精度乘法计算基础 99
5.3.2 高精度整数乘法 99
5.3.3 高精度浮点数乘法 101
5.4 使用FFT进行高精度乘法的计算 103
5.4.1 快速傅里叶变换原理 103
5.4.2 使用FFT进行多项式乘法的计算原理 106
5.4.3 FFT程序设计 107
5.4.4 使用FFT进行长整数乘法计算的实例 109
5.5 高精度除法 110
5.5.1 直接进行高精度除法计算 110
5.5.2 高精度除法快速计算 111
5.6 高精度乘方和开方 112
5.7 本章小结 113
思考题 113
主要参考文献 113
第6章 等值线图制作技术及程序设计 115
6.1 等值线标注字体和连线 115
6.1.1 点阵字体和矢量字体 115
6.1.2 作图连线方法 116
6.1.3 数字的矢量表示法 117
6.1.4 小数点和负号的表示法 119
6.2 等值线插值 119
6.2.1 插值点的判别 119
6.2.2 插值计算方法 119
6.2.3 插值过程和顺序 120
6.3 等值线生成法 121
6.3.1 追踪法 121
6.3.2 拼图法 123
6.4 等值线图绘制的基本设计 124
6.4.1 图形数据与图形显示 124
6.4.2 等值线标注 124
6.4.3 等值线生成控制 125
6.4.4 等值线平滑 126
6.4.5 等值线显示设计 128
6.5 等值线图填充 129
6.5.1 一般的图形填充方法 129
6.5.2 等值线图的填充方法 132
6.6 等值线作图的实例 134
6.7 等值线作图的应用 139
6.7.1 等值线科学应用 139
6.7.2 等值面积和体积的计算 140
6.7.3 等值线剖面图的绘制 140
6.8 本章小结 140
思考题 141
主要参考文献 141
第7章 字符串表达式匹配的程序设计 143
7.1 字符及转义 143
7.1.1 普通字符及其转义 143
7.1.2 特殊字符及其转义 144
7.2 正则表达式 145
7.2.1 单元符 145
7.2.2 定位符 146
7.2.3 限定符 146
7.3 通配符 147
7.3.1 常见的通配符 147
7.3.2 通配符与正则表达式的区别 148
7.4 字符串匹配过程中的问题 148
7.5 字符串匹配程序的设计方法 149
7.6 正则表达式匹配的编程实例 150
7.6.1 正则表达式字符串的解释 151
7.6.2 一个简单的正则表达式匹配程序 154
7.7 通配符匹配的编程实例 156
7.8 本章小结 159
思考题 160
主要参考文献 160
第8章 简单脚本运行程序的设计 161
8.1 解释程序的工作原理 161
8.1.1 解释程序的运行过程 161
8.1.2 解释程序工作环境的设计 162
8.2 解释程序设计的技术基础 163
8.2.1 脚本语言的关键字 164
8.2.2 控制语句分类 164
8.2.3 对脚本解释的方法 165
8.2.4 对单语句的规定 166
8.2.5 对程序块的处理方法 167
8.3 解释程序运行过程的初步设计 169
8.3.1 脚本的装载 169
8.3.2 脚本关键字的确定和关键字查寻表 170
8.3.3 脚本程序的主函数 171
8.3.4 脚本打印语句的解释方法 172
8.3.5 脚本函数的解释方法 173
8.4 利用递归原理设计解释程序 175
8.4.1 递归式解释的主控函数 175
8.4.2 递归式解释的用户自定义函数 176
8.4.3 递归式解释的循环控制 177
8.4.4 递归式解释的条件控制 179
8.5 利用堆栈原理设计解释程序 180
8.6 一个对脚本文件解释的实例 185
8.7 本章小结 187
思考题 188
主要参考文献 188
第9章 计算程序代码的优化设计 189
9.1 程序优化概述 189
9.1.1 程序优化层次 189
9.1.2 程序优化分类 190
9.2 程序可维护性的优化设计 190
9.3 程序代码优化的基本方法 191
9.3.1 删除冗余代码 191
9.3.2 提出公用子表达式 192
9.3.3 简化运算步骤 193
9.3.4 减小计算强度 194
9.4 程序代码结构的优化 196
9.4.1 变量的优化 197
9.4.2 表达式的优化 198
9.4.3 一般函数结构的优化 198
9.4.4 减小程序复杂度 200
9.4.5 降低数组维数 201
9.5 程序控制结构的优化 201
9.5.1 顺序结构的优化 201
9.5.2 选择结构的优化 202
9.5.3 循环结构的优化 208
9.6 内存使用的优化 213
9.7 与编译器或处理器相关的优化 215
9.7.1 使用修饰符 215
9.7.2 对字节对齐优化 217
9.7.3 数组下标排列及其优化 218
9.7.4 使用2的乘方数 221
9.7.5 合理分配寄存器 221
9.8 递归函数的优化 222
9.9 本章小结 225
思考题 226
主要参考文献 226
第10章 可复用计算程序的设计 227
10.1 可复用程序的设计概述 227
10.1.1 复用程序与设计可复用程序 227
10.1.2 影响程序可复用性的因素 228
10.1.3 通用程序与可复用程序 228
10.1.4 可复用程序的“手性”特点 229
10.2 “手掌型”可复用程序的设计 230
10.2.1 程序的封装 230
10.2.2 使用模板 231
10.2.3 使用共享环境 234
10.2.4 使用泛型 236
10.3 “掌指关节型”可复用程序的设计 237
10.3.1 代码替换 237
10.3.2 变量替换 240
10.3.3 函数调用接口覆盖 241
10.3.4 使用类型转换共享函数调用接口 245
10.3.5 共享I/O接口 247
10.4 “手指型”可复用程序的设计 249
10.4.1 “手指型”与“手掌型”可复用程序设计的比较 249
10.4.2 使用相对性对象 249
10.4.3 使用情景函数 250
10.5 C++程序的复用机制 250
10.6 本章小结 252
思考题 253
主要参考文献 253
第11章 并行计算MPI程序设计基础 254
11.1 并行程序的设计基础 254
11.1.1 线程与进程 254
11.1.2 并行程序设计模型 255
11.1.3 并行计算的通信 257
11.1.4 并行程序的工作任务分解 257
11.1.5 并行计算的工作原理 258
11.2 MPI并行程序设计入门 259
11.3 MPI的基本通信操作 261
11.3.1 点对点通信(P2P) 261
11.3.2 集合通信 262
11.3.3 通信阻塞与同步 267
11.4 MPI进程组和通信子 268
11.4.1 进程组管理 268
11.4.2 通信集管理 270
11.4.3 通信分组应用实例 271
11.5 进程拓扑结构 272
11.5.1 笛卡儿拓扑结构 272
11.5.2 图拓扑结构 276
11.5.3 进程拓扑应用实例 277
11.6 派生数据类型 279
11.6.1 数据类型查询函数 279
11.6.2 新类型的构建 280
11.6.3 提交和释放 282
11.6.4 派生数据类型应用实例 282
11.7 本章小结 284
思考题 284
主要参考文献 285
第12章 数值计算的混合编程 286
12.1 混合编程的实现方法 286
12.1.1 结合式的连接方法 286
12.1.2 调用式连接的方法 287
12.1.3 中介式连接的方法 288
12.2 Fortran与C/C++语言的混合编程 289
12.2.1 Fortran与C/C++比较 290
12.2.2 Fortran与C/C+混合编程的简单实例 291
12.2.3 Fortran与C/C++程序之间的参数传递方法 296
12.2.4 通过库文件进行Fortran C/C++的混合编程 300
12.3 低版本与高版本语言的混合编程 303
12.3.1 C与C++间的混合编程 303
12.3.2 F77与F90/95间的混合编程 305
12.4 脚本与计算程序的混合编程 306
12.4.1 计算作业自动提交脚本的设计 306
12.4.2 绘图程序与计算程序的混合编程 308
12.5 本章小结 311
思考题 312
主要参考文献 312
第13章 UNIX/Linux系统下计算的辅助编程 313
13.1 文件和目录管理操作 313
13.1.1 system()函数 313
13.1.2 文件和目录管理函数 314
13.1.3 文件的遍历查找 319
13.2 编写一个在Xnix系统下运行的服务程序 320
13.3 在Xnix系统下建立回收站 326
13.4 SSH自动登录 328
13.4.1 公钥与私钥的设置方法 328
13.4.2 使用expect的方法 330
13.5 本章小结 330
思考题 331
主要参考文献 331