Python 基于积分原理计算定积分并可视化数值积分计算的动画过程

举报
叶庭云 发表于 2022/03/15 22:43:48 2022/03/15
【摘要】 文章目录 一、问题描述二、代码实现 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代码跑起来,如下所示:

在这里插入图片描述


补充学习:

文章来源: yetingyun.blog.csdn.net,作者:叶庭云,版权归原作者所有,如需转载,请联系作者。

原文链接:yetingyun.blog.csdn.net/article/details/123509263

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。