python使用微积分计算图:python微积分-两个函数曲线及其合围区域的面积
python使用微积分计算图:python微积分-两个函数曲线及其合围区域的面积已知 f(x)=sin(x) g(x)=cos(x) (0<x<π),求这两个函数曲线所形成的非闭合区域的面积def Left(x): return g(x) - f(x) def Right(x): return f(x) - g(x) area_Left = quad(Left 0 roots.root)[0] area_Right = quad(Right roots.root 2)[0] area_Right area_Left两个闭合区域的面积之和为2.0043456631323346。# 求函数f(x)和g(x)图形合围区域的面积, a1 = quad(f -1 1)[0] a2 = quad(g -1 1)[0] abs(a1 - a2)定义求合围面积的函数def enclosed_area(x): return g(x) - f(x)求合围区域的面
本文讲述用scipy和matplotlib工具包来求解两个函数的曲线所合围的一个或多个区域的面积,以便在学习定积分的过程中能更好地理解定积分的几何意义。
导入本文各例题所必要的工具包:
import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import quad
from math import pi
例 1:函数f(x)和g(x)如图1,求这两个曲线合围的区域的面积
例1求解步骤如下:
- 写出f(x)和g(x)的自定义函数,并确定 x 的取值范围
def f(x): return 0.5*x**2
def g(x): return 1/(1 x**2)
x = np.linspace(-2 2 100)
- 绘制f(x)与g(x)曲线的代码,输出结果如图2
plt.plot(x f(x))
plt.plot(x g(x))
plt.show()
- 求出这两个函数的曲线合围区域的面积
要想求出这两个函数的曲线合围区域的面积,就要找到两个曲线的交点,即f(x)和g(x)联立方程组求得两个根:-1 和 1,然后用scipy中的求积分函数quad(),代码如下:
# 求函数f(x)和g(x)图形合围区域的面积,
a1 = quad(f -1 1)[0]
a2 = quad(g -1 1)[0]
abs(a1 - a2)
- 定义求合围面积的函数
def enclosed_area(x): return g(x) - f(x)
- 求合围区域的面积
quad(enclosed_area -1 1)
计算结果:(1.2374629934615633 1.3738599074625972e-14),包括两个数值,前面一个为面积的值,后面一个是误差。
例 2 :函数f(x)和g(x)如图3,求这两个曲线合围的闭合区域的面积之和例2求解步骤如下:
- 写出f(x)和g(x)的自定义函数,并确定 x 的取值范围
def f(x): return 1 x np.e**(x**2 - 2 * x)
def g(x): return x**4 - 6.5*x**2 6*x 2
x = np.linspace(0 2 100)
- 绘制f(x)与g(x)曲线的代码,输出结果如图4
plt.plot(x f(x))
plt.plot(x g(x))
plt.fill_between(x f(x) g(x) color = 'pink' alpha = 0.5)
plt.text(0.5 2.5 'Left')
plt.text(1.5 2.0 'Right')
plt.show()
- 绘制f(x)-g(x)曲线的代码,输出结果如图5,
plt.plot(x f(x)- g(x))
plt.axhline(color = 'black')
plt.title('f(x) - g(x) = 0 ');
- 优化 f(x) 和 g(x) 的求解结果
from scipy.optimize import root_scalar
- 定义f(x) - g(x)的函数
def difference(x): return f(x) - g(x)
- 求出f(x) - g(x) = 0 的根
root_scalar(difference bracket = [0.75 1.25] method = 'bisect')
roots = root_scalar(difference bracket = [0.75 1.25] method = 'bisect')
roots.root
结果为1.032831888363944。
- 绘制f(x)-g(x)曲线的代码,并在曲线上标出零点,输出结果如图6,
- 绘制f(x)-g(x)曲线,并标出交点,如图7
- 定义求合围区域面积的函数,并计算出两个合围区域的面积
def Left(x): return g(x) - f(x)
def Right(x): return f(x) - g(x)
area_Left = quad(Left 0 roots.root)[0]
area_Right = quad(Right roots.root 2)[0]
area_Right area_Left
两个闭合区域的面积之和为2.0043456631323346。
例 3 : 求f(x)和g(x)的函数曲线所形成的非闭合区域的面积已知 f(x)=sin(x) g(x)=cos(x) (0<x<π),求这两个函数曲线所形成的非闭合区域的面积
例3求解步骤如下:
- 写出f(x)和g(x)的自定义函数,并确定 x 的取值范围
def f(x): return np.sin(x)
def g(x): return np.cos(x)
x = np.linspace(0 pi 100)
- 绘制f(x)与g(x)曲线的代码,输出结果如图8
plt.plot(x f(x))
plt.plot(x g(x))
plt.fill_between(x f(x) g(x) color = 'pink' alpha = 0.5)
plt.text(0.25 0.60 'Left')
plt.text(1.8 0.25 'Right')
plt.show()
- 绘制f(x)-g(x)曲线的代码,输出结果如图9,
plt.plot(x f(x)- g(x))
plt.axhline(color = 'black')
plt.title('f(x) - g(x) = 0 ');
- 优化 f(x) 和 g(x) 的求解结果
from scipy.optimize import root_scalar
- 定义f(x) - g(x)的函数
def difference(x): return f(x) - g(x)
- 求出f(x) - g(x) = 0 的根
root_scalar(difference bracket = [0 pi] method = 'bisect')
roots = root_scalar(difference bracket = [0 pi] method = 'bisect')
roots.root
结果为0.7853981633974483。
- 绘制f(x)-g(x)曲线的代码,并在曲线上标出零点,输出结果如图10,
plt.plot(x f(x) - g(x))
plt.axhline(color = 'black')
plt.title('f(x) - g(x) = 0');
plt.plot(roots.root difference(roots.root) 'ro');
- 绘制f(x)-g(x)曲线,并标出交点,如图11
plt.plot(x f(x))
plt.plot(x g(x))
plt.plot(roots.root f(roots.root) 'ro')
- 定义求非闭合区域面积的函数,并计算出两个非闭合区域的面积
def Left(x): return g(x) - f(x)
def Right(x): return f(x) - g(x)
area_Left = quad(Left 0 roots.root)[0]
area_Right = quad(Right roots.root 2)[0]
area_Right area_Left
两个非闭合区域的面积之和为1.3352765344676507。
例 4 :如图12,求f(x)和g(x)的曲线合围而成的多个区域的面积之和,例4中f(x)和g(x)两条曲线形成的的合围区域较多,但是求区域面积的方法与例2和例3类似,求解步骤如下:
def blue_curve(x): return x**4 2*x**3 - 12*x**2 - 15*x 22
def yellow_curve(x): return 0.5*np.sin(x)
x = np.linspace(-4.5 4 100)
绘制f(x)和g(x)的曲线图(图13),代码如下:
plt.plot(x blue_curve(x))
plt.plot(x yellow_curve(x))
plt.fill_between(x blue_curve(x) yellow_curve(x) color = 'pink' alpha = 0.5)
plt.text(-4.3 5 '1')
plt.text(-3.2 -8 '2')
plt.text(-1 5 '3')
plt.text(2 -10 '4')
plt.text(3.5 5 '5')
plt.show()
- 绘制f(x)-g(x)曲线的代码,并在曲线上标出零点,输出结果如图14
plt.plot(x blue_curve(x) - yellow_curve(x))
plt.axhline(color = 'black')
plt.title('f(x) - g(x) = 0');
plt.plot(roots_1.root difference(roots_1.root) 'ro')
plt.plot(roots_2.root difference(roots_2.root) 'ro')
plt.plot(roots_3.root difference(roots_3.root) 'ro')
plt.plot(roots_4.root difference(roots_4.root) 'ro');
- 定义求合围区域面积的函数,共5个
def area_One(x): return blue_curve(x) - yellow_curve(x)
def area_Two(x): return yellow_curve(x) - blue_curve(x)
def area_Three(x): return blue_curve(x) - yellow_curve(x)
def area_Four(x): return yellow_curve(x) - blue_curve(x)
def area_Five(x): return blue_curve(x) - yellow_curve(x)
- 求出五个合围区域的面积,及五个合围区域面积的和
area_first = quad(area_One -4 roots_1.root)[0]
# (合围区域1的面积为2.269226788589267)
area_second = quad(area_Two roots_1.root roots_2.root)[0]
# (合围区域2的面积为14.145183556035736)
area_third = quad(area_Three roots_2.root roots_3.root)[0]
# (合围区域3的面积为52.57306136862575)
area_fourth = quad(area_Four roots_3.root roots_4.root)[0]
# (合围区域4的面积为32.5705234694899)
area_fifth = quad(area_Five roots_4.root 4)[0]
# (合围区域5的面积为65.4734188683106)
Total_area = area_first area_second area_third area_fourth area_fifth
# (5个合围区域的面积之和为167.03141405105126)
(注:图1、图2和图12中,上一行为表达式的显示状态,下一行为表达式的输入状态。)
附:
例题4中 f(x)和g(x)的值差别太大,g(x)在前面的图上看起来是一条直线,当g(x) = 30*sin(x) ,效果如下图。因平台对文章修改有字数限制,前面例4的内容就不修改了,各位看官将就看吧!