第5章不定积分 5.1不定积分的概念与性质 要计算积分,可使用sympy中的integrate()函数。该函数既可计算不定积分,也可计算定积分。本章先学习不定积分的计算,使用时仅需将函数表达式及变量传递给integrate()函数,即integrate(f, var)。下面来看几个例子。 【例5.1】求∫x2dx。 解代码如下: from sympy import * x=symbols('x') init_printing() integrate(x**2,x) 运行结果为: x3/3。 注意: 积分结果不会自动添加任意常数(+C)。 【例5.2】求∫(x-1)3x2dx。 解代码如下: x=symbols('x') init_printing() ex_2=(x-1)**3/(x**2) integrate(ex_2,x) 运行结果为: x2/2-3x+3log(x)+1/x。 注意: 返回结果中,对数函数没有加绝对值,它默认x为正数。 【例5.3】求∫sin2x2dx。 解代码如下: x=symbols('x') init_printing() ex_3=lambda x:(sin(x/2))**2 integrate(ex_3(x),x) 运行结果为: x/2-sinx/2cosx/2。 Python漫游数学王国——高等数学、线性代数、数理统计及运筹学 第5章不定积分 0 0 【例5.4】求∫2x4+x2+3x2+1dx。 解代码如下: x=symbols('x') init_printing() def ex_4(x): return(2*x**4+x**2+3)/(x**2+1) integrate(ex_4(x),x) 运行结果为: 2x3/3-x+4atanx。 5.2换元积分法 我们不必关心sympy是如何求出一个不定积分的,仅需熟练使用integrate()函数就可以。再来看几个例子。 【例5.5】求∫1a2+x2dx(a≠0)。 解代码如下: from sympy import * x,a=symbols('x a',real=True) init_printing() integrate(1/(x**2+a**2),x) 运行结果为: atan(x/a)/a。 【例5.6】求∫sin2xcos4xdx。 解代码如下: x=symbols('x',real=True) init_printing() f=sin(x)**2*cos(x)**4 result=integrate(f,x) result 运行结果为: x/16-sin(x)cos5(x)/6+sin(x)cos3(x)/24+sin(x)cos(x)/16。 该结果可进一步化简,代码如下: simplify(result) 运行结果为: x/16-(cos(2x)+1)2sin(2x)/48+sin(2x)/24+sin(4x)/192。 注释: 这里simplify()化简结果不太理想。 【例5.7】求∫cscxdx。 解代码如下: x=symbols('x',real=True) init_printing() result=integrate(csc(x),x) result 运行结果为: log(cos(x)-1)/2-log(cos(x)+1)/2。 再一次测试化简函数simplify(),代码如下: simplify(result) 运行结果为: log(cos(x)-1)/2-log(cos(x)+1)/2。 注释: simplify()的化简结果有时可能不尽如人意。 【例5.8】求∫a2-x2dx(a>0)。 解代码如下: a=symbols('a',positive=True) x=symbols('x',real=True) init_printing() integrate(sqrt(a**2-x**2),x) 运行结果为: a2asinxa/2+xa2-x2/2。 【例5.9】求∫1x2+a2dx(a>0)。 解代码如下: a=symbols('a',positive=True) x=symbols('x',real=True) init_printing() f=1/(sqrt(x**2+a**2)) integrate(f,x) 运行结果为: asinh(x/a)。 注释: 该结果可进一步手工验证,与积分表中的结果一致。 【例5.10】求∫x3(x2-2x+2)2dx。 解代码如下: x=symbols('x',real=True) init_printing() integrate(x**3/((x**2-2*x+2)**2),x) 运行结果为: -xx2-2x+2+log(x2-2x+2)/2+2atan(x-1)。 5.3分部积分法 【例5.11】求∫xarctanxdx。 解代码如下: from sympy import * x=symbols('x') init_printing() integrate(x*atan(x),x) 运行结果为: x2atan(x)/2-x/2+atan(x)/2。 【例5.12】求∫exsinxdx。 解代码如下: from sympy import * x=symbols('x') init_printing() integrate(E**x*sin(x),x) 运行结果为: exsin(x)/2-excos(x)/2。 【例5.13】求∫sec3xdx。 解代码如下: from sympy import * x=symbols('x') init_printing() res=integrate(sec(x)**3,x) res 运行结果为: -log(sin(x)-1)/4+log(sin(x)+1)/4-sin(x)2sin2(x)-2。 化简代码如下: simplify(res) 运行结果为: -log(sin(x)-1)/4+log(sin(x)+1)/4+sin(x)2cos2(x)。 注释: 读者通过这个例子应进一步理解sympy为符号运算的含义,它不负责检验式子是否合理,就像这里的log(sin(x)-1)。 5.4有理函数的积分 首先介绍几个初等运算的函数。 1. cancel()函数 代码如下: from sympy import * x=symbols('x') init_printing() #约分:cancel() cancel((x**2-2*x+1)/(x**2-1)) 运行结果为: x-1x+1。 注释: cancel()用于有理函数的约分,输出形式为分式的规范标准型,即分子与分母为整系数的多项式,且分子与分母无公因子。 2. expand()函数 代码如下: x=symbols('x') init_printing() #展开:expand() expand((x+1)**3) 运行结果为: x3+3x2+3x+1。 注释: expand()可将函数展开成标准多项式的形式,它同时提供了多种展开方法,可根据实际需要选取。这里仅考虑函数的展开功能。 3. factor()函数 代码如下: x=symbols('x') init_printing() #分解因式:factor() factor(x**3+3*x**2+3*x+1) 运行结果为: (x+1)3。 注释: factor()可将函数分解为有理数域上的不能再分解的因子乘积(分解因式)。 4. apart()函数 代码如下: x=symbols('x') init_printing() #将假分式拆分为几个真分式的和:apart() apart((2*x**4+x**2+3)/(x**2+1),x) 运行结果为: 2x2-1+4x2+1。 注释: apart()对有理函数执行部分分式分解。 上述几个函数也可被看作“化简”函数,当simplify()的化简结果偏离预期时,可考虑上述特定功能的“化简”函数。下边来看几个有理函数的积分。 【例5.14】求∫x+2(2x+1)(x2+x+1)dx。 解代码如下: x=symbols('x') init_printing() ex_1=(x+2)/((2*x+1)*(x**2+x+1)) integrate(ex_1,x) 运行结果为: logx+1/2-log(x2+x+1)/2+3atan23x/3+3/3/3。 【例5.15】求∫x-3(x-1)(x2-1)dx。 解代码如下: x=symbols('x') init_printing() ex_2=(x-3)/((x-1)*(x**2-1)) integrate(ex_2,x) 运行结果为: logx-1-log(x+1)+1x-1。 【例5.16】求∫1+sinxsinx(1+cosx)dx。 解代码如下: x=symbols('x') init_printing() ex_3=(1+sin(x))/(sin(x)*(1+cos(x))) integrate(ex_3,x) 运行结果为: logtan(x/2)/2+tan2(x/2)/4+tan(x/2)。 【例5.17】求∫1(1+3x)xdx。 解代码如下: x=symbols('x') init_printing() ex_4=1/(sqrt(x)+x**(S(5)/6)) integrate(ex_4,x) 运行结果为: 66x-6atan(6x)。 对于sympy来说,积分要比求导复杂得多(当然,对于手工计算也一样)!