在开始前,请对Python数学之符号数学 | LittleAO学习小站有基本的了解。
使用sympy包求解微积分问题
常用函数
在python的math包中,可以调用sin()、log2()等函数,但这些函数不适用于符号。在sympy包中也有这些函数,它既可以完成math模块中的功能,还可以实现函数中包含未知数。
import sympy as sp
u = sp.Symbol('u')
t = sp.Symbol('t')
g = sp.Symbol('g')
theta = sp.Symbol('theta')
sp.solve(u*sp.sin(theta)-g*t, t)[0]
结果:

假设
我们可以判断一个未知数的情况,例如我们想知道x为正时,x+5是否为正,程序如下:
import sympy as sp
x = sp.symbols('x', positive=True)
if x + 5 > 0:
print('yes')
else:
print('no')
运行结果输出了yes。如果我们不能判断x+5是否为正,那么会出现报错。
在上面的代码中,我们声明了x为positive,同样我们还可以声明它是实数、整数、负数、虚数等。这些声明称为假设。
计算函数极限
我们可以使用sympy计算函数的极限。
比如我们可以计算\frac 1 x在x趋于正无穷时的极限:
import sympy as sp
x = sp.symbols('x', positive=True)
l = sp.limit(1/x, x, sp.S.Infinity) # lim x->oo 1/x, S类中包含了正负无穷和其他特殊值
l.doit() # 求解
结果等于0。
默认情况下,我们从正方向计算极限(负无穷则默认为负),我们可以自己定义求解的方向,例如我们要求解1/x中从负方向趋向于0时的极限。
import sympy as sp
x = sp.symbols('x', positive=True)
l = sp.limit(1/x, x, 0, dir='-') # lim x->-0 1/x
l.doit() # 求解
解得结果为-\infty。
此外,sympy还可以自动处理不定型的函数的极限,例如求解\frac{\sin x}{x}在x=0时的极限:
import sympy as sp
x = sp.symbols('x', positive=True)
l = sp.limit(sp.sin(x)/x, x, 0)
l.doit() # 求解
运行结果为1。
函数求导
我们可以使用Derivative类进行求导。例如:
import sympy as sp
t = sp.symbols('t')
St = 5*t**2 + 2*t + 8
sp.Derivative(St, t).doit()
运行结果为:10t+2。
当然还可以用这个函数来求偏导:
import sympy as sp
x = sp.symbols('x')
y = sp.symbols('y')
exp = 2*x*y + x*y**2
sp.Derivative(exp, x).doit()
运行结果为:y^{2} + 2 y。
我们还可以使用diff函数:
import sympy as sp
x = sp.symbols('x')
y = sp.symbols('y')
exp = 2*x*y + x*y**2
sp.diff(exp, x)
求解微分方程
例如求解2 x y^{2} = \frac{d y}{d x} :
import sympy as sp
x = sp.symbols('x')
y = sp.Function('y') # y是x的函数
exp = 2 * x * y(x)**2 - y(x).diff(x)
sp.dsolve(exp, y(x))
使用dsolve来求解有关微分方程的问题,上述代码运行结果为:y{\left(x \right)} = - \frac{1}{C_{1} + x^{2}}。
求积分
我们可以使用Integral来求解不定积分:
import sympy as sp
x = sp.symbols('x')
k = sp.symbols('k')
sp.Integral(k*x, x).doit()
运行结果为:\frac{k x^{2}}{2}。
也可以求定积分:
import sympy as sp
x = sp.symbols('x')
k = sp.symbols('k')
sp.Integral(k*x, (x, 0, 2)).doit()
运行结果为:2k。
评论区