You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除阿基米德条带法函数上下和绘图末尾的多余矩形?

问题分析与修复方案

核心问题

  1. 末尾多余矩形:原代码中x = np.linspace(a, b, N+1)生成了N+1个点,以此计算的lower_bar和upper_bar也包含N+1个柱子位置,但我们只需要N个矩形覆盖[a, b]区间,最后一个位置对应的矩形超出了上限b,导致多余。
  2. 上和计算错误:原代码用了区间中点的函数值求和,这是中点和,不是上和。对于单调递增的函数f(x)=0.5x²,每个区间的最大值在右端点,上和应该取右端点的函数值计算。
  3. 绘图逻辑混乱:原代码的柱子位置计算错误,导致部分柱子悬于空中。

修复后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:15:44