用Python学《微积分B》(有理式与简单无理式积分套路)
前一篇介绍了“换元法”和“分部积分”两种一般的求积分的方法,这一篇主要学习对“有理式”和“简单无理式”求积分的套路。这一篇是对不定积分方法的总结,在此特地介绍一个在线积分器和symbolab,对于复杂的积分式可以用它们辅助计算。
一、知识点
1,四个分式模式
所谓的“套路”,都是通过一系列变换,把被积函数转化为“积分表”中的函数及其组合。积分表中有四个积分式对于分式有理式非常重要,甚至被总结为四种模式(pattern)。
1)一次单因式(对数模式)
2)一次k重因式
上式运用了“凑微分”。
3)二次单因式(反正切模式)
4)二次k重因式
上式先“凑微分”,然后换元,再分部积分,并运用递归,可以求出原函数。其中,
2,分式有理式
定理:设
例:
通分,解系数方程,求出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
对于三角函数有理式
(根据“三角函数万能公式”)取
很显然,这里应用的是“反函数换元法”(第二类换元法)。
4,简单无理式
无理式积分的困难在于被积函数中带有开发运算,因此,一般的思路是先进行“有理化”。如下:
1)
取
2)
取
3)
先凑成“平方和”或“平方差”形式,再应用三角函数“平方公式”进行变量替换。
4,可积与求出积分
在“不定积分的概念”那一节,讲到“连续函数”甚至“满足介值定理的函数”都可积(原函数存在)。但是,“可积”不代表一定能求出它的积分表达式(用初等函数表示),例如:
事实上,大多数初等函数的原函数都不能表示为初等函数。这从一个侧面显示了“求导”的降维作用,它可以把非初等函数问题转换为初等函数问题来研究。
二、思考题
1,是否所有的分式有理函数在实数范围内都可以化为形如
答:否!本课程中的“Partial Fraction decomposition”定理只是说可以将任意有理分式分解化为最简分式,而这里所说的最简分式包含了四个,而不只是一次单因式。比如,并不是所有的二次单因式都能化为一次单因式。
2,是否可以得到“分式有理函数的不定积分都可以用初等函数表示”的结论?
答:是!首先,所有的分式有理函数都可以化为一个多项式(整式)与一个真分式之和。然后,根据定理,所有的真分式又可以分解为四个模块(最简分式)的线性组合,而最简分式都可积,且积分后的原函数都是初等函数,那么这个命题成立。
注:这个问题非常有意思。有了计算机之后,人们开始从繁琐的运算中解放出来了,当然这个运算也包括积分运算。但是,对于计算机来说,判断一个函数是否可积,是比按程序计算积分更大的挑战。而从这个问题出发,人们可以先判断一个函数是否可积,可积再交给计算机去执行积分运算,不可积就不要浪费时间和计算资源了。或许,这也暗合“数据标记”吧!
三、选择题
from sympy import *
init_printing()
#Exercise 6-4-3
x = Symbol('x')
integrate(1 / (1 - x ** 2), x)
#Exercise 6-4-4
t = Symbol('t')
integrate((t+4) / (t ** 2 + 5 * t - 6), t)
#Exercise 6-4-5
x = Symbol('x')
integrate((2 * x ** 2 + 2 * x + 13) / ((x - 2) * (x ** 2 + 1) ** 2), x)
#Exercise 6-4-6
x = Symbol('x')
integrate(1 / (x ** 4 + 1), x)
对于
根据正切函数的和差公式:
所以,这个积分的结果可以简写为:
注意:反正切函数合并后,又用了反正切函数的“负数关系”和“倒数关系”。
下面再来看手动计算:
1)首先试着因式分解,很明显,不是很容易分解。那么不妨假设根据有理分式的分解定理,将它分解成4个二次k重因式的组合。
2)列方程组解出各系数。
3)分别对各个因式积分。
注:从这一题,我得到了一个意外的发现,对于像
#Exercise 6-5-1
x = Symbol('x')
integrate(1 / (sin(x) + 1), x)
#Exercise 6-5-2
x = Symbol('x')
integrate(1 / (1 - cos(x)), x)
#Exercise 6-5-3
x = Symbol('x')
integrate((1+sin(x)) / (1 + cos(x)), x)
#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)
#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
inte.subs(t, tan(x / 2))
进一步化简,将半角化简掉。
根据三角函数半角公式:
代入上式,并合并对数,再化简可得:
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)))))
#Exercise 6-5-5
x = symbols('x')
integrate(sin(2 * x) / ((cos(x)) ** 2 + 2 * sin(x)), x)
很明显,这个直接积分积不出来。当然,我们也可试着用上一题的方法来换元,但是,最后的结果会很复杂,也不能像上一题一样化简。那么,我们根据它的特点来手动计算吧:
然后再应用换元法
x, t = symbols('x t')
expr = integrate(2 * t / (1 - t ** 2 + 2 * t), t)
expr.subs(t, sin(x))
#Exercise 6-5-6
x, t = symbols('x t')
expr = integrate(6 * t ** 4 / (t ** 5 + 1), t)
expr.subs(t, x ** (1 / 6))
#Exercise 6-5-7
x, t = symbols('x t')
expr = integrate(t * sqrt(t + 2), t)
expr
#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))
#Exercise 6-5-8
x = symbols('x')
expr = integrate(sqrt(x ** 2 -2 * x + 1) / (x -1), x)
expr
#Exercise 6-5-9
x = symbols('x')
expr = integrate(sqrt(E ** x + 1), x)
expr
很明显,这个直接积分积不出来。先“有理化”换元,再积分:
#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))
#Exercise 6-5-10
x = symbols('x')
expr = integrate(((x - 1) * (x + 1) ** 2) ** (1 / 3), x)
expr
这一题不能直接换元,需要先变换。如下:
#Exercise 6-5-10b
x, t = symbols('x t')
g = ((x - 1) / (x + 1)) ** (1 / 3)
eq = Eq(g, t)
solve(eq, x)
diff(-(t ** 3 + 1) / (t ** 3 - 1), t)
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))