Python回显服务器

在学习了socket网络编程的基础知识之后,我们就可以开发自己的服务器/客户端程序了。例如在家庭局域网中,我们可以通过socket编程,让两台电脑在网络中互传数据。其中一台设备是家庭服务器(树莓派),...

继续阅读

matplotlib教程之一——matplotlib介绍

matplotlib是一个Python下的2D图表绘图库。这个库的发展起源于对MATLAB绘图命令的模仿。随着逐渐地发展,matplotlib的功能越发强大。matplotlib库使用纯Python编写,并且可以使用NumPy来提高性能。

安装方法

我目前使用Linux操作系统,发行版为Arch,可以很方便的安装matplotlibpacman -S python-matplotlib对于其他发行版或平台,可以参考官方文档Installation

matplotlib库的导入姿势

Python交互环境或者Python源程序中,可以使用下面语句导入:import matplotlib.pyplot as plt成功地导入matplotlib后,就可以使用其来绘图了。

绘制第一幅图

我们使用IPython交互环境,执行下述代码:
import matplotlib.pyplot as pltplt.plot([1, 2, 3])plt.show()
即可得到下述图表:image

总结

至此matplotlib就可以正常使用了。本篇仅作为一个介绍以及配置matplotlib环境,在随后的教程中,我们将深入研究matplotlib的强大功能。

继续阅读

SymPy教程之四——表达式化简

在本文中,我们将详细研究SymPy中对表达式的化简。SymPy针对表达式类型的多样,提供了丰富的化简函数,供我们调用。除此之外,SymPy还提供了通用的化简函数simplify,它采用启发式算法,能够自己探寻最好的化简结果。显然地,启发式算法并不完美,有时的结果并不“最简”。所以,熟悉这些函数、活用这些函数,才能保证我们得到想要的结果。如果你对这SymPy库尚不太熟悉,可以参考我之前的三篇基础教程:SymPy教程之一——SymPy介绍SymPy教程之二——基本概念SymPy教程之三——基本运算关于示例程序本文的示例程序在Python 3.4.1交互环境运行,文中的>>>表示语句,其它表示语句的执行结果。表达式的显示方式,采用默认的文本方式展示。在日常工作、学习实际推导中,推荐使用IPython,并开启公式渲染,以获得更佳的显示效果。具体设计方法可以参考SymPy教程之一——SymPy介绍

化简

符号运算系统最有用的一项特性就是数学表达式的化简。SymPy中有许多能够进行不同类型表达式化简的函数。其中,有一个通用的函数名为simplify,它能够试图以一种智能的方式应用这些化简函数,并最终得到表达式的最简形式。下面给出几个例子:
>>> simplify(sin(x)**2 + cos(x)**2)1>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))x - 1>>> simplify(gamma(x)/gamma(x - 2))(x - 2)*(x - 1)
IPython中执行上面语句,效果如下:image

simplify的缺陷

simplify有一个缺陷,由于表达式“最简化”并没有一个良好的定义,SymPy只能使用库中已有的化简操作,使用启发式方法来决定其认为的“最简化”结果。举例来说,对于表达式(x^2+2x+1),使用simplify函数并不能化简成((x+1)^2)simplify的另外一个缺陷是,由于它要尝试使用不同的化简方法,并选择最佳的那个,这个过程要花费一些时间。如果你事先已经你确定要进行那一种化简,那么直接调用特定的化简函数,这是更佳的方法,能节省一些时间。指定化简函数,而不使用通用的simplify函数还有一个好处,就是可以保证输出的形式。例如,对于factor函数,如果施加到有理系数多项式上,那么得到的结果一定是最简因式。而simplify没有这种保证,因为它是完全启发式的,有时会错过可能的化简类型。何时使用simplify比较好?当你在交互式的环境里,调用simplify函数,想看看它能把表达式化简到什么程度,然后你再选择几个特定的化简函数,看看是否还能再进一步简化。

展开表达式

表达式展开SymPy中最常用的化简操作,对应的函数为expand。很多数学理论都有展开的概念,我们在这里特指对多项式的展开。例如
>>> expand((x + 1)**2)x**2 + 2*x + 1>>> expand((x + 2)*(x - 3))x**2 - x - 6
它能为我们完成两件事:展开合并同类项

因式分解

因式化对应的函数是...

继续阅读

SymPy教程之三——基本运算

在本文中,我们将讨论使用SymPy进行表达式操作的一些最为基本的操作。对于更高级的操作,可以参考advanced expression manipulation一文。首先我们要在Python中导入SymPy库:
from sympy import *x, y, z = symbols("x y z")
如果你对这两行代码尚不太熟悉,可以参考我之前的两篇基础教程:SymPy教程之一——SymPy介绍SymPy教程之二——基本概念

表达式赋值

对于数学表达式,最基础的一项操作就是赋值。表达式赋值,就是将表达式中所包含的某个变量的所有实例,都替换为另一个数、变量或者表达式。这个操作需要使用SymPy库的subs函数。例如,我们先创建一个表达式,之后将x赋值为y:
expr = cos(x) + 1expr.subs(x, y)
将会得到结果:cos(y) + 1对于上面我们创建的表达式expr,若要求取x为0时的值:expr.subs(x, 0)有的时候,我们需要将表达式中的某一个变量,用另一个表达式来代替。我在平时的科研中常常使用这种方法。有时候一个数学模型中的一个变量,往往代表着另外一个小的数学模型,通过subs方法,就可以实现合二为一。举一个简单的例子:
d = sqrt(r)r2 = x**2 + y**2r3 = x**2 + y**2 +z**2d.subs(r, r2)d.subs(r, r3)
通过给d赋予不同的表达式r2r3,就可以求取二维、三维空间中一点到原点的距离。运行效果如下:image如何给多个变量赋值?例如我们在...

继续阅读

NumPy的ndarray

NumPy 提供一种对象用来表示数组,这就是 ndarray。 Python 中 list 也可以用来表示数组,但是由于效率不高,在科学计算中并不采用。

导入 NumPy 库

在使用之前,首先要导入 NumPy 库...

继续阅读