用Manim 实现 积分图像

时间:2024-10-29 17:37:58

 一,介绍

积分的简介

        积分是一种添加切片以找到整体的方法。积分可用于查找区域、体积、中心点和许多有用的东西。但是,最简单的方法是从找到函数和 x 轴之间的区域开始,如下所示:

1.面积是什么?是片 

我们可以在几个点上计算函数,并像这样将宽度 Δx 的切片相加(但答案不是很准确):

 我们可以使 Δx 小得多,并添加许多小切片(答案越来越好):

当切片的宽度接近于零时,答案就接近真正的答案。我们现在将 dx 写为表示 Δx 切片的宽度接近于零。

 这就是积分的基本概念。

接下来用manim实现一下改内容

二,get_riemann_rectangles() 是 Manim 中用于生成 Riemann 矩形图的函数

  1. get_riemann_rectangles(graph, x_range=None, dx=0.1, input_sample_type='left',
  2. stroke_width=1, stroke_color=ManimColor('#000000'), fill_opacity=1, color=
  3. (ManimColor('#58C4DD'), ManimColor('#83C167')), show_signed_area=True,
  4. bounded_graph=None, blend=False, width_scale_factor=1.001)

get_riemann_rectangles() 是 Manim 中用于生成 Riemann 矩形图的函数,通常用于教学或可视化数学概念,如积分、面积的计算等。以下是对该函数及其参数的详细解释:

函数功能

该函数生成一组矩形,表示在给定的曲线下的 Riemann 积分近似。矩形的高度由曲线在指定范围内的值决定,宽度由 dx 参数确定。

参数解释

  1. graph:

    • 描述要绘制的曲线或函数的 Mobject(如 FunctionGraph 对象)。
  2. x_range:

    • 矩形的 x 轴范围,通常是一个元组,例如 (xmin, xmax)。若为 None,将使用图形的默认范围。
  3. dx:

    • 矩形的宽度,设置每个矩形在 x 轴上的宽度。默认值为 0.1
  4. input_sample_type:

    • 确定在 dx 范围内采用哪种高度采样方式。可以是:
      • 'left': 使用左端点作为矩形高度。
      • 'right': 使用右端点作为矩形高度。
      • 'mid': 使用区间中点作为矩形高度。
  5. stroke_width:

    • 矩形边缘的宽度,默认 1
  6. stroke_color:

    • 矩形边缘颜色,使用 ManimColor 对象定义,默认是黑色 ('#000000')。
  7. fill_opacity:

    • 矩形填充透明度,取值范围 0(完全透明)到 1(完全不透明),默认 1
  8. color:

    • 矩形填充的颜色,允许使用一个颜色元组来绘制具有不同渐变色的矩形,默认是 (ManimColor('#58C4DD'), ManimColor('#83C167'))
  9. show_signed_area:

    • 布尔值,决定是否显示有符号的面积。默认 True,表示会根据曲线位置决定矩形的填充方向。
  10. bounded_graph:

  • 可选参数,用于限制矩形的绘制范围,可以提供另一个图形对象。
  1. blend:
  • 布尔值,决定是否平滑填充的矩形。默认为 False
  1. width_scale_factor:
  • 用于更改矩形宽度的比例因子,默认值 1.001,常用于避免矩形之间的重叠。

示例1: 

  1. from manim import *
  2. class GetAreaExample000(Scene):
  3. def construct(self):
  4. .background_color = WHITE
  5. ax = Axes().add_coordinates().set_color(PURPLE)
  6. curve = (lambda x: 2*(x*x*x)+(x**2)/9+x/4+2, x_range=[-2, 2], color=BLACK)
  7. area = ax.get_area(
  8. curve,
  9. x_range=(-1.5, 1),
  10. color=(BLUE, GREEN_D),
  11. opacity=0.2,
  12. )
  13. # 创建 Riemann 矩形
  14. riemann_rects = ax.get_riemann_rectangles(
  15. curve,
  16. x_range=[-1.5, 1],
  17. dx=0.5,
  18. input_sample_type='left',
  19. stroke_color=WHITE,
  20. fill_opacity=0.85,
  21. color=(GREEN,RED ),
  22. #fill_opacity=0.5,
  23. show_signed_area=True
  24. )
  25. text=MathTex(r"f(x)",color=BLACK).shift(2*LEFT+2*DOWN)
  26. y_label = ax.get_y_axis_label("y").set_color(BLACK)
  27. x_label = ax.get_x_axis_label("x").set_color(BLACK)
  28. grid_labels = VGroup(x_label, y_label)
  29. (ax, curve, area,grid_labels,riemann_rects,text)

 运行结果:

示例2: 

  1. from manim import *
  2. class GetAreaExample0001(Scene):
  3. def construct(self):
  4. .background_color = WHITE
  5. ax = Axes().add_coordinates().set_color(PURPLE)
  6. curve = (lambda x: 2*(x*x*x)+(x**2)/9+x/4+2, x_range=[-2, 2], color=BLACK)
  7. area = ax.get_area(
  8. curve,
  9. x_range=(-1.5, 1),
  10. color=(BLUE, GREEN_D),
  11. opacity=0.2,
  12. )
  13. # 创建 Riemann 矩形
  14. riemann_rects = ax.get_riemann_rectangles(
  15. curve,
  16. x_range=[-1.5, 1],
  17. dx=0.15,
  18. input_sample_type='left',
  19. stroke_color=WHITE,
  20. fill_opacity=0.85,
  21. color=(GREEN,RED ),
  22. #fill_opacity=0.5,
  23. show_signed_area=True
  24. )
  25. text=MathTex(r"f(x)",color=BLACK).shift(2*LEFT+2*DOWN)
  26. y_label = ax.get_y_axis_label("y").set_color(BLACK)
  27. x_label = ax.get_x_axis_label("x").set_color(BLACK)
  28. grid_labels = VGroup(x_label, y_label)
  29. (ax, curve, area,grid_labels,riemann_rects,text)

 运行结果:

示例3: 

  1. from manim import *
  2. class GetAreaExample0002(Scene):
  3. def construct(self):
  4. .background_color = WHITE
  5. ax = Axes().add_coordinates().set_color(PURPLE)
  6. curve = (lambda x: 2*(x*x*x)+(x**2)/9+x/4+2, x_range=[-2, 2], color=BLACK)
  7. area = ax.get_area(
  8. curve,
  9. x_range=(-1.5, 1),
  10. color=(BLUE, GREEN_D),
  11. opacity=0.2,
  12. )
  13. # 创建 Riemann 矩形
  14. riemann_rects = ax.get_riemann_rectangles(
  15. curve,
  16. x_range=[-1.5, 1],
  17. dx=0.05,
  18. input_sample_type='left',
  19. stroke_color=RED,
  20. fill_opacity=1,
  21. color=(RED,RED_E ),
  22. #fill_opacity=0.5,
  23. show_signed_area=True
  24. )
  25. text=MathTex(r"f(x)",color=BLACK).shift(2*LEFT+2*DOWN)
  26. y_label = ax.get_y_axis_label("y").set_color(BLACK)
  27. x_label = ax.get_x_axis_label("x").set_color(BLACK)
  28. grid_labels = VGroup(x_label, y_label)
  29. (ax, curve, area,grid_labels,riemann_rects,text)

 运行结果:

示例4:

  1. class GetRiemannRectanglesExample(Scene):
  2. def construct(self):
  3. .background_color = WHITE
  4. ax = Axes(y_range=[-2, 10]).add_coordinates().set_color(PURPLE)
  5. quadratic = (lambda x: 0.5 * x ** 2 - 1.5,color=BLACK)
  6. rects_right = ax.get_riemann_rectangles(
  7. quadratic,
  8. x_range=[-4.5, -3],
  9. dx=0.75,
  10. color=(TEAL, BLUE_B, DARK_BLUE),
  11. input_sample_type="right",
  12. )
  13. rects_left01 = ax.get_riemann_rectangles(quadratic, x_range=[-2.5, 0], dx=0.15, color=YELLOW)
  14. rects_left02 = ax.get_riemann_rectangles(quadratic, x_range=[0, 2.5], dx=0.05, color=GREEN)
  15. bounding_line = (lambda x: 1.5 * x, color=BLUE_B, x_range=[3.85, 6]).set_color(RED)
  16. bounded_rects = ax.get_riemann_rectangles(
  17. bounding_line,
  18. bounded_graph=quadratic,
  19. dx=0.1,
  20. x_range=[4, 5],
  21. show_signed_area=False,
  22. color=(YELLOW,YELLOW_E),
  23. )
  24. (
  25. ax, bounding_line, quadratic, rects_right, rects_left01,rects_left02, bounded_rects
  26. )

 运行结果: