Python 基于积分原理计算定积分并可视化数值积分计算的动画过程
【摘要】
文章目录
一、问题描述二、代码实现
1.
...
一、问题描述
有这样一个问题,如下所示:
∫ 0 1 x 3 + 1 = [ 1 4 x 4 + x ] 0 1 = 1.25 \int_{0}^{1} x^{3}+1=\left[\frac{1}{4} x^{4}+x\right]_{0}^{1}=1.25 ∫01x3+1=[41x4+x]01=1.25
二、代码实现
1. 并基于积分原理计算 ∫ 0 1 x 3 + 1 的值 1. \text { 并基于积分原理计算 } \int_{0}^{1} x^{3}+1 \text { 的值 } 1. 并基于积分原理计算 ∫01x3+1 的值
def func(x):
return x ** 3 + 1
down = 0
upper = 1
interval = np.linspace(start=down, stop=upper, num=100)
result = 0
for i in range(0, len(interval) - 1):
left = interval[i]
right = interval[i + 1]
width = right - left
height = func(left)
area = width * height
result += area
print(f"{result:.2f}")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
结果如下:
取 50 个矩形计算数值积分的时候,已经可以得到 1.24 的结果。
2. 可 视 化 积 分 的 动 画 过 程 2.\text { }可视化积分的动画过程 2. 可视化积分的动画过程
导入需要的依赖库:
import numpy as np
import matplotlib.path as path
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from IPython.display import HTML
from matplotlib.animation import FuncAnimation
import warnings
warnings.filterwarnings("ignore")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
其中,numpy 用来生成点数据,path 是用来生成路径,patches 通过路径连接绘制图像。
更新函数如下:
# 更新函数
def update(frame):
global points, verts, codes
# x轴间隔距离 每个bin
dx = (interval[1] - interval[0]) / bins
points = np.append(points, [[frame, func(frame)]], axis=0)
verts = np.append(verts,
[[frame, 0], [frame, func(frame)], [frame+dx, func(frame)], [frame+dx, 0]], axis=0)
ln[0].set_data(list(zip(*points)))
codes.extend([path.Path.MOVETO] + [path.Path.LINETO] * 3)
barpath = path.Path(verts, codes)
patch = patches.PathPatch(barpath,
facecolor='blue',
edgecolor='yellow', alpha=0.6)
ax.add_patch(patch)
return patch, ln[0]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
初始化 fig 对象与 FuncAnimation 启动动画:
fig, ax = plt.subplots(figsize=(6, 4), dpi=100)
ax.axis(interval)
global points, verts, codes
codes = []
verts = np.empty((0, 2), np.float64)
points = np.empty((0, 2), np.float64)
plt.rcParams['font.sans-serif'] = ['Times New Roman']
plt.rcParams['axes.unicode_minus'] = False
ln = plt.plot([], [], 'ro')
# 设置坐标轴刻度标签的大小
plt.tick_params(axis='x', direction='out',
labelsize=12, length=3.6)
plt.tick_params(axis='y', direction='out',
labelsize=12, length=3.6)
# x y 轴标签 标题 字体设置
plt.xlabel("x",
fontdict={"size": 16, "weight": "bold", "color": "black"})
plt.ylabel("f(x)",
fontdict={"size": 16, "weight": "bold", "color": "black"}
)
plt.grid(alpha=0.48, ls=":")
# FuncAnimation动画 传入fig对象、更新函数 frames
anim = FuncAnimation(fig, update,
frames=np.linspace(*interval[:2], bins),
)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
Python代码跑起来,如下所示:
补充学习:
- https://blog.csdn.net/lhys666/article/details/123451524
- https://blog.csdn.net/lhys666/article/details/122776649
文章来源: yetingyun.blog.csdn.net,作者:叶庭云,版权归原作者所有,如需转载,请联系作者。
原文链接:yetingyun.blog.csdn.net/article/details/123509263
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)