您的位置:首页 > 编程语言 > Python开发

用Python学《微积分B》(有理式与简单无理式积分套路)

2017-09-04 16:55 399 查看
前一篇介绍了“换元法”和“分部积分”两种一般的求积分的方法,这一篇主要学习对“有理式”和“简单无理式”求积分的套路。这一篇是对不定积分方法的总结,在此特地介绍一个在线积分器symbolab,对于复杂的积分式可以用它们辅助计算。

一、知识点

1,四个分式模式

  所谓的“套路”,都是通过一系列变换,把被积函数转化为“积分表”中的函数及其组合。积分表中有四个积分式对于分式有理式非常重要,甚至被总结为四种模式(pattern)。

1)一次单因式(对数模式)

∫Aax+bdx=Aaln|ax+b|+C

2)一次k重因式

∫A(ax+b)kdx=A(1−k)a⋅1(ax+b)k−1+C

  上式运用了“凑微分”。

3)二次单因式(反正切模式)

∫Bx+Dpx2+qx+rdx=B2p∫2px+qpx2+qx+rdx+(D−Bq2p)1p∫dx(x+q2p)2+4pr−q24p2=B2pln∣∣px2+qx+r∣∣+2pD−qBp4pr−q2−−−−−−−√arctan(2px+q4pr−q2−−−−−−−√)+C

4)二次k重因式

∫Bx+D(px2+qx+r)kdx=B2p(1−k)⋅1(px2+qx+r)k−1+2pD−qBp4pr−q2−−−−−−−√∫dx[(x+q2p)2+(4pr−q2√2p)2]k

  上式先“凑微分”,然后换元,再分部积分,并运用递归,可以求出原函数。其中,∫dx(x2+a2)n,n是大于1的自然数使用分部积分可以得到它的递归公式,如下:

In+1=2n−12na2In+x2na2(x2+a2)n+1

I1=1aarctan(xa)+C

2,分式有理式

  定理:设Pm(x)Qn(x)是一真分式,则它可以唯一地分解为最简分式之和。

例:

∫x+1x2−4x+3dx=∫[Ax−1+Bx−3]dx

  通分,解系数方程,求出A和B。

  分式有理式求积分的方法又称为“部分分式积分法”(Interation by Partial Fractions),它是基于“部分分式分解”(Partial Fraction decomposition)得来的一种求特定积分的方法。sympy提供了“apart()”函数用于执行“部分分式分解”操作。下面再给几个相关链接:

  部分分式积分

  partial fraction expand in matlab

3,三角函数有理式

  对sin(x)和cos(x)及常数进行有限次的四则运算得到的表达式称为“三角函数有理式”,记作R( sin x, cos x ),其中 R - Rational

  对于三角函数有理式∫R[sin(x),cos(x)]dx的积分套路如下:

  (根据“三角函数万能公式”)取t=tanx2,则x=2arctan(t),dx=21+t2dt,sin(x)=2t1+t2,cos(x)=1−t21+t2,于是可得:

∫R[sin(x),cos(x)]dx=∫R[2t1+t2,1−t21+t2]21+t2dt

  很显然,这里应用的是“反函数换元法”(第二类换元法)。

4,简单无理式

  无理式积分的困难在于被积函数中带有开发运算,因此,一般的思路是先进行“有理化”。如下:

1)∫R(x,ax+b−−−−−√n)dx,(a≠0)

  取ax+b=tn,可得

∫R(x,ax+b−−−−−√n)dx=∫R(tn−ba,t)ntn−1adt

2)∫R(x,ax+bcx+d−−−−√n)dx

  取ax+bcx+d=tn,可得

∫R(x,ax+bcx+d−−−−−−√n)dx=∫R(tnd−ba−tnc,t)n(ad−cb)tn−1(a−ctn)2dx

3)∫R(x,ax2+bx+c−−−−−−−−−−√)dx,(a≠0)

  先凑成“平方和”或“平方差”形式,再应用三角函数“平方公式”进行变量替换。

4,可积与求出积分

  在“不定积分的概念”那一节,讲到“连续函数”甚至“满足介值定理的函数”都可积(原函数存在)。但是,“可积”不代表一定能求出它的积分表达式(用初等函数表示),例如:e−x2,sin(x)x,1ln(x),1−12sin2(x)−−−−−−−−−−−√。

  事实上,大多数初等函数的原函数都不能表示为初等函数。这从一个侧面显示了“求导”的降维作用,它可以把非初等函数问题转换为初等函数问题来研究。

二、思考题

1,是否所有的分式有理函数在实数范围内都可以化为形如ax−b简单分式的和?

答:否!本课程中的“Partial Fraction decomposition”定理只是说可以将任意有理分式分解化为最简分式,而这里所说的最简分式包含了四个,而不只是一次单因式。比如,并不是所有的二次单因式都能化为一次单因式。

2,是否可以得到“分式有理函数的不定积分都可以用初等函数表示”的结论?

答:是!首先,所有的分式有理函数都可以化为一个多项式(整式)与一个真分式之和。然后,根据定理,所有的真分式又可以分解为四个模块(最简分式)的线性组合,而最简分式都可积,且积分后的原函数都是初等函数,那么这个命题成立。

注:这个问题非常有意思。有了计算机之后,人们开始从繁琐的运算中解放出来了,当然这个运算也包括积分运算。但是,对于计算机来说,判断一个函数是否可积,是比按程序计算积分更大的挑战。而从这个问题出发,人们可以先判断一个函数是否可积,可积再交给计算机去执行积分运算,不可积就不要浪费时间和计算资源了。或许,这也暗合“数据标记”吧!

三、选择题

from sympy import *
init_printing()
#Exercise 6-4-3
x = Symbol('x')
integrate(1 / (1 - x ** 2), x)


−12log(x−1)+12log(x+1)

#Exercise 6-4-4
t = Symbol('t')
integrate((t+4) / (t ** 2 + 5 * t - 6), t)


57log(t−1)+27log(t+6)

#Exercise 6-4-5
x = Symbol('x')
integrate((2 * x ** 2 + 2 * x + 13) / ((x - 2) * (x ** 2 + 1) ** 2), x)


−4x−32x2+2+log(x−2)−12log(x2+1)−4atan(x)

#Exercise 6-4-6
x = Symbol('x')
integrate(1 / (x ** 4 + 1), x)


−2√8log(x2−2√x+1)+2√8log(x2+2√x+1)+2√4atan(2√x−1)+2√4atan(2√x+1)

  对于∫1x4+1dx=?,sympy已经求出了积分,但是这个结果可以写得更简单一些。其中对数表达式可以合并,反正切表达式也可以合并。关于反正切的合并如下:

  根据正切函数的和差公式:tan(α±β)=tan(α)±tan(β)1∓tan(α)tan(β),两边取反函数,可得:

arctan(a)±arctan(b)=α±β=arctan[tan(α)±tan(β)1∓tan(α)tan(β)]=arctana±b1∓ab

所以,这个积分的结果可以简写为:

∫11+x4dx=2√8lnx2+2√x+1x2−2√x+1+2√4arctanx2−12√x+π2+C

注意:反正切函数合并后,又用了反正切函数的“负数关系”和“倒数关系”。

下面再来看手动计算:

1)首先试着因式分解,很明显,不是很容易分解。那么不妨假设根据有理分式的分解定理,将它分解成4个二次k重因式的组合。

2)列方程组解出各系数。

3)分别对各个因式积分。

注:从这一题,我得到了一个意外的发现,对于像11+x4或1+x4这样的式子,直接用sympy的apart()函数,并不能对它进行分解。如果我们要做的不是求积分,而是进行“partial fraction decomposition”,不妨反过来,先求积分,再对各部分求导,这正式因式分解需要的么?

#Exercise 6-5-1
x = Symbol('x')
integrate(1 / (sin(x) + 1), x)


−2tan(x2)+1

#Exercise 6-5-2
x = Symbol('x')
integrate(1 / (1 - cos(x)), x)


−1tan(x2)

#Exercise 6-5-3
x = Symbol('x')
integrate((1+sin(x)) / (1 + cos(x)), x)


log(tan2(x2)+1)+tan(x2)

#Exercise 6-5-4
x, a = symbols('x a')
b = Symbol('b', nonzero=True)
integrate(tan(x) / (a ** 2 * (cos(x)) ** 2 +  b ** 2 * (sin(x)) ** 2), x)


∫tan(x)a2cos2(x)+b2sin2(x)dx

#Exercise 6-5-4b
x, t, a = symbols('x t a')
b = Symbol('b', nonzero=True)
expr1 = 2 * t / (1 + t ** 2)
expr2 = (1 - t ** 2) / (1 + t ** 2)
expr3 = 2 / (1 + t ** 2)
expr = simplify((expr1 / expr2) / (a ** 2 * expr2 ** 2 + b ** 2 * expr1 ** 2) * expr3)
inte = integrate(expr, t)
expr, inte


⎛⎝⎜−4t(t2+1)(t2−1)(a2(t2−1)2+4b2t2),−1b2log(t2−1)+12b2log(t4+1+t2a2(−2a2+4b2))⎞⎠⎟

inte.subs(t, tan(x / 2))


−1b2log(tan2(x2)−1)+12b2log(tan4(x2)+1+1a2(−2a2+4b2)tan2(x2))

进一步化简,将半角化简掉。

根据三角函数半角公式:

tan(θ2)=±1−cos(θ)1+cos(θ)−−−−−−−−−√=sin(θ)1+cos(θ)=1−cos(θ)sin(θ)

代入上式,并合并对数,再化简可得:

x, t, a, b = symbols('x t a b')
expr = log((t ** 4 + 1 - 2 * t ** 2 + 4 * b ** 2 / a ** 2 * t ** 2) / (t ** 2 -1) ** 2)
expr, simplify(expr.subs(t, sqrt((1 - cos(x)) / (1 + cos(x)))))


⎛⎝log⎛⎝1(t2−1)2(t4−2t2+1+4b2a2t2)⎞⎠,log(1+b2a2tan2(x))⎞⎠

#Exercise 6-5-5
x = symbols('x')
integrate(sin(2 * x) / ((cos(x)) ** 2 +  2 * sin(x)), x)


∫sin(2x)2sin(x)+cos2(x)dx

很明显,这个直接积分积不出来。当然,我们也可试着用上一题的方法来换元,但是,最后的结果会很复杂,也不能像上一题一样化简。那么,我们根据它的特点来手动计算吧:

∫sin(2x)cos2(x)+2sin(x)dx=∫sin(2x)1−sin2(x)+2sin(x)dx=∫2sin(x)d[sin(x)]1−sin2(x)+2sin(x)

然后再应用换元法

x, t = symbols('x t')
expr = integrate(2 * t / (1 - t ** 2 + 2 * t), t)
expr.subs(t, sin(x))


−2(−2√4+12)log(sin(x)−1+2√)−2(2√4+12)log(sin(x)−2√−1)

#Exercise 6-5-6
x, t = symbols('x t')
expr = integrate(6 * t ** 4 / (t ** 5 + 1), t)
expr.subs(t, x ** (1 / 6))


65log(x0.833333333333333+1)

#Exercise 6-5-7
x, t = symbols('x t')
expr = integrate(t * sqrt(t + 2), t)
expr


6t921+2t−−−−−√15t2+30t+16t721+2t−−−−−√15t2+30t−8t521+2t−−−−−√15t2+30t−32t321+2t−−−−−√15t2+30t+162√t215t2+30t+322√t15t2+30t

#Exercise 6-5-7b
x, t = symbols('x t')
expr = integrate((t ** 2 -2) * t * 2 * t, t)
expr, expr.subs(t, sqrt(x - 2))


(2t55−4t33,25(x−2)52−43(x−2)32)

#Exercise 6-5-8
x = symbols('x')
expr = integrate(sqrt(x ** 2 -2 * x + 1) / (x -1), x)
expr


x2−2x+1−−−−−−−−−√

#Exercise 6-5-9
x = symbols('x')
expr = integrate(sqrt(E ** x + 1), x)
expr


∫ex+1−−−−−√dx

很明显,这个直接积分积不出来。先“有理化”换元,再积分:

#Exercise 6-5-9b
x, t = symbols('x t')
expr = integrate(2 * t ** 2 / (t ** 2 - 1), t)
expr.subs(t, sqrt(E ** x + 1))


2ex+1−−−−−√+log(ex+1−−−−−√−1)−log(ex+1−−−−−√+1)

#Exercise 6-5-10
x = symbols('x')
expr = integrate(((x - 1) * (x + 1) ** 2) ** (1 / 3), x)
expr


∫((x−1)(x+1)2)0.333333333333333dx

这一题不能直接换元,需要先变换。如下:

∫dx(x−1)(x+1)2−−−−−−−−−−−−√3=∫dx(x+1)∗x−1x+1−−−√3

#Exercise 6-5-10b
x, t = symbols('x t')
g = ((x - 1) / (x + 1)) ** (1 / 3)
eq = Eq(g, t)
solve(eq, x)


[−t3+1.0t3−1.0]

diff(-(t ** 3 + 1) / (t ** 3 - 1), t)


−3t2(−t3−1)(t3−1)2−3t2t3−1

x, t = symbols('x t')
h = diff(-(t ** 3 + 1) / (t ** 3 - 1), t)
expr = - (t ** 3 - 1) / (2 * t) * h
inte = integrate(expr, t)
inte.subs(t, ((x - 1) / (x + 1)) ** (1 / 3))


−log((x−1x+1)0.333333333333333−1)+12log((x−1x+1)0.333333333333333+(x−1x+1)0.666666666666667+1)−3√atan(23√3(x−1x+1)0.333333333333333+3√3)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  微积分 python