在咱们初、高中和大学近10年的学习时间里,数学一直占据着很是大的份量,可是回忆过去能够发现,咱们把大量的时间都花在反复解题、不断运算上,计算方法、运算技巧、笔算能力以及数学公式的记忆仿佛成了咱们学习数学的所有。这些记忆和技巧没几年就忘掉了,但不少人甚至还记得那份阴影;笔算与解题在AI、图形图像、数据分析等上被软件所取代。那咱们学生时代的数学还剩下什么呢?
提及数学计算器,咱们常见的是加减乘除四则运算,有了它,咱们就能够摆脱笔算和心算的痛苦。四位数以上的加减乘除在数学的原理上其实并不难,可是若是不借助于计算器,光依赖咱们的运算能力(笔算和心算),不只运算的准确度大打折扣,并且还会让咱们对数学的运用停留在一个很是浅的层次。python
尽管四则运算如此简单,可是多位数运算的心算却在咱们生活中被归为天才般的能力。可是数学的应用应该生活化、普及化,而不是只属于天才的专利,计算器改变了这一切,这就是计算器的魅力。
计算器还能够作科学运算,好比乘方、开方、指数、对数、三角函数等,尽管这些知识在咱们初中时代,经过纸笔也是能运算起来的,可是也仅限于一些极其经常使用和简单的运算,一旦复杂起来,经过纸笔来运算就是一项复杂的工程了。因此说, 计算器可让咱们离数学的应用更近。
可是咱们学生时代所学的数学可远不止这些,尤为是高等数学(微积分)、线性代数、几率统计等数学知识应用很是普遍(我也是后来才知道),可是因为他们的运算很是复杂,咱们即使掌握了这些知识,想要应用它又谈何容易,那有没有微积分、线性代数、几率统计等的计算器呢?程序员
答案是有的,它们就是计算机代数系统Computer Algebra System,简称CAS,Python的Sympy库也支持带有数学符号的微积分、线性代数等进行运算。函数
有了计算器,咱们才能真正脱离数学复杂的解题自己,把精力花在对数学原理和应用的学习上,而这才是(在工做方面)数学学习的意义。
Sympy能够实现数学符号的运算,用它来进行数学表达式的符号推导和验算,处理带有数学符号的导数、极限、微积分、方程组、矩阵等,就像科学计算器同样简单,相似于计算机代数系统CAS,虽然CAS一般是可视化软件,可是维基百科上也把Sympy归为CAS。工具
几大知名的数学软件好比Mathematica、Maxima、Matlab(需Symbolic Math Toolbox)、Maple等均可以作符号运算,在上篇文章中咱们已经拿Python和R、Matlab对比了,显然Python在指定场景下确实优点很是明显,因而我又调研了一下Sympy与Mathematica的比较,在输入公式以及生成图表方面,Sympy确实不行(这一点Python有其余库来弥补),Mathematica可以作什么,Sympy基本也能作什么。学习
因此说Python在专业数学(数学、数据科学等)领域,因为其拥有很是多并且强大的第三方库,构成了一个极其完善的生态链,即便是面对世界上最为强势最为硬核的软件也是丝绝不虚的。code
本专栏 用Python学数学的下一期也会介绍一些很是实用的数学工具和数学教材资源,让数学的学习更简单更生动。
若是以前是学数学相关专业了解计算机代数系统CAS,就会对数学符号的运算比较熟悉,而若是以前是程序员,可能会有点不太明白,下面咱们就来了解一下。教程
Sympy与Math函数的区别ip
咱们先来看一下Sympy库和Python内置的Math函数对数值计算的处理有什么不一样。为了让代码可执行,下面的代码都是基于Python3的完整代码。资源
import sympy,math print(math.sqrt(8)) print(sympy.sqrt(8))
执行以后,结果显示为:get
2.8284271247461903 2*sqrt(2)
math模块是直接求解出一个浮点值,而Sympy则是用数学符号表示出结果,结合LaTex的语法就能够得出咱们在课本里最熟悉的的:$2\sqrt{2}$。
数学符号与表达式
咱们要对数学方程组、微积分等进行运算时,就会遇到变量好比x,y,z,f等的问题,也会遇到求导、积分等代数符号表达式,而Sympy就能够保留变量,计算有代数符号的表达式的。
from sympy import * x = Symbol('x') y = Symbol('y') k, m, n = symbols('k m n') print(3*x+y**3)
输出的结果为:3*x + y**3
,转化为LaTex表示法以后结果为$3x+y^3$,输出的结果就带有x和y变量。Symbol()函数定义单个数学符号;symbols()函数定义多个数学符号。
折叠与展开表达式
factor()
函数能够折叠表达式,而expand()
函数能够展开表达式,好比表达式:$x^4+xy+8x$,折叠以后应该是$x(x^3+y+8)$。咱们来看具体的代码:
from sympy import * x,y = symbols('x y') expr=x**4+x*y+8*x f_expr=factor(expr) e_expr=expand(f_expr) print(f_expr) print(e_expr)
表达式的折叠与展开,对应的数学知识就是因式分解,相关的数学知识在人教版初二的教程里。用Python学习数学专栏的目的就是要Python与初高中、大学的数学学习结合起来,让数学变得更加简单生动。
表达式化简
simplify()函数能够对表达式进行化简。有一些表达式看起来会比较复杂,就拿人教版初二上的一道多项式的乘法为例,简化$(2x)^3(-5xy^2)$。
from sympy import * x,y = symbols('x y') expr=(2*x)**3*(-5*x*y**2) s_expr=simplify(expr) print(s_expr)
在人教版的数学教材里,咱们初一上会接触一元一次方程组,初一下就会接触二元一次方程、三元一次方程组,在初三上会接触到一元二次方程,使用Sympy的solve()函数就能轻松解题。
解一元一次方程
咱们来求解这个一元一次方程组。(题目来源于人教版七年级数学上)
$$6 \times x + 6 \times(x-2000)=150000$$
from sympy import * x = Symbol('x') print(solve(6*x + 6*(x-2000)-150000,x))
咱们须要掌握Python的代码符号和数学符号之间的对应关系,解一元一次方程就很是简单。
解二元一次方程组
咱们来看如何求解二元一次方程组。(题目来自人教版七年级数学下)
$$ \begin{cases} x+ y =10,\\ 2 \times x+ y=16 \end{cases} $$
from sympy import * x,y = symbols('x y') print(solve([x + y-10,2*x+y-16],[x,y]))
很快就能够得出{x: 6, y: 4}
,也就是
$$x=6,y=4$$。
解三元一次方程组
咱们来看如何解三元一次方程组。(题目来自人教版七年级数学下)
$$ \begin{cases} x+y+z=12,\\ x+2y+5z=22,\\ x=4y. \end{cases} $$
执行以后,很快能够得出结果{x: 8, y: 2, z: 2}
,也就是
$$x=8,y=2,z=2$$
解一元二次方程组
好比咱们来求解人教版九年级一元二次方程组比较经典的一个题目,$ax^2+bx+c=0$.
from sympy import * x,y = symbols('x y') a,b,c=symbols('a b c') expr=a*x**2 + b*x + c s_expr=solve( expr, x) print(s_expr)
执行以后得出的结果为[(-b + sqrt(-4*a*c + b**2))/(2*a), -(b + sqrt(-4*a*c + b**2))/(2*a)]
,咱们知道根与系数的关系二次方程会有两个解,这里的格式就是一个列表。转为咱们常见的数学公式即为:
$$\frac{-b+\sqrt{-4ac+b^2}}{2a} 、-\frac{b+\sqrt{-4ac+b^2}}{2a}$$
微积分是大学高等数学里很是重要的学习内容,好比求极限、导数、微分、不定积分、定积分等都是可使用Sympy来运算的。
求极限
Sympy是使用limit(表达式,变量,极限值)函数来求极限的,好比咱们要求$\lim \limits_{x \to 0} \frac{sinx(x)}{x}$的值。
from sympy import * x, y, z = symbols('x y z') expr = sin(x)/x l_expr=limit(expr, x, 0) print(l_expr)
执行后便可获得结果为1。
求导
可使用diff(表达式,变量,求导的次数)函数对表达式求导,好比咱们要对$sin(x)e^x$进行$x$求导,以及求导两次,代码以下:
from sympy import * x,y = symbols('x y') expr=sin(x)*exp(x) diff_expr=diff(expr, x) diff_expr2=diff(expr,x,2) print(diff_expr) print(diff_expr2)
求导一次的结果就是exp(x)*sin(x) + exp(x)*cos(x)
,也就是$e^xsin(x)+e^xcos(x)$;求导两次的结果是2*exp(x)*cos(x)
,也就是
$$2e^xcosx$$
求不定积分
Sympy是使用integrate(表达式,变量)来求不定积分的,好比咱们要求$\int(e^x\sin{(x)} + e^x\cos{(x)})\,dx$
from sympy import * x,y = symbols('x y') expr=exp(x)*sin(x) + exp(x)*cos(x) i_expr=integrate(expr,x) print(i_expr)
执行以后的结果为:exp(x)*sin(x)
转化以后为:
$$e^xsin(x)$$
求定积分
Sympy一样是使用integrate()函数来作定积分的求解,只是语法不一样:integrate(表达式,(变量,下区间,上区间)),咱们来看若是求解
$\int_{-\infty}^\infty \sin{(x^2)}\,dx$
from sympy import * x,y = symbols('x y') expr=sin(x**2) i_expr=integrate(expr, (x, -oo, oo)) print(i_expr)
执行以后的结果为sqrt(2)*sqrt(pi)/2
,也就是
$$\frac{\sqrt{2}\sqrt{\pi}}{2}$$
Sympy可以作的也远不止这些,初高中、大学的数学运算题在Sympy极为丰富的功能里不过只是开胃入门小菜而已。