本文将学习Python的Sympy库,通过该库来求极限,微分,定积分与不定积分,常微分方程、偏微分方程。
求解方程组
先通过求解一组方程组来理解Sympy的用法,假设有以下一组方程组:
求解这个方程组的代码如下:
from sympy import *
def fangchengzu():
"""求解方程组"""
#定义变量
x,y = symbols('x y')
# 使用solve()函数求解x,y的值
result = solve((2*x-y-3,3*x+y),(x,y))
print(result)
if __name__ == '__main__':
fangchengzu()
输出结果如下:
进群:548377875 即可获取数十套PDF哦!
在函数fangchengzu()中,symbols声明了两个变量x和y,相当于应用题中假设某某为x,y一样,告诉程序已经定义了两个变量。solve()函数有两个元组实参,第一个元组存放方程组,每个方程的值均为0;第二个参数存放待求解的值x,y。
如果每个元组的个数为单个,则以单个元素的元组形式传递,代码如以及实现效果如下图:
自此可以看到sympy解决问题的一般思路为,先声明需要用到的变量,构造需要求的方程式,接着使用对应的函数方法来求解。
求极限
例如需要求以下的极限:
实现代码如下:
from sympy import *
def qiujixain():
x = symbols('x')
expr = x**2/exp(x)
# 无穷用两个o表示
result = limit(expr,x,oo)
print('被求函数为:')
pprint(expr)
print('结果为:')
pprint(result)
if __name__ == '__main__':
qiujixain()
代码中limit函数用于求极限,第一个参数放表达式,第二个为自变量,第三个为表达式在某处的极限。输出结果如下:
微分
求微分用到diff()函数,例如需要求以下微分:
实现代码如下:
from sympy import *
def qiuweifen():
"""求微分"""
f = Function('f')
x = symbols('x')
f = exp(tan(1/x)) * sin(1/x)
result = diff(f,x)
print('被求函数为')
pprint(f)
print('结果为:')
pprint(result)
if __name__ == '__main__':
qiuweifen()
diff()函数第一个参数存放表达式,第二个参数存放对哪个变量求微分,如需要计算高阶导数,可在后面加数字,没写默认求一阶导数。输出结果如下:
diff()函数也可以用来求偏导,例如求以下的偏导:
实现代码如下:
from sympy import *
from sympy.abc import x,y
def qiuweifen():
"""求偏导"""
# 定义一个函数f,它是x,y的函数
f = Function('f')(x,y)
f = x**2 * sin(2*y)
# 对x求偏导
fx = f.diff(x)
# 对y求偏导
fy = f.diff(y)
print('所求函数为:')
pprint(f)
print('对x偏导为:')
pprint(fx)
print('对y偏导为:')
pprint(fy)
if __name__ == '__main__':
qiuweifen()
输出结果为:
不定积分与定积分
在数学上不定积分的表达式如下:
抛开数学上求解不定积分的方法,我们无需关心怎么算,只需关系怎么让计算机帮我们算。例如需要计算以下的不定积分:
求不定积分需要用到integrate()函数,实现代码如下:
from sympy import *
def budingjifen():
"""求不定积分"""
x = symbols('x')
expr = (x**2)/(x**2 + 1)
result = integrate(expr,x)
print("被积函数为:")
pprint(expr)
print('不定积分结果为:')
pprint(result)
if __name__ == '__main__':
budingjifen()
效果如下:
接下来看定积分,定积分比不定积分多了个范围限制,比如求下面的定积分:
与不定积分一样,求积分使用的是interate()函数,但求定积分需要增加范围限制。这个例子需要先求微分再求积分,代码如下:
from sympy import *
def dingjifen():
"""求定积分"""
f = Function('f')
x = symbols('x')
f = exp(-x**2)
expr_1 = diff(f,x)
expr_2 = diff(f,x,2)
expr = expr_1 * expr_2
result = integrate(expr,(x,0,1))
print('被积函数为:')
pprint(expr)
print('结果为:')
pprint(result)
if __name__ == '__main__':
dingjifen()
输出结果如下:
常微分方程与偏微分方程
常微分方程是指微分方程中只有一个变量的方程,解常微分方程需要用到dsolve()函数。例如需要求以下的常微分方程:
实现代码如下:
from sympy import *
def weifenfangcheng():
"""常微分方程"""
f = Function('f')
x = symbols('x')
expr = diff(f(x),x,2) + 2*diff(f(x),x) + 3*f(x)
result = dsolve(expr,f(x))
pprint(result)
if __name__ == '__main__':
weifenfangcheng()
使用dsolve求结果,输出结果如下:
偏微分方程是指微分方程中含有多个变量的方程,解偏微分方程用到pdsolve()函数。例如需要求以下偏微分方程:
实现代码为:
from sympy import *
from sympy.abc import x,y
def weifenfangcheng():
"""偏微分方程求解"""
f = Function('f')
# 表示z为x,y的函数
z = f(x,y)
zx = z.diff(x)
zy = z.diff(y)
eq = Eq(1 + (2*(zx/z)) + (3*(zy/z)))
result = pdsolve(eq)
print('微分方程为:')
pprint(eq)
print('求得函数为:')
pprint(result)
if __name__ == '__main__':
weifenfangcheng()
输出结果为:
结束
以上为使用Python解决高数中求微分,积分以及微分方程等问题的过程,可以看到重点已经由怎么用数学方法解决转变为如何将表达式正确的传给计算机,让计算机求解。对于其他问题例如矩阵化简,级数展开等也可以解决,具体可以参考Sympy的文档说明。
网友评论