无论是三大数学软件 Matlab(通信、控制等工程例外)、Maple、Mathematica,还是三大统计软件 Spass、Stata、SAS,这些可视化的软件本身就是编程的一个体现,它们在一定程度上降低了我们使用数学的门槛,但另一方面它们背后的功能是可以被编程取代的,而 Python 在数学和数据科学领域的流行,也是逐渐取代这些软件的一个过程。
在职业方面,精算师、金融工程、商业分析、数据分析师、数据挖掘、数据建模、量化工程师、算法工程师、数据产品经理、数据运营、数字营销、大数据、游戏开发、人工智能等诸多职业岗位都对数学有要求,但是我们会发现这些岗位对数学的应用都需要使用到数学软件以及需要与编程结合,可以说我们要应用数学,天然就应该与编程有机结合起来。而在数学、数据领域,由于 Python 编程语言的胶水性质以及极为丰富的第三方库,Python 渐已成为学数学最值得推荐的编程语言。
用 Python 学数学技术专栏就尝试如何将数学与编程有机结合起来,让数学的学习回归到基础概念的理解和实际应用之中去。(当然专栏的目的主要是为数据科学和机器学习等的基础服务)
为什么数学那么难学且无用?
所谓将数学与编程有机结合,一是在数学学习的方向上就以数学的实际应用为重心;二是数学在符号上、图形上等的表现形式应该与编程语言无缝结合。
在我们学生时代的数学教学存在着诸多弊端:
- 一是以往的教育过于强调具体的计算能力,很多数学学得好的,不过是解题高手,一些极其复杂的微分方程、矩阵等还停留在笔算技巧和笔算能力上,而且对数学的应用需要死记硬背大量复杂的数学公式,这无疑加大了数学学习的难度,也偏离了数学原本的方向;在专栏的代数符号运算里面,我们就提到过可以借助于 Sympy 这种 CAS 工具来进行复杂的数学运算,从此数学公式的记忆与笔算不再是学习的重点;
- 二是真正好的数学教学是应该要复杂的数学理论知识简化,国内大学教程相比于国外存在很多不足之处,所以接下来我们也会推荐一些比较好的数学教程。很多人数学学不好、学不会在很大程度上也与教程对数学概念的讲解有一定的关系;
- 三是结合 Python 编程是可以对一些数学的问题进行建模的,通过编程来进行数学建模在前面我们提到的那么多职业,他们对数学的要求基础大多是微积分、概率统计、线性代数相关的知识,只是在以往的学习里,我们看不到数学是如何应用到这些职业里的;
四是结合 Python 以及一些数学软件,我们可以做出一些动态图形,加深大家对数学公式的理解
精选数学教程
到了大学之后,线性代数、概率统计、微积分等数学知识的难度较中学时代更高,整个数学的画风变化过大,很多概念开始变得难以理解,不知道怎么突然就冒出来了,也不知道学了有什么用。关于这些,其实有一部分是我们教材的原因,国内大学教材的编写者没有产品经理思维,没有切实站在学生的角度、没有以学生为中心来写教材。这里推荐一些公认比较好的教材:
线性代数
关于线性代数这里我们推荐两个教程,一个是 William Gilbert Strang(威廉·吉尔伯特·斯特朗)的视频教程麻省理工公开课:线性代数,这个视频教程有配套的教材线性代数导论, 价格有点性感,不过不看书也是 OK 的。Strang 是麻省理工 MIT 的教授,写过很多经典的数学教材。他亲自传授的这个线性代数课程也是享有盛誉。我们还可以在 MIT 的开放课程里查看更多关于课程的信息:MIT 线性代数课程官网。这个课程还有配套的习题课,在网易云课堂上也可以看到 MIT 线性代数习题课
二是 3Blue1Brown 的线性代数的本质。3Blue1Brown 是斯坦福大学毕业的一个小哥创办的 Youtube 频道,擅长用直观的方法来阐述难以理解的概念,非常推荐。
微积分
微积分的课程我们也同样是推荐 MIT 和 3Blue1Brown 的课程。微积分在 MIT 分为单变量微积分和多变量微积分,而且都有配套的习题视频,在网易云课堂都可以看到。
单变量微积分、单变量微积分习题课、多变量微积分、多变量微积分习题课。如果想看更多视频内容也可以去 MIT 官网上了解一下,单变量微积分官网、多变量微积分官网。
3Blue1Brown 的微积分的本质讲的也是一如既往的好,可以在学习 MIT 课程前先看。
统计学
统计学是一门非常重要的知识,这里我们推荐 Khan Academy 可汗学院的统计学教程, 虽然也有 MIT 统计学教程,可惜的是没有字幕,如果你听不懂,可以去 Youtube 上借助 AI 字幕来看,也可以去 MIT 统计学基础官网上获取更多资料。还有一个斯坦福大学的统计学习入门(英文字幕)相当不错。
以上教程可能有的使用的 R 或 MATLAB,这些都是可以用 Python 来代替的。
数学公式与图像展示
有趣的数学图形
为了加深我们对数学公式的理解,我们通常都需要辅之以一些图形,比如函数的图形、几何图形、空间图形等。以往我们作图都是通过在纸上手绘一些图形,不仅麻烦,而且非常不精确,更无法让图形根据变量取值的变化来直观的调整图形。
比如下面这个公式:
$$y=x^{\frac{2}{3}}+0.9\sqrt{3.3-x^2}\sin\left(\pi x\right)$$
为了手绘出这个图形,我们不仅要研究这个数学公式的特性(比如最高点、最低点、拐点、凹凸性)、还要通过赋值的方式来确定图形的轮廓。当然由于赋值的有限,图形自然是无法做到精准的。这还是只有一个变量的情况下,有时我们为了研究数学公式,可能会有多个变量,比如下面的公式除了 x 这个变量以外,还会有变量 b:
$$y=x^{\frac{2}{3}}+0.9\sqrt{3.3-x^2}\sin\left(b\pi x\right)$$
由于公式过于复杂,学生时代数学公式的图形绘制也花了我们大量的时间。但是图形却又是有必要的,因为它可以加深我们对数学公式的理解。其实我们是可以借助于计算机软件来实现这个公式的图形的。
数学图形绘制软件
那上面这个数学公式图形的动画效果是怎么做的呢,可以使用 Desmos 或 Geogebra 在线版本来绘制,虽然万能的 Wolfram Alpha(Mathematica 产品也是该公司的)也可以做到,不过体验比较差还收费。Desmos、Geogebra、Wolfram Alpha(收费)都有非常不错的 App 产品,非常值得学习数学的朋友使用这些软件来增进对数学公式、概念等的理解。
Desmos、Geogebra 可以通过虚拟键盘的方式来输入公式,非常方便,而且公式输入框里面的公式格式是 LaTex,可以直接复制公式到 VS Code 的 Markdown 里,加上 $$$$
符号即可显示,对 LaTex 不了解的童鞋可以阅读本专栏用 Python 学数学里面的《使用 Markdown 输出 LaTex 数学公式》。同时你也可以直接把 LaTex 格式的数学公式直接粘贴到 Desmos、Geogebra 的数学公式输入框里面。比如把下面 LaTex 格式的数学公式粘贴到数学公式输入框里面,将 b 作为变量:
x^{\frac{2}{3}}+0.9\sqrt{3.3-x^2}\sin\left(b\pi x\right)
Desmos、Geogebra 可以给数学公式添加变量,你可以使用 Slider 来调整变量的值,图形会实时绘制并展示出来,堪称教学神器,以后再也不用手绘数学图形啦~
其他数学相关软件(含 App)
既然都已经是互联网时代了,借助于 PC 端在线版本的软件以及手机端的 App 来学习数学是理所应当的,在美国等国家,这些数学软件早已走进了课堂(对中小学数学软件感兴趣的朋友可以自行搜索整理了解一下,这里就不介绍了)。
Symbolab:告诉你运算步骤的数学软件
Symbolab:这是一个高等数学计算器,支持 Online 版本(也有不错的 App 软件),可以用来计算一些基础的代数、函数、三角、微积分等数学公式以及化学公式的运算,它最有特色的功能是可以给出 比较详细运算的步骤,如果你想计算下列数学公式的值:
$$\int \left(x^2+ax-3\right)^2dx$$
用 Symbolab 来计算,除了可以得出如下结果:
$$\int \left(x^2+ax-3\right)^2dx=\frac{ax^4}{2}+\frac{x^5}{5}-2x^3+\frac{a^2x^3}{3}-3ax^2+9x+C$$
它还会把整个运算步骤的细节也给你展示出来,非常适合学生再做数学习题时,来检查自己运算步骤是否错误,也适合老师出数学习题。
类似这样的数学软件还有 MathPapa(整体感觉比 Symbolab 要差),Photomath(有手机 App,除了可以拍照识别公式外,也不如 Symbolab)、Mathway(也比较一般,手机 App 倒是不错)。你也可以在应用商店通过搜索“Math”来获取其他数学 App,不过它们的功能和以上所说的这些都是类似的。
Python 是万能的
我们一直强调的是以上所述所有数学软件都是可以被 Python 取代的(需要 GUI 图形点击操作也可以,只是比较复杂,不推荐而已),用数学软件是很难做到与编程结合的,也无法使用到一些 API 将数据对接到生产环节里去。不能与编程结合,数学公式就是死的,不能有效将数据应用到生产实践里,数据的商业价值就大打折扣。所以,除了绘制数学图形外,学习数学就应该完全与编程有机结合。
那 Python 怎么绘制数学图形呢?我们可以使用最常用的数据可视化库 matplotlib 以及可以做代数符号运算的 Sympy 来绘制数学图形。
使用 matplotlib 绘制 $3x+2x-4$ 的数学图形:
import numpy as np
import matplotlib.pyplot as plt
def graph(formula, x_range):
x = np.array(x_range)
y = eval(formula)
plt.plot(x, y)
plt.show()
graph('x**3+2*x-4', range(-10, 11))
使用 Sympy 绘制 $x^2$ 和 $x$ 交叉的数学图形:
from sympy import symbols
from sympy.plotting import plot
x = symbols('x')
p1 = plot(x*x, show=False)
p2 = plot(x, show=False)
p1.append(p2[0])
p1.show()
另:使用 Python 的 Sympy Gamma 也同样获得解题的详细步骤,不过使用体验上是没法和 Symbolab 相比的