Python练手:想在做数学题的时候摸鱼吗?

Python练手:想在做数学题的时候摸鱼吗?
举个例子,这是《高等数学》(同济大学版)中的一道课后练习题(1998年,数学三真题),不妨来一起解一下这道题吧。

首先,根据题意,结合旋转体体积公式,列出等式:
稍作化简,即得:
两边分别求导,得到一个微分方程:
将这个微分方程化成带有的形式,并将
移到等式左侧:
之后,就可以使用程序来解这个微分方程了,

所以,求得为微分方程的通解为:
然后,使用程序化简一下这个表达式

化简后的表达式为:
将代入上式,使用代码解方程:

解得C=1。
于是,所求最终的解为:
最后,我们来对照一下给出的标准答案解题步骤。

相比于标准答案的换元、分离变量等操作,我们只需要几句代码就可以一步求解出微分方程的通解,代入特值的方程也可以使用代码一步求解。
由此可见,我们在做数学题的时候,还是可以在一定程度上使用代码来摸鱼的,那些乏味的解方程、化简的过程,就直接交给电脑去做吧。当然,一般情况下,还是建议大家手动计算,毕竟是要锻炼计算能力的,代码只是起到辅助作用,建议大家只在验算答案的时候使用代码辅助计算,而不是完全依靠电脑为我们解题运算。
记得有一次上课小测验,老师有事没来上课,让课代表发了一张全是定积分的练习题,要求我们尽快做完,只写结果就行,然后就默默拿出手机打开浏览器,找了个带有sympy库的python在线编译环境,然后就...你懂得...
如果想要在做数学题的时候摸鱼,那不妨来试试使用Python解方程、化简多项式、求极限、微积分、计算矩阵吧。
虽然,对于数学运算来说,我们或许可以选择更加专业的工具,比如matlab、mathematica等软件,但是,python依然具备这些专业软件不具备的优势。

python开源免费,占用体积小,随用随取,比专业的数学软件更加自由灵活轻便。如果想要在做数学题的时候摸鱼,大可不必使用付费的专业数学软件。而且,学习使用python的数学运算,也可以让我们在以后分析其他问题的时候大展身手。结合python爬取数据的优势,我们也可以快速部署各种研究项目。
本人非专业程序员,本文如有不足,还请海涵。
基础知识:数学运算符
在正式开始之前,不妨先来了解一下Python当中的数学运算符(常用的算术运算)。
① 加法 :+
② 减法:-
③ 乘法:*
④ 除法:/
⑤ 取余:%
⑥ 整除://
⑦ 乘方:**
常用数学函数:math库
本文的主角是sympy函数库,但在讲解sympy函数库之前,各位最好先了解一下Python自带的math库函数内容,这样有利于打基础。当然,如果各位对这部分不感兴趣,也可以直接跳过,将文章下滑到sympy部分。
首先,需要导入math函数库。(math库是Python自带的一个函数库,主要包含基本的数学运算函数与常数。)
求绝对值,例如|-2|。
以上两种写法都是可以的,输出结果都是2。第一种方法是Python核心库自带的函数,第二种方法则是调用math函数库中的函数。
求开平方,例如求 。
以上两种写法都是可以的,输出结果都是1.4142135623730951。第一种方法使用的是乘方的算法,开平方,其实就是计算一个数的0.5次方。
求阶乘,例如求 5!。
输出结果为120。
取整,例如对2.33和-2.33分别向上、向下取整。
首先是向上取整,这两行代码分别输出3,-2。
接着是向下取整,这两行代码分别输出2,-3。
四舍五入,例如对2.33333和6.66666分别进行四舍五入,保留小数点后2位。
两行代码分别输出2.33和6.67。这里的round函数是Python核心库的函数,非math库函数。
数学常数,一些具有代表性的常量。
使用好这些常量很重要,因为某些特定的函数中需要使用到它们。
三角函数,例如分别计算的正弦、余弦值,
的正切值。
由于计算精度的问题,所以这三行代码分别返回1.0,6.123233995736766e-17(6.123233995736766×10的-17次方),0.9999999999999999。
只需要使用四舍五入函数进行结果近似即可,近似后返回1.0,0.0,1.0。
反三角函数,例如分别求1的反正弦、反余弦、反正切值。
三行代码分别返回小数形式的结果,依次为1.5707963267948966(接近π/2),0.0,0.7853981633974483(接近π/4)。
反余弦值,结果范围在0到π之间。
反正弦值,结果范围在-π/2到π/2之间。
反正切值,结果范围在-π/2到π/2之间之间。
值得注意的是,math函数库中的反三角函数只能返回小数形式的结果,如果想要返回π/n的形式的结果,则需要使用sympy函数库,别着急,我们会在下文介绍它。
幂函数,例如求。
这3种写法都是可以的,其中前2种写法会返回8,第3种则会返回8.0。
自然幂函数,例如求。
第1句代码会返回7.38905609893065,这通常比math.e**2或pow(math.e,2)更精确。
对数函数,例如求,
,
。
math.log(y,x)是通用的对数函数形式,用于表示。
当仅赋予math.log函数一个参数时,就会默认底数为自然常数e。
使用专门的math.log2(x)与math.log10(x)函数要比math.log(x,2)与log(x,10)的运算结果更加精确。
至此,本文已经简单地介绍了math库的常用数学函数,如果有小伙伴想要了解完整的math函数库内容,请自行访问:
https://docs.python.org/zh-cn/3/library/math.html
分数运算:fractions库
在做数学题的时候,我们经常会遇到分数与分数的各种运算,而一般的计算器程序只会输出小数结果,这让我们非常不爽。于是,我们来尝试一下使用Python进行分数的运算。
首先,导入fractions函数库,这是一个涉及分数运算的函数库。
然后,使用Fraction函数创建一个分数。比如,创建一个值为1/2的分数。
以上创建分数的3种方法均可:第一种是直接输入数字形式的分子与分母,使用2个参数;第二种是输入文本形式的分数,记得加引号;第三种是输入小数形式的数字,会自动转化为分数。
了解如何创建分数以后,我们就可以进行各种分数的运算了,比如计算114/514+514/114。
程序的输出结果为Fraction(69298, 14649),也就是69298/14649。

前期准备:符号运算SymPy与IDE工具Jupyter
SymPy 是一个由 Python 语言编写的符号计算库。什么是符号计算 ?处理数学对象的计算称为符号计算。在符号计算中,数学对象是精确表示的,而不是近似的,未计算的数学表达式会以符号形式保留。
还记得我们在上文说的反三角函数吗?不如来比较一下math库与sympy库函数的计算结果吧。

除了精确表示以外,sympy还可以进行符号运算,这对我们求解方程非常方便。
然而,Python自带的核心函数库中并不包括SymPy,因此,我们需要使用pip命令额外安装一下sympy函数库。
按下Win+R键,输入“cmd”,打开“命令提示符”,输入“pip install sympy”,按下回车键,等待命令执行完成。

由于在做数学题的时候,我们需要反复计算,因此,我们最好使用一个具备良好的交互性和记录功能的IDE工具,这里推荐使用Jupyter Notebook。
IDE是什么?集成开发环境是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。说句人话:IDE是写代码的工具。

按下Win+R键,输入“cmd”,打开“命令提示符”,输入“pip install jupyter”,按下回车键,等待命令执行完成。

之后,我们新建一个文件夹,打开这个文件夹,来到这个文件夹目录下。(之后我们在Jupiter Notebook中编写的代码记录都会保存在这个文件夹里。)
在资源管理器的地址栏输入“cmd”,按下回车键,会弹出一个命令提示符窗口。

在这个黑色的窗口中,输入“jupyter notebook”,按下回车键,等待命令执行完成。

之后会使用默认浏览器打开一个网页,这里就是我们编写代码的环境了。点击右上角的New,然后选择Python3新建一个文件即可。

在方框中输入代码,然后点击上方的“运行”按钮就可以运行代码了。(快捷键Ctrl+Enter)

当然,如果各位嫌麻烦,也可以直接使用Python自带的IDLE。

也有网友会问到,为什么不使用PyCharm等更加专业的IDE工具呢?这就好像在问,为什么剔牙的时候要用竹签而不是用竹竿呢?PyCharm适合开发比较大的项目,它占用内存太大了,对电脑要求较高,容易卡顿;而Jupiter Notebook轻便灵活,占用体积小,最重要的是,它会保存你输入的代码以及运行的结果,方便以后回顾查看,对于数学研究类项目来说非常好用。

打好基础,做好准备工作,接下来我们开始正式讲解Python中常见的数学运算中的科学计算功能。本文将会以举例的形式进行讲解。
首先,依旧是需要导入sympy函数库。
以上三种导入函数库的方法均可,但是建议使用前两种。
先来讲解一下这三种导入方法的不同点。
如果采用第1种方法,那么调用相关函数的方法需要这样写(最标准的写法):
如果采用第2种方法,那么调用相关函数的方法需要这样写:(第2种方法与第1种没有本质区别,只是命名了一个简写)
如果采用第3种方法,那么调用相关函数的方法需要这样写(可以直接调用,无需额外写函数库名):
看起来第3种方法调用的时候更加方便诶~但是为什么建议使用前两种呢?这是为了避免命名冲突。
比如说,张三函数库里有个函数叫做喘气,李四函数库里也有个方法叫喘气。
如果我们用前两种方法,可以很清晰地知道需要调用谁的函数。
但是如果我们使用第3种方法的话,那么这个函数是调用谁的呢?
本文采取的导入方式为第1种。
注意:下文所写代码#开头行为注释,仅供阅读代码方便理解使用,在实际练习中,不需要额外书写注释行。
求解方程
(1)一元方程求解
例1. 求解
首先,通过移项,将方程的右边变为0:x^2+4x+3=0
然后,使用代码进行求解:
求解的结果如下所示:该方程的解为-3或-1。

例2. 求解
还是同样的写法,只不过需要注意的是,这里我们需要调用sympy库中的exp()函数,而不是math库中的。
求解的结果如下所示:该方程的解为0。

(2)未知参数一元方程求解
例3. 求解
有时,我们的方程中含有未知参数,这依然可以求解,只不过就是多定义几个变量而已。
注意这里,因为含有多个未知数,因此,我们需要在solve函数中添加第二个参数x,这样程序才会求解关于f(x)=0的解,否则默认就求解f(a)=0。
这是正确的写法:

这是错误的写法:

(3)多元方程组求解
例4. 求解方程组
x - y + z = 9
3x + 2y - z = 15
x + 5y -z = 26
输入以下代码进行求解:
求解结果如下所示:

求解不等式
(1)一元不等式求解
例5. 求解
这里由于右侧为常数,所以可以不移项,但如果右侧含有未知数,建议先移项,将右侧转化为仅含0的形式
求解结果为 x<-3 或 x>-1

(2)一元不等式组求解
例6. 求解不等式组
这里需要先移项,将右侧转化为仅含0的形式,然后再编写代码,求解的时候,要用[ ]将两个条件包裹起来,solve函数只需要一个参数,这个参数是一个list。
求解结果如下:x≤-13/7

处理多项式
(1)因式分解
例7. 分解多项式
分解多项式需要用到factor函数。
分解结果如下:

(2)多项式展开
例8. 展开多项式
展开多项式需要用到expand函数。
展开结果如下所示:

(3)多项式化简
例9. 化简多项式
化简多项式需要用到cancel函数。
化简结果如下所示:

求极限
(1)函数求极限
例10. 求极限
在代码中,需要使用sympy.oo(两个英文小写字母o)代表+∞,limit函数需要3个参数,第二个参数是自变量x,第一个参数是函数y=y(x),第三个参数是自变量x趋近的值。
求得极限值为0.5

例11. 求极限
方法是一样的,只不过把∞换成了常数。
结果中的oo代表∞

(2)数列求和求极限
例12. 求极限
使用summation函数构造数列求和的形式,第一个参数为表达式,第二个参数为包含自变量、起点、终点。
使用Juputer有个好处,如果直接调用变量的话,会输出优化后的显示结果。

如果直接使用print函数输出的话,就是普通的文本形式。

求导函数
(1)一元函数求导数
例13. 求函数 的一阶导数
使用diff函数构造导函数,如果只填写一个参数,就默认求一阶导。
求导结果如下所示:

例14. 求函数 的10阶导数
使用diff函数构造导函数,第三个参数可以指定求几阶导数,第二个参数需要写自变量。
求导结果如下所示:

(2)多元函数求偏导
例15. 已知函数
求偏导数,依然使用diff函数,只不过各位需要额外注意参数的放置情况
求偏导结果如下所示:

(3)隐函数求导
例16. 求隐函数 的导数
隐函数求导需要使用idiff函数。
求导结果如下所示:

(4)参数方程求导
例17. 求参数方程的导数
x = 2cost
y = 3sint
求导结果如下所示:

(5)求泰勒展开式
例18. 求 f(x) = cosx 在 x = 0 处的5阶泰勒展开式
求解泰勒展开式需要使用series函数,第一个参数是自变量,第二个参数是x的值,第三个变量是阶数。
泰勒展开式结果如下所示:

求函数积分
(1)求不定积分
例19. 求不定积分
求不定积分,需要使用函数integrate,第一个参数是被积函数,第二个参数只需要自变量x。
积分结果如下所示:-x + tanx +C (记得手动加常数C)

(2)求定积分
例20. 求定积分
求不定积分,依然使用函数integrate,第一个参数是被积函数,第二个参数分别写自变量x、积分上限、积分下限,用( )包裹起来。
积分结果如下所示:1

(3)求多重积分
例21. 求二重积分
多重积分也是用integrate函数,只不过是需要往后继续堆参数而已。这里就只展示二重积分了,其他更多重积分只需要往后叠加就可以了。
积分结果如下所示:

求解微分方程
(1)求解可分离变量的微分方程
例22. 求方程 的通解
首先,将方程转化为一边为的形式:
然后,使用代码进行求解。令。
其中:cls=sympy.Function代表此处为需要求解的函数;Eq表示相等,即建立f'(x)与右侧式子相等的关系。
输出结果非常直观,直接输出原函数,但是建议大家化简一下:

(2)求解线性微分方程
例23. 求 5 f '(x) + 2 f(x) = cosx 的通解
这里依然需要创建Eq对象,分别将等式两边放入两个参数的位置。
计算结果如下所示:

例24. 求 的通解
如果遇到高阶导函数,只需要在diff中输入第二个参数表示阶数即可,其他与一阶的求解方法相同。
计算结果如下所示:

矩阵计算
(1)创建矩阵
根据不同的需求,有以下几种方法创建矩阵。
创建结果如下所示:

(2)修改矩阵
如果需要修改矩阵的某个元素值,可以直接按照类似修改数组的方式对其进行修改。只不过格式有些不同,坐标之间需要用逗号隔开,或者直接按照由行到列的顺序从0开始进行编号。
两种方法修改结果如下所示:

也可以直接修改某一行或某一列。矩阵的第一个坐标代表行,第二个坐标代表列,使用:(冒号)代表所有的行或所有的列,例如m[2,:]代表第3行以及所有的列(从0开始编号,所以2代表第3行,第3行以及所有的列的交集就是第3行)。
修改结果如下所示:

(3)矩阵计算
矩阵计算包括但不限于矩阵加减乘法、求转置矩阵、求逆矩阵、求伴随矩阵、求矩阵行列式值、求矩阵特征值、求矩阵多项式等。
计算结果如下图所示:

求积分变换
(1)拉普拉斯变换
例25. 求 的拉普拉斯变换
求解拉普拉斯变换需要用到laplace_transform函数。
解得 :

(2)拉普拉斯逆变换
例26. 求 的拉普拉斯逆变换
求解拉普拉斯逆变换需要用到inverse_laplace_transform函数。
解得 f(t)=2sint :

(3)傅里叶变换
傅里叶变换使用fourier_transform函数,其他部分与拉普拉斯变换一致,在此不再重复叙述。
(4)傅里叶逆变换
傅里叶逆变换使用inverse_fourier_transform函数,,其他部分与拉普拉斯逆变换一致,在此不再重复叙述。
学了代码,可以摸鱼吗?
为了检测学习效果如何,这里有几道题帮大家练练手:

如果本文对你有所帮助,欢迎点赞、评论、转发,听说关注我的人都变帅了。诶嘿~
