您是否正在寻找一种容易学习的编程语言来帮助完成科学工作?不必舍近求远,Python 就能办到。我们将介绍开始使用这种简单的编程语言需要了解的一些基本概念,并展示如何使用 Python 执行从运行代数计算到根据数据生成图形输出的所有操作。
科学计算涉及到使用计算机解决科学问题。具体来讲,可以使用计算机来解方程。从单一非线性方程( 求根 )到线性代数方程组( 数字线性代数 ),再到解决非线性偏微分方程组( 计算物理学 )。
过去,解决这些问题的数字算法是用诸如 C/C++ 和 Fortran 之类的语言编写的 — 现在仍是如此。那么,Python 适用于哪些地方呢?Python 非常适合用来快速实现和测试新(或旧)算法,并将多个物理学代码编组到一起(美国的顶级实验室经常这么做)。Python 易于使用,学起来很有趣,而且非常强大。那么您还在等什么?让我们开始吧!
Python 可广泛应用在所有运行 Linux 或 macOS 操作系统的计算机上。您甚至可以在 iPad 上使用 Pythonista 应用程序来运行 Python。您还可以从 Python.org 下载一个适合 Windows 的版本。但是如果您要执行科学计算(即使您不执行科学计算),建议您下载并安装 Anaconda 。Anaconda 提供了一个完整的 Python 安装,还提供了许多用于科学计算的不错的包(我将它们称为 模块 )。它还能够轻松访问集成开发环境 Spyder。
安装 Anaconda 后,您可以单击 Anaconda Navigator 的图标,并开始享受乐趣。在右下角的窗口中,您会看到一个命令提示符。将鼠标放在此提示符右侧,就可以开始输入 Python 命令。如果采用学习新编程语言的传统路线,可以先输入 print("Hello World!")
,然后按下 Return
。
可以使用命令提示符输入一个或多个命令来快速测试代码段,或者为您的工作生成输出。在涉及大量代码时,最好单独生成并保存一个程序文件(稍后会详细介绍)。
另一个选项(至少在 Linux 和 macOS 上)是打开终端窗口,并在命令提示符上输入 Python
。这样做会启动 Python 命令提示符,而且您可以开始输入命令并运行 Python 代码。如果在终端窗口中输入 idle
,您会获得一个包含 Idle Python 编辑器的新窗口 — 可以方便地编写新 Python 脚本并使用强大的 F5
命令运行它们。
您已安装 Python 并知道如何开始输入命令,现在,您可以继续执行一些数学和科学操作。解方程的计算机编程涉及到使用变量和处理代表这些变量的数字。例如,在 Python 中,可以通过在命令提示符上输入以下命令来定义一个变量:
>>> x0 = 1.5 >>> x1 = 2.0
恭喜!您刚才同时创建了两个名为 x0
和 x1
的新变量,而且分别为它们分配了值 1.5
和 2.0
。要查看实际效果,只需输入以下内容:
>>> x0,x1
或者可以调用 print
函数:
>>> print (x0,x1)
您不需要将这些变量声明为实数(浮点数)或整数,因为 Python 是一种动态输入语言;它根据赋给变量的值来动态确定变量类型。
您为两个数字分配了两个变量,所以您可以立即对它们执行简单的计算机代数运算;您可以按您的意愿对它们执行加减乘除。这是计算机最在行的事情。要查看此代数运算的运行效果,可在命令提示符上输入以下命令:
>>> yp = x0 + x1 >>> ym = x1 - x0 >>> yt = x0*x1 >>> yd = x1/x0 >>> print(yp,ym,yt,yd)
您现在已在正式执行科学计算。
如果计算机只能执行代数运算,那么它们对科学计算的影响将是有限的。事实上,计算机还擅长处理逻辑,这使得创建复杂程序成为可能。您可能很熟悉 if this, then that ( IFTTT ) 逻辑。这与我讲的主题并不完全相符,但很接近。我指的是程序流控制,或者仅在某些条件下执行一行或一段(多行)代码,在其他条件下执行其他行或其他段代码的能力。要了解此话的真正含义,请输入以下命令:
>>> x1 = 2.0 >>> if x1 < 0: x = 0 print("Negative switched to zero") elif x1 == 0: print ("Zero") else: print ("x1 is positive")
该代码是一个 if
代码段的示例,其中 elif
是 else if
的缩写,如果前面两段(或您需要的多段)代码测试失败,则会执行 else
。 要获得更详细的解释,请查阅 Python 文档中的 更多控制流工具
。
科学计算中的许多算法背后的强大功能,都与对不同数据多次执行同一段代码的能力相关。在这里,循环就派上了用场。考虑下面这段代码,它使用 Python 内置函数 range
生成一个包含 10 个整数的列表,从 0 开始:
>>> x0 = 1.5 >>> for i in range(10): x1 = x0 + i
此代码执行计算 x1 = x0 + i 10 次,从 i=0 开始,到 i=9 结束。
有了函数,就可以执行将大型编程任务分解为少量子任务或 函数
的重要编程过程。 Python 拥有内置函数和外部库,我稍后会解释它们。您也可以构建自己的函数。可以使用 Python 关键字 def
创建函数,如下所示,名为 f
的函数接收输入变量 x
,并返回对所编写的代数表达式执行计算后获得的值:
>>> def f(x): return x**3 - 5*x**2 + 5*x + 1 >>> x0 = 1 >>> print ("f(x0) = ", f(x0))
要创建一个函数来计算上面的函数的分析衍生版本,请输入以下内容:
>>> def fp(x): return 3*x**2 - 10*x + 5 >>> x1 = 2 >>> print ("The derivative of f(x) is: ", fp(2))
目前,您已在命令提示符上输入了所有 Python 命令,这适合简短的、可任意使用的代码。但是,如果您在开发一个大型项目,或者您想保存您的工作供以后使用,建议创建一个新 Python 文件或 脚本
。可以在终端窗口中使用您最喜欢的文本编辑器完成此任务。例如,使用 vi,可以输入 vi newton.py
来创建名为 newton
且以 .py 作为文件扩展名的空白文本文件,让每个人(以及具体来讲计算机)都知道这是一个 Python 文件。然后,保持文件处于打开状态,您可以开始输入您的 Python 命令。
备注:Python 使用空格来指示代码段。标准约定是使用 4 个空格来缩进一个新代码段,比如组成一个函数的代码或一个 if-then
代码块。
编写程序的另一个重要方面是 注解
— 这些代码行会告诉阅读您的文件的人该脚本的用途。单行注解以井号 ( #
) 开头;要创建多行注解,可在它们前面加一个反斜杠后跟 # ( /#
),并在它们后面加上 #/
。输入您的代码后,保存它并退出编辑器。然后从终端窗口命令行输入 python newton.py
来运行该代码(假设您与所保存的文件在同一目录中)。
在科学计算中,将一个问题或任务分解为更小的问题或 子任务
通常是个不错的主意。在 Python 中,这些子任务称为 模块
。模块是包含定义和语句的附加 Python 文件(具有文件扩展名 .py)。也有一些预先构建的模块。您可以在自己的程序中使用任何模块,只需使用 import
关键字导入它即可。例如,math 模块包含基本数学函数,比如正弦和余弦函数;可通过关键字 import math
来使用它们。
您希望在 Python 中使用的两个强大的科学计算模块是 NumPy 和 SciPy 。NumPy 包含许多强大的特性,但在这里尤为重要的是,它能够创建分配给单个变量的相同数据类型的数字集合(称为 数组 )。它还包含广泛的线性代数、傅里叶变换和随机数功能。SciPy 是一个包罗万象的科学计算生态系统,它包含 NumPy 和其他大量包,比如 matplotlib,我们将在下一节中介绍它。下面的代码提供了如何导入 NumPy 并在一个代码段中使用它的简单示例:
import numpy as np /* Now we create and assign a list of integers 0 through 9 to x[0] through x[9], effectively creating a one-dimensional NumPy array */ x = np.linspace(10) print(x)
利用科学计算生成数据的有效图形输出,是理解和传达结果的关键。Python 中实现这个重要目标的标准包是 matplotlib 模块。可以看到,该模块很容易访问和使用:
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> x = np.arange(0, 5, 0.1) >>> y = np.sin(x) >>> plt.plot(x,y) >>> plt.show()
matplotlib 模块提供了一些命令来控制行类型、颜色和样式,并保存您的图表。
网络上有数百个网站可帮助您了解 Python 和它在科学计算中的作用。您还可以通过以下这些优秀资源进一步学习:
编码愉快!