全新正版书籍,24小时发货,可开发票。
¥ 68 5.3折 ¥ 128 全新
库存6件
作者(挪) 汉斯.佩特.兰坦根(Hans Petter Langtangen) 著,张春元 刘万伟 毛晓光 陈立前 周会平 李暾 译
出版社清华大学出版社
ISBN9787302549437
出版时间2020-07
装帧平装
开本16开
定价128元
货号28987033
上书时间2024-12-19
计算机程序设计就是编程。本书以数学和自然科学为背景,使用Python作为编程语言讲授编程。Python语言兼有强大的问题表现力及非常干净、简单和紧凑的语法;Python容易学习,非常适合作为编程的入门语言;Python与MATLAB很像,做数学计算很方便;把Python与科学计算常用的其他编程语言(如FORTRAN、C和C )结合起来也很容易。
本书中的例子将编程与数学、物理学、生物学和金融应用结合起来。其中和数学内容关联密切的部分,假设读者在高中阶段已经掌握了一元微积分。同时,学习大学微积分课程肯定会对本书的学习有所帮助,好能够包含经典微积分和微积分数值计算两个方面的内容。另外,良好的高中物理学知识背景,可以加深读者对本书中许多例子的理解。
许多编程入门书籍的主要内容就是简单明了地列出编程语言的功能。然而,学习编程其实是学习程序员如何思考。本书主要侧重于思维过程训练: 因为编程是问题求解的技术,所以本书主要篇幅用在编程案例研究上,先把要求解的问题说清楚,然后研究如何写出求解的代码。新的句法结构和编程风格(所谓理论)也是通过实例引入的。本书特别关注了程序的校验和排错,这是数学计算软件非常麻烦的问题,因为其中往往混杂了不可避免的数值逼近误差和编程错误。
通过学习本书中的许多例子,作者希望读者能学会如何正确思考,从而以更快、更可靠的方式编写程序。记住,没有人可以只通过阅读来学会编程——必须亲自做大量解决问题的习题。因此,本书包括各种习题类型: 现有例题的修改、全新的习题或调试给定的程序。
为配合本书的学习,作者建议使用Python 2.7。第5章到第9章以及附录A到附录E,需要用到Python的NumPy和Matplotlib两个包,好还有IPython和SciTools两个包,附录G需要用Cython。本书中要用的其他软件包是nose和SymPy。H.1节提供了有关如何访问Python和相关软件包的更多信息。
本书的网页地址是http://hplgit.github.com/sciproprimer,其中包含书上所有例子的程序以及在各种平台上安装软件的信息。
Python版本2还是3?
Python程序员中的一个常见问题是在Python 2或Python 3之间进行选择,编写本书时就是在2.7版本和3.5版本之间进行选择。通常建议使用Python 3,因为这是将来要进一步开发的版本。问题是很多有用的Python数学软件现在还没有移植到Python 3上。因此,Python 2.7是受欢迎的用于科学计算的版本,所以本书选用了2.7版本。
对于用Python编程的软件开发人员,如果编写的程序有在两个版本上都能运行的需求,广泛使用的策略是开发Python 2和Python 3的通用版本。很容易首先编写一个面向Python 2.7的程序,然后通过运行futurize实现程序自动转换。在4.10节通过一个简单实例演示了这个过程。
本书的Python 2.7代码完全采用Python 3可移植的句法结构,使代码尽可能接近等效的Python 3代码。任何时候都可以运行futurize来查看这些Python 2.7版代码与对应的Python 3.5版本之间的差异。
本书主要内容
第1章是数学公式的计算,通过实例引入变量、对象、模块和文本格式。第2章介绍使用while和for循环来编程,引入列表和嵌套列表。第3章讨论编程中的两个基本概念: 函数和ifelse结构。
第4章研究程序如何输入数据并处理输入中的错误。第5章介绍数组和数组计算(包括向量化),如何使用数组绘制y=f(x)曲线和制作曲线动画。前5章中的许多例子都是密切相关的。通常,第1章中的公式用于在第2章中生成数字表格,然后将公式封装在第3章的函数中。在第4章中从命令行获取函数的输入,并检查输入的有效性。第5章把公式显示为图形。学完第1章到第5章,读者应该已经有了足够的解决数学问题的编程知识,这就是所谓“MATLAB风格”编程。
第6章解释如何使用字典和字符串,特别是处理文件中的文本数据,将提取的信息存储在恰当的数据结构中。第7章介绍类编程,包括用于数学计算的用户定义类型(重载运算符)。第8章通过游戏应用和随机游走讨论随机数和统计计算。第9章的主题是面向对象编程,主要是类层次结构和继承,核心案例是构建一个工具包,用于数值微分、积分和图形学计算。
附录A通过数列和差分方程引入数学建模。附录A中只使用了第1章到第5章的编程概念,目的是巩固编程基础知识并将之用于数学问题求解。通过差分方程这种简单的方法引入了一些重要的数学专题: 牛顿迭代法、泰勒级数、反函数和动态系统。
附录B涉及函数的网格化(离散化)表示、数值微分和数值积分。附录C中提供常微分方程数值计算的入门知识。附录D介绍如何完整地处理一个物理项目,包括使用数学建模、数值方法和第1章到第5章的基本编程元素。该项目是计算科学中问题求解的一个好实例,需要综合运用物理学、数学、数值计算和计算机科学的知识。
附录E的主题是编写解常微分方程的软件,同时使用了基于函数和面向对象两种编程方法。附录E汇集了本书中很多物理应用和微分方程的内容。
科学计算基础编程——Python版(第五版)
附录F专门讨论编程调试的技巧,调试就是广义的问题求解。附录G中Cython的例子是通过将代码迁移到C来加速Python中的数值计算。后的附录H处理各种高级技术主题。
虽然本书的大部分例子和习题都很短,但是许多习题是相关的,并且一起形成更大的作业。例如,傅里叶级数(习题3.21、习题4.21、习题4.22、习题5.41、习题5.42)、数值积分(习题3.11、习题3.12、习题5.49、习题5.50、习题A.12)、泰勒级数(习题3.37、习题5.32、习题5.39、习题A.14、习题A.15、习题7.23)、分段常函数(习题3.29~习题3.33、习题5.34、习题5.47、习题5.48、习题7.19~习题7.21)、反函数(习题E.17~习题E.20)、物体下落(习题E.8、习题E.9、习题E.38、习题E.39)、人口增长的振荡(习题A.19、习题A.21、习题A.22、习题A.23)、流行病建模(习题E.41~习题E.48)、优化和财务(习题A.24、习题8.42、习题8.43)、统计和概率(习题4.24、习题4.25、习题8.23、习题8.24)、风险游戏(习题8.8~习题8.14)、随机漫步和统计物理(习题8.32~习题8.40)、噪声数据分析(习题8.44~习题8.46)、数值方法(习题5.25~习题5.27、习题7.8、习题7.9、习题A.9、习题7.22、习题9.15~习题9.17、习题E.30~习题E.37)、制作微积分计算器(习题7.34、习题9.18、习题9.19)以及创建一个模拟振动工程系统工具包(习题E.50~习题E55)。
第1~9章和附录A~E从2007年开始成为奥斯陆大学本科生学期“科学编程”课程(INF1100,10学分)的核心。
第5版与第4版的变化
第4版有实质性变化,第5版主要是调整巩固。改正了一些印刷错误,文字和习题也得到了改善。重点突出单元测试和测试功能,特别是在习题中比以前版本更强化。通过SymPy的支持,更大地扩展了符号计算的使用,并在全书中与数值计算进行了整合。现在所有的类都是新样式的,不再是以前版本的旧式/经典的样式。Matplotlib上的示例不再使用pylab模块,但为了减小在Python和MATLAB之间转换的难度,pyplot模块和“MATLAB风格”的语法还继续使用。闭包的概念比在早期版本中更加明晰(见第5版7.1.7节),闭包是一种快捷的流行结构,在Python的科学计算社区里广泛使用。第5版还讨论了Python 2和Python 3之间的差异,演示如何使用future模块编写在两个版本下均可运行的代码。
第5版中重要的新内容在第5章的后部分,关于高性能计算、线性代数和标量/向量场的可视化。虽然这些内容在本书的其他部分没有使用,还是有许多读者为了以后的工作需要学习这些基本方法,包括从单个变量到两个变量或从向量到矩阵,或者在解决更高级问题时使用本书作为编程参考。第5章中的这些新内容是和yvind Ryan博士联合编写的。
致谢
本书源于我和同事Aslak Tveito有启发的讨论,他编写了本书的附录B和附录C。本书的立项和大学相关课程的建设都源于Aslak在2007年的热情投入,非常感谢Aslak对本书的持续支持,也给我注入了持续的动力。早期的另一个重要贡献者是Ilmar Wilbers,他在协助本书立项和建立奥斯陆大学INF1100课程上做了很多工作。我觉得如果没有Ilmar解决无数的技术问题,本书第1版可能永远不会付梓。特别感谢Johannes H. Ring,当初为了应付Python麻烦不断的绘图功能,Johannes开发了Easyviz图形工具,后来他又维护了与本书相关的软件。
Loyce Adams教授通读了全书,做了所有习题,发现了一些错误,并提出了许多改进建议,非常感谢她的贡献。Helmut Büch近非常深入仔细地通读了第1章到第6章,测试了软件,发现了一些印刷错误,并提出了很多批评建议,使本书有了很多重大改进,非常感谢他在第4版筹备期间付出的努力和热情。第5版从Hakki Eres对第4版的仔细检查中获益良多,他发现了一些印刷错误和代码错误,其中一些错误甚至回溯到了第1版。
特别感谢Geir Kjetil Sandve,他是3.3节、6.5节、8.3.4节和9.5节中生物信息学计算示例的主要作者,此外还有Sveinung Gundersen、Ksenia Khelik、Halfdan Rydbeck和Kai Trengereid的贡献。感激yvind Ryan在第5章中完成的有关线性代数和标量/向量场可视化的工作。
有几位同事对文字、习题和相关的软件的改进提出了建议。尤其要提到Ingrid Eide、Stle Zerener Haugnss、Kristian Hiorth、Timothy Keough、Arve Knudsen、Espen Kristensen、Tobias Vidarssnn Langhoff、Martin Vonheim Larsen、Kine Veronica Lund、Solveig Masvie、Hkon Mller、Rebekka Mrken、Mathias Nedreb、Marit Sandstad、Helene Norheim Semmerud、Lars Storjord、Fredrik Heffer Valdmanis和Torkil Vederhus。非常感谢Hakon Adler,他仔细阅读了早期的各种版本的手稿。非常感谢Fred Espen Bent教授、rnulf Borgan教授、Geir Dahl教授、Knut Mrken教授和Geir Pedersen教授,他们从各自的应用领域设计了一组精彩的习题。还要感谢好友Jan Olav Langseth给本书设计的封面。
奥斯陆大学有一个非常全面而成功的教学改革计划——科学教育中的计算(Computing in Science Education,CSE),本书及相关课程是其中的一部分。教学改革计划的目标是把本科所有使用数学模型的自然科学课程和计算机编程整合起来。本书为后续课程中应用计算机进行问题求解奠定了技术基础。与这些在后面推动这一改革的同事在一起工作是非常鼓舞人心的,尤其是Morten HjorthJensen教授、Anders MaltheSrenssen教授、Knut Mrken教授和Arnt Inge Vistnes教授。
非常感谢Springer出版系统,特别是Martin Peters、ThanhHa Le Thi、Ruth Allewelt、Peggy GlauchRuge、Nadja Kroke、Thomas Schmidt、Patrick Waltemate、Donatas Akmanavicius和Yvonne Schlatter多年来出色的协助,确保了这本书所有版本的顺利和快速出版。
奥斯陆
2016年2月
本书通过数学和自然科学中的计算例子来讲授计算机程序设计。选择语法简单紧凑且功能强大的Python语言作为编程语言。本书关注于问题的计算求解过程,而不是程序语言细节,书中使用了大量的案例,并专注问题定义、分析和程序求解以及程序正确性验证。通过本书的学习,读者将能使用程序员的方式进行思考,并能写出正确优质的程序。
张春元,国防科技大学计算机学院副院长,博士,教授,博士生导师,计算机体系结构专家,学术带头人,著有《计算机体系结构》等教材。 毛晓光,国防科技大学计算机学院计算机系副主任,博士,教授,博士生导师,著有《离散数学》等教材。
目录
第1章公式的计算1
1.1编程计算: 个公式1
1.1.1用程序作计算器1
1.1.2程序和编程2
1.1.3编写程序的工具2
1.1.4个Python程序3
1.1.5输入程序文本时的警告3
1.1.6验证结果4
1.1.7变量4
1.1.8变量名4
1.1.9Python中的保留字5
1.1.10注释5
1.1.11指定文字和数字的输出格式6
1.2计算机专业术语9
1.3计算另一个公式: 摄氏度与华氏度的转换12
1.3.1容易被忽略的错误: 整数除法12
1.3.2Python中的对象13
1.3.3避免整数除法14
1.3.4算术运算符和优先级15
1.4求标准数学函数的值15
1.4.1示例: 使用平方根函数15
1.4.2示例: 计算sinh x17
1.4.3初窥舍入误差17
1.5交互式计算18
1.5.1使用Python shell18
1.5.2类型转换19
1.5.3IPython20
1.6复数23
1.6.1Python中的复数运算23
1.6.2Python中的复函数24
1.6.3实数函数与复数函数的统一处理25
1.7符号计算26
1.7.1基本的微分和积分26
1.7.2方程求解27
1.7.3泰勒级数和其他28
1.8本章小结28
1.8.1本章主题28
1.8.2示例: 球的轨迹31
1.8.3关于本书中的排版约定32
1.9习题33
第2章循环与列表41
2.1while循环41
2.1.1直接的方法41
2.1.2while循环42
2.1.3布尔表达式43
2.1.4示例: 累加求和45
2.2列表46
2.2.1列表的基本操作46
2.2.2for循环48
2.3列表和循环的替代实现50
2.3.1用while循环实现for循环50
2.3.2Range结构50
2.3.3用for循环对列表索引进行迭代51
2.3.4修改列表元素52
2.3.5列表推导式53
2.3.6同时遍历多个列表53
2.4嵌套列表54
2.4.1表格: “行”或“列”构成的列表54
2.4.2打印对象55
2.4.3提取子列表56
2.4.4遍历嵌套列表58
2.5元组60
2.6本章小结61
2.6.1本章主题61
2.6.2示例: 分析列表数据64
2.6.3如何找到更多的Python信息66
2.7习题67
第3章函数与分支74
3.1函数74
3.1.1数学函数作为Python函数74
3.1.2了解程序执行过程75
3.1.3局部变量和全局变量76
3.1.4多参数78
3.1.5使用函数参数还是全局变量79
3.1.6非数学函数79
3.1.7返回多个值80
3.1.8求和81
3.1.9无返回值82
3.1.10关键字参数84
3.1.11文档字符串85
3.1.12函数作为函数的参数87
3.1.13主程序89
3.1.14lambda函数89
3.2分支90
3.2.1ifelse语句90
3.2.2内嵌if语句92
3.3混合循环、分支、函数的生物信息学应用示例93
3.3.1DNA字符串中的字母计数93
3.3.2效率评估96
3.3.3验证实现98
3.4本章小结99
3.4.1本章主题99
3.4.2示例: 数值积分100
3.5习题104
第4章用户输入和错误管理120
4.1提出问题和读入应答120
4.2从命令行读取121
4.2.1在命令行上提供输入121
4.2.2可变数量的命令行参数122
4.2.3关于命令行参数的进一步理解123
4.3将用户文本转换为活跃对象123
4.3.1神奇的eval函数124
4.3.2神奇的exec函数127
4.3.3将字符串表达式转换为函数129
4.4命令行上的参数名值对130
4.4.1argparse模块的基本用法130
4.4.2将数学表达式作为值131
4.5从文件中读取数据133
4.5.1逐行读取文件134
4.5.2其他读取文件的方法135
4.5.3读取文本和数字的混合文件137
4.6将数据写入文件138
4.6.1示例: 将表格写入文件139
4.6.2标准输入和输出作为文件对象140
4.6.3文件到底是什么142
4.7错误处理144
4.7.1异常处理145
4.7.2产生异常148
4.8图形化的用户界面150
4.9制作模块151
4.9.1示例: 银行存款利息152
4.9.2将函数收集在模块文件中153
4.9.3测试块153
4.9.4验证模块代码155
4.9.5获取输入数据156
4.9.6模块中的文档字符串158
4.9.7使用模块158
4.9.8发布模块161
4.9.9使软件在互联网上可用161
4.10Python 2和Python 3的代码162
4.10.1Python 2和Python 3的基本差异162
4.10.2将Python 2代码转换为Python 3代码163
4.11本章小结165
4.11.1本章主题165
4.11.2示例: 二分查找168
4.12习题175
第5章数组计算和曲线绘图182
5.1向量182
5.1.1向量的概念182
5.1.2向量的数学运算183
5.1.3向量算术和向量函数184
5.2Python程序中的数组185
5.2.1用列表来收集函数数据185
5.2.2Numerical Python的数组基础186
5.2.3计算坐标和函数值187
5.2.4向量化188
5.3绘制函数曲线190
5.3.1用Matplotlib实现MATLAB风格的绘图190
5.3.2Matplotlib和Pyplot前缀194
5.3.3SciTools和Easyviz195
5.3.4制作动画200
5.3.5制作视频204
5.3.6用文本字符绘制曲线205
5.4绘制高难度函数206
5.4.1分段定义函数206
5.4.2快速变化函数208
5.5更高级的函数向量化209
5.5.1StringFunction对象向量化209
— 没有更多了 —
以下为对购买帮助不大的评价