如何移除阿基米德条带法函数上下和绘图末尾的多余矩形?
问题分析与修复方案
核心问题
- 末尾多余矩形:原代码中
x = np.linspace(a, b, N+1)生成了N+1个点,以此计算的lower_bar和upper_bar也包含N+1个柱子位置,但我们只需要N个矩形覆盖[a, b]区间,最后一个位置对应的矩形超出了上限b,导致多余。 - 上和计算错误:原代码用了区间中点的函数值求和,这是中点和,不是上和。对于单调递增的函数
f(x)=0.5x²,每个区间的最大值在右端点,上和应该取右端点的函数值计算。 - 绘图逻辑混乱:原代码的柱子位置计算错误,导致部分柱子悬于空中。
修复后的代码
import numpy as np import matplotlib.pyplot as plt def f(x): return 0.5*x*x a = 0 # 积分下限 b = np.pi # 积分上限 N = 30 # 矩形数量 width = (b - a) / N # 生成N+1个区间端点(左端点+右端点) x = np.linspace(a, b, N+1) # 左端点的函数值(对应下和的高度) y_left = f(x[:-1]) # 右端点的函数值(对应上和的高度) y_right = f(x[1:]) # 计算下和:左端点高度求和 lower_sum = np.sum(width * y_left) # 计算上和:右端点高度求和 upper_sum = np.sum(width * y_right) print("下和:", lower_sum) print("上和:", upper_sum) # 绘制函数曲线 plt.plot(x, f(x), 'b-', label='f(x)') # 绘制下和矩形:左端点为柱子左边缘,高度为左端点函数值 plt.bar(x[:-1], y_left, width=width, alpha=0.5, color='blue', align='edge', label='下和') # 绘制上和矩形:左端点为柱子左边缘,高度为右端点函数值 plt.bar(x[:-1], y_right, width=width, alpha=0.5, color='red', align='edge', label='上和') plt.xlabel('x') plt.ylabel('f(x)') plt.legend() plt.savefig('plot.pdf') plt.show()
关键修改说明
- 移除多余矩形:用
x[:-1]取前N个点作为柱子的左边缘,刚好生成N个矩形,完全覆盖[a, b]区间,不会超出上限。 - 修正上和计算:改用区间右端点的函数值
y_right = f(x[1:])计算上和,符合单调递增函数的上和定义。 - 规范绘图逻辑:设置
align='edge'让柱子的左边缘对齐区间左端点,确保每个矩形严格对应一个子区间,同时柱子底部默认从y=0开始,解决“悬于空中”的问题。
内容的提问来源于stack exchange,提问作者laterrr
相关产品推荐
相关产品推荐

