《基于Python的建模和仿真》
3.4.3版
作者:Allen B. Downey
翻译:南开大学智能医学工程专业2018级、2019级学生
校订:刘畅
内容
- 前言
- 建模
- 共享单车
- 迭代建模
- 参数扫描
- 世界人口
- 增长建模
- 二次增长
- 预测
- 分析
- 案例学习
- 流行病学
- 优化
- 双参数扫描
- 分析
- 加热
- 混合
- 药物动力学
- 葡萄糖模型
- 案例学习
- 抛物体
- 空气阻力
- 2D中的抛物体
- 优化
- 旋转
- 转矩
- 案例学习
0 前言
0.1 建模可以教授吗?
建模的基本技巧和能力包括抽象、分析、仿真、校正;这些技巧和能力在工程学、自然科学、社会科学、医学等领域有着重要的作用。学生通常潜默移化学习这些技巧,不过在大多数学校,这些技巧并没有显性地教授,而且学生也没有得到必要的练习。这正是本书所希望解决的问题。
我们使用本书作为Olin学院(作者的大学)所有大学新生第一学期《建模和仿真》课程的教材。教学团队包括我的同事John Geddes、Mark Somerville,课程开始于2009年。
这是基于我们认为建模应当在所有课程中被显性地(明确地)早早地进行教学;这同样基于我们认为计算(编程)是该过程重要的组成部分。
如果学生只通过手算的数学分析,他们将只能进行少量简单物理系统分析,例如真空中抛物运动或者无摩擦滑块运动。
如果学生只是使用简单的模型,但这些模型并不能满足实际需求。例如在几乎所有的机械系统中,空气阻力和摩擦都是重要的因素;如果忽略它们,预测将是错误的,设计也无法工作。
在大多数大一新生的物理课程中,学生并没有进行模型使用的决定;有时候他们甚至没有意识到正在使用模型。我们的目的是教授完整的建模过程,并且提供学生必要练习的机会。
0.2 我需要多少编程的知识?
即使读者从未进行过编程,您也完全有能力阅读和理解本书,并且做相关的练习。我们将尽量解释清楚所需了解的概念,并且谨慎选择所介绍的术语(在初次使用时,明细定义)。如果您发现有术语没有定义,请让我得知。
如果您曾经进行过编程,您将很容易上手,不过可能会在一些地方感到不习惯;因为在本书中,我们采用了您可能没有遇到的方式介绍编程。
大部分编程的课程往往有两个问题:
- 自下而上的方式,从编程语言的基本特点开始,而后逐渐增添强大的工具。因此,学生通常从简单的任务(转换华氏摄氏温度)到真正有趣的工作,往往花费很长的时间。
- 通常没有主题上下文。学生并没有明确的目标学习编程,因此练习仅仅是不同专题的集合,学生对练习没有主动性。
在本书中,您将有一个明确的目标在头脑中进行编程:对真实(物理)系统进行仿真模拟;而且我们采用自上而下 的方式,也就是说我们将直接采用职业强度的数据结构和编程语言特点。具体而言,我们将使用以下Python库和工具:
- NumPy,基础数值计算(https://www.numpy.org)
- SciPy,科学计算(https://www.scipy.org)
- Matplotlib,可视化(https://matplotlib.org)
- Pandas,数据处理(https://pandas.pydata.org)
- SymPy,符号运算(https://www.sympy.org)
- Pint,量纲单位(https://pint.readthedocs.io)
- Jupyter,阅读、运行、开发代码(https://jupyter.org)
这些工具将帮您很快进行有趣的编程,但同时它们有一些缺点:它们可能很难使用,而且跟踪哪些库正在使用、以及它们之间如何交互,也很有难度。
为了缓解上述问题,我们创建提供一个数据库——modsim,它将方便上述工具的上手使用,并且提供一下额外的功能。
ModSim数据库一些功能就如同“辅助轮”;到一定程度后,您可能不再使用它,而直接使用相关的库;而有些功能您可能发现一直很有用,您将在全书练习中并在今后使用。
我们鼓励您阅读ModSim数据库代码,它们大部分并不复杂,而且可读性强。特别是如果您有一定的编程经验,您将在回顾我们的设计中得到一些收获。
0.3 我所需要的数学和科学知识?
我们假设您懂得微分和积分的基本概念,但并不需要掌握和记忆所有微积分的变换公式。如果您能够计算的 的微分以及 的积分,这便足够了。更重要的是,您需要理解诸如算术平均之类的概念;如果不完全理解,也没有关系,本书将会帮助您理解掌握相关概念。
您不需要了解微分方程的相关知识。
在科学方面,我们的课题涵盖不同的领域,包括人口统计学、流行病学、医学、热动力学、力学等。在大多数情况下,我们假设您并不了解熟悉这些领域。实际上建模的能力之一便是,学习一个新的领域足够的知识,开发模型并进行仿真。
具体在力学方面,我们假设您理解位移、速度、加速度之间的关系,熟悉牛顿运动定律,特别是第二定律。
以上便是我认为您所需的一切,如果您发现我们有任何遗漏,请告知我们。
0.4 开始
为了运行本书的列子和练习,您需要:
- 在您的电脑上安装Python以及相关的库。
- 将我们的文件拷贝在您的电脑。
- 运行Jupyter,加载含有代码和文档的notebook文件。
下面三部分将详细介绍以上三步的具体细节。我希望有更加容易的方式开始;很抱歉在您写第一个程序前,需要做很多工作;然而,磨刀不费砍柴功,请努力坚持!
0.5 安装Python
您的电脑上可能已经安装了Python,不过可能并不是最新的版本。使用本书中的代码,您需要Python3.6或以上的版本。即使您使用的是最新的版本,您也可能并不完全拥有我们所需的所有库。
您可能需要更新Python并安装所需的库,然而我强烈不推荐这种方式。如果您选择使用Anaconda(一种Python发行版,并且几乎包括本书所需的所有库),您将发现更加方便。
Anaconda在不同操作系统Linux、macOs、Windows均可使用。默认安装时,它将所有的文件放置在您的home文件夹,因此您并需不要管理员权限进行安装,并且如果您已经有一个版本的Python,Anaconda并不会删除或者修改它。
下载网址https://www.anacoda.com/download,下载您操作系统所对应的安装器并运行。您并不需要管理员权限进行安装,因此我们建议您使用一般用户运行安装器,而不是使用管理员或root用户权限。
我们同样建议您接收默认推荐的设置。对于Windows用户,您可以选择安装Visual Studio Code,这是一种交互式编程环境。您在本书的学习中并不会使用,不过您在其他的项目中可能会使用它。
通过默认安装,Anaconda将安装您所需要的绝大部分库或安装包,但仍有少量还需要您进行安装。一旦Anaconda安装结束,请打开命令行窗口。在macOs或Linux系统,您使用终端;在Windows系统,使用Anaconda Prompt程序(系统开始菜单中)。
运行下面的命令(可以复制、粘贴,避免错误):
conda install jupyterlab pandas seaborn sympy
conda install beautifulsoup4 lxml html5lib pytables
其中一些包可能已经安装了。安装Pint:
conda install -c conda-forge pint
安装ModSim库,运行:
pip install modsimpy
以上便是您安装所需的一切。
0.6 拷贝我的文件
获得本书练习文件最简单的方法是直接下载Zip压缩文件,下载网址http://modsimpy.com/zip。您需要WinZip或gzip程序解压缩Zip文件,将解压缩文件放置于Jupyter notebook的文档目录下。
如果您能够下载Zip文件,您可以略去本部分的下面内容,下面将介绍如何使用Git。
本书的代码已经上传到Git库,网址https://github.com/AllenDowney/ModSimPy。Git是一种帮助您与其他开发者跟踪程序和完成项目的软件。在Git管理下一组文件称为存储库(repository/repo)。GitHub是提供Git储存库的存储和便捷的网页交互的服务器。
在您下载这些文件之前,我们建议您在GitHub上拷贝我的存储库,也就是分支(forking)。如果您还没有GitHub账号,您需要创建一个。
使用浏览器进入我存储库的主页https://github.com/AllenDowney/ModSimpy。您应该在右上角看到Fork灰色按钮,点击它,GitHub将创建一个属于您的我的储存库的拷贝。
目前下载文件最佳的方式是使用Git客户端(一种管理Git存储库的软件)。您可以在http://modsimpy.com/getgit网站上获得您对应系统的版本软件的安装说明。
对于Windows系统,我们建议您接受安装器推荐的设置,除了以下两个例外:
- 默认编辑器,选择nano,而不是vim。
- 对于"Configuring line ending conversions",选择"Check out as is, commit as it"。
对于macOS和Linux系统,我们建议您接收推荐设置。
一旦安装完成,打开命令行窗口。对于Windows,打开Git Bash;对于macOS或Linux,使用终端。
希望了解您的目录所在,输入pwd(打印工作目录)。对于Windows,目录类似于Users\yourusername;对于macOS或Linux,应该是您的家目录/home/yourusername。
下一步拷贝您GitHub上的存储库到您的电脑上,使用Git的语言就是,克隆(cloning)。命令如下:
git clone https://github.com/YourGitHubUserName/ModSimPy
请把YourGitHubUserName替换为您GitHub的用户名。克隆后,您将得到一个名为ModSimPy的工作目录。
0.7 运行Jupyter
每一章的代码和练习的起始代码,都在Jupyter notebook文件中。如果您以前没有使用过Jupyter,您可以在https://jupyter.org上学习使用。
对于macOS或者Linux系统,打开终端;对于Windows系统,打开Git Bash。使用cd命令修改工作目录到含有notebook文件的目录。如果您下载的Zip文件,可能是cd ModSimPy-maseter/notebooks
。
如果是通过Git克隆的目录,命令可能是cd ModSimPy/notebooks
。
然后登录Jupyter notebook服务器,运行jupyter notebook
。
Jupyter将通过浏览器打开一个窗口,而您将看到存储库中notebook的列表。点击第一个文件chap01.ipynb
,按照介绍运行单元(cell)。首次运行可能会花费几秒钟启动,因为Python文件需要初始化,随后将会运行的比较快。
如果您有建议或更正,请邮件downey@allendowney.com;如果您是一名Git用户,您可以拉请求(a pull request)。
本书的中文翻译由南开大学医学院智能医学工程专业2018级、2019级的师生完成,方便后续学生学习《Python仿真建模》课程。翻译人员(排名不分前后):薛淏源、金钰、张雯、张莹睿、赵子雨、李翀、慕振墺、许靖云、李文硕、尹瀛寰、沈纪辰、迪力木拉、樊旭波、商嘉文、赵旭、连煦、杨永新、樊一诺、刘志鑫、彭子豪、马碧婷、吴晓玲、常智星、陈俊帆、高胜寒、韩志恒、刘天翔、张艺潇、刘畅。
整理校订由刘畅完成,如果您发现有翻译不当或者错误,请邮件联系changliu@nankai.edu.cn。
本书中文版不用于商业用途,供大家自由使用。
未经允许,请勿转载。