
出版社: 科学
原售价: 35.00
折扣价: 27.70
折扣购买: 数值计算方法实验教程
ISBN: 9787030687395
第1章 数值计算常用软件介绍
随着计算机的广泛应用和发展, 科学研究和工程技术领域都要用到各种数值计算方法, 如航天航空、地质勘探、汽车制造、桥梁设计、天气预报等. 当前热门的机器学习和数据挖掘领域也是以数值计算为基础. 数值计算方法主要研究使用计算机有效地求数学问题近似解的方法、过程以及相关理论, 即研究如何利用计算机更好地解决各种数学问题, 故数值计算方法成为数学与计算机之间的桥梁数值计算方法课程需要进行大量的上机实验, 目前比较流行的数值计算软件主要有 MATLAB、C/C++ 和 Python, 它们各自针对不同的需求而开发, 具有不同的特色和功能, 下面分别简单介绍.
1.1 MATLAB 语言简介
MATLAB 是 Matrix & Laboratory 两个词的组合, 意为矩阵实验室, 是美国MathWorks 公司出品的商业数学软件. MATLAB 的发展经历了漫长的过程, 初版 MATLAB 并不是编程语言, 只是一个简单的交互式矩阵计算器, 只能进行简单的矩阵运算, 如矩阵转置、计算行列式和特征值, 没有程序、工具箱和图形化等. MATLAB 最初是由莫勒 (Moler) 用 FORTRAN 语言编写的, 利特尔 (Little) 和班格特 (Bangert) 花了约一年半的时间用 C 语言重新编写了 MATLAB 并增加了一些新功能. 1984 年, 杰克 利特尔、克利夫 莫勒和史蒂夫 班格特合作成立了 MathWorks 公司, 正式把 MATLAB 推向市场.
MATLAB 的应用领域广泛, 包括数据分析、数值与符号计算、工程与科学绘图、控制系统设计、航天工业、汽车工业、生物医学工程、语音处理、图像与数字信号处理、财务、金融分析、建模仿真等. MATLAB 适合广大理工科大学生和教师、从事相关领域的工程人员和研究人员使用. MATLAB 是一种高级程序设计语言, 提供交互式程序设计环境, 可用于算法开发、数据可视化及数据分析等.MATLAB 的基本运算单元为矩阵, 其指令表达形式与数学、工程中常用的自然化语言表达形式十分相似, 用更直观的、符合人们思维习惯的代码, 代替了 C 语言和 FORTRAN 语言的冗长代码, 其优势在于:
1) 语言简洁紧凑, 使用方便灵活, 库函数极其丰富. MATLAB 程序书写形式自由, 利用其丰富的库函数, 压缩了一切不必要的编程工作.
2) MATLAB 语法限制不严格, 程序设计自由度大. 例如, 用户无须对矩阵进行预定义.
3) MATLAB 的图形功能强大. 在 FORTRAN 语言和 C 语言里, 绘图都很不容易, 但在 MATLAB 里, 数据的可视化非常简单. 同时, MATLAB 还具有较强的编辑图形界面的能力.
4) 功能强劲的工具箱是 MATLAB 的另一特色. MATLAB 工具箱可分为两类:功能性工具箱和学科性工具箱. 功能性工具箱主要用来扩充其符号计算功能、图示建模仿真功能以及与硬件实时交互功能等. 学科性工具箱能用于多种学科, 其专业性比较强, 目前深入到科学研究和工程计算的各个领域.
MATLAB 摆脱了传统非交互式程序设计语言 (如 C、FORTRAN) 的编辑模式, 将数值分析、矩阵计算、科学数据可视化等强大功能集成在一个易于使用的交互式环境中, 为众多科学领域进行有效数值计算提供了一种全面的解决方案.MATLAB 语言像 FORTRAN 和 C 语言一样规定了矩阵的算术运算符和关系运算符等运算符, 而且这些运算符大部分可以毫无改变地照搬到数组间的运算. 另外, 它不需定义数组的维数, 并给出矩阵函数、特殊矩阵专门的库函数, 使之在求解数值计算问题时显得大为简捷、高效、方便, 这是其他高级语言所不能比拟的.
MATLAB 支持的系统包括 Windows、LINUX 和 MacOS, 目前最新版本是MATLAB R2020a.
1.2 C/C++ 语言简介
C 语言在 20 世纪 70 年代初问世, 1978 年美国 AT&T 贝尔实验室正式发表了 C 语言. C 语言是当今最流行的程序设计语言之一, 集高级语言和低级语言的功能于一体. 在 C 语言的基础上, 1983 年贝尔实验室推出了 C++, 进一步扩充和完善了 C 语言. C++ 具体的实现则由不同的平台完成, 如今主流的平台有GCC/G++、LLVM/Clang 以及 MSVC(Microsoft 公司的编译平台) 等. 以上三种是 C++ 的编译器, 它们可以独立完成 C++ 的编译. 但是如果借助于 IDE(集成开发环境) 可以更高效地完成 C++ 的开发, 主要的 IDE 有 Microsoft 公司的Visual Studio、Apple 公司的 Xcode、JetBrains 的 Clion 等.
C/C++ 用户包括研究人员、工程人员、专业程序人员等. C 语言作为抽象化的通用程序设计语言, 广泛应用于底层开发. 由于兼容了 C 语言的特性, C++可以解决接近硬件层的程序, 同时结合了面向对象的功能, 所以 C++ 可以快速开发大型程序. C/C++ 理论上可以解决所有问题, 由于 C/C++ 更接近计算机底层的特性, 所以其有着极高的运行效率. 在设计数据量庞大或复杂度极高的问题时, C/C++ 的运算效率远高于其他语言. 由于 C/C++ 代码严谨度极高, 标准定义非常细致, 对各种情况几乎都有对应的规则, 同时开放程度高, 所以具有极大的灵活性, 可以解决各种各样其他语言解决不了的问题. 尽管 C/C++ 语言提供了许多低级处理的功能, 但仍然保持着跨平台的特性.
虽然 C/C++ 灵活, 但牺牲了高抽象特性, 所以其开发效率相对其他语言稍 显不足. 理论上所有的数值计算问题都可以用 C/C++ 解决, 相对于其他更高级语言如 Python、MATLAB 等, 抽象程度差的特点表现相对明显. 在解决同一数值问题时, C/C++ 在编写代码上要付出更多的工作量, 但总的来说 C/C++ 进行数值计算时的运算速度具有很大优势.
C++ 最新标准版本是 C++17 以及即将发布的 C++20. GCC/G++ 是当今使用最广泛的编译平台, 可运行在 UNIX、LINUX 和 MacOS 等绝大多数平台, 借助于 MingW 平台可运行在 Windows 上.
1.3 Python 语言简介
1989 年圣诞节期间, 荷兰人吉多 范罗苏姆 (Guido van Rossum) 为打发圣诞节的无趣开发了一种新的脚本解释程序 Python, 目前 Python 已成为最受欢迎的程序设计语言之一.
Python 的语法极其简洁, 保留字只有 33 个, 远远少于 C++ 的 62 个. 它摒弃使用大括号来划分代码段, 它使用代码缩进, 并且避免了很多处不必要的括号使用. 清晰划一的风格使得 Python 成为一门易读易维护的语言, 因此很快得到许多研究机构的青睐. Python 支持面向对象的编程技术, 十分便于维护; Python支持网络编程及多线程编程, 能构建大型应用程序或网站. 由于海量的第三方库支持, Python 在各个领域发挥着巨大的作用. 专业的计算机科学扩展库如著名的计算机视觉库 OpenCV、三维可视化库 VTK、医学图像处理库 ITK. 此外, Python 的运行不需要软件环境, 仅仅只需要解释器, 拥有解释器的操作系统都能运行 Python 代码, 因此具有极好的可移植性.
在科学计算领域, 首先会提及的是 MATLAB. 除了一些专业性很强的工具箱目前无法被替代外, MATLAB 大部分的常用功能都可以在 Python 中找到相应的扩展库. 许多工程上的科学计算软件包都提供了 Python 的调用接口, 如经典的NumPy、SciPy 和 Matplotlib. 其中, NumPy 库在矩阵运算方面进行了大量的优化, 提供了快速数组处理功能; SciPy 库包含数值计算的多种算法; Matplotlib 库提供了绘图功能, 能够将数据可视化. 由于 NumPy、SciPy、Matplotlib 库的支持, Python 能轻松处理海量数据, 广泛应用于人工智能、深度学习等领域. 世界上第一张黑洞照片便是用 Python 进行数据分析后还原出来的. 此外, Python 自带大整数运算优化以及运算符重载, 不需要第三方库的支持, 在数论、密码学等领域中拥有得天独厚的优势.
Python 适用于 Windows、LINUX/UNIX 和 MacOS 等多种平台, 完全免费并且开放源码, 最新版本是 3.9.0 Beta 3 测试版本, 稳定版本为 3.8.
第2章非线性方程求根
2.1 学习指导
2.1.1 重点
1. 根的概念
给定非线性方程 f(x) = 0, 如果有 x. 使得 f(x.) = 0, 则称 x. 为 f(x) = 0 的根或 f(x) 的零点. 掌握单根和重根的定义及有关非线性方程的重要结论.
2. 二分法
掌握二分法的基本原理、构造方法、算法步骤及收敛性定理; 掌握二分法的适用范围, 理解二分法的收敛速度及二分法的优缺点; 熟练二分法求多根的改进 及试位法的算法原理.
3. 简单迭代法
掌握简单迭代法的产生原理、迭代格式的构造、算法步骤及迭代法收敛性定理; 掌握简单迭代法的适用范围及该法的优缺点; 掌握艾特肯 (Aitken) 加速收敛法的构造.
4. 牛顿法
掌握牛顿 (Newton) 法的几何构造原理、牛顿法的迭代格式、收敛性定理及算法步骤; 掌握牛顿法的优缺点及常用改进方法:重根加速收敛法、割线法、牛顿 下山法.
2.1.2 难点
了解压缩映射原理, 用于简单迭代法的收敛性分析; 理解牛顿法收敛性判定; 了解迭代法收敛的概念以及简单的判定方法.
2.2 实验指导
2.2.1 实验目的
掌握常用的求非线性方程近似根的数值方法, 用所学方法求非线性方程满足指定精度要求的数值解, 比较各种方法的异同点并进行收敛性分析.
2.2.2 实验内容
1) 编程实现二分法寻找非线性方程 f(x) = 0 的多根.
2) 编程实现艾特肯方法求解非线性方程 f(x) = 0 的根, 以加速简单迭代法的收敛.
3) 编程实现牛顿法求解非线性方程 f(x) = 0 的根.
2.2.3 算法分析
迭代法是求非线性方程近似根的一种常用算法设计方法, 不断地用变量的旧值递推新值, 二分法和牛顿法也属于迭代法. 构造任何迭代法, 需处理好以下三个方面:
(1) 确定迭代变量并赋初值. 在迭代过程中, 至少存在一个直接或间接的变量, 不断由旧值推出新值.
(2) 建立迭代公式. 如何从迭代变量的前一个值推出下一个值, 这是解决迭代 问题的关键.
(3) 确定迭代终止条件. 求解非线性方程的根一般设置三个迭代终止条件:
a. 指定精度 ε1 > 0. 若 |f(x)| > ε1, 则继续迭代;
b. 指定精度 ε2 > 0. 若相邻迭代近似根的距离大于 ε2, 则继续迭代;
c. 设定最大迭代次数 N. 若执行次数超过 N 还不能满足精度要求, 终止迭代提示算法不收敛.
在具体使用迭代法求根时可能发生:
(1) 如果方程无解,