Python梯形法绘图报错IndexError:列表赋值索引超出范围
解决梯形法积分绘图中的IndexError及代码问题
嘿,我来帮你搞定这个问题!先看你遇到的IndexError,根源是对scipy.integrate.trapz的用法理解错了,咱们一步步拆解:
错误原因分析
报错出在这一行:
exact_sum = integrate.trapz(f(b))-integrate.trapz(f(a))
integrate.trapz的作用是对一组函数值数组做梯形法数值积分,它至少需要两个点的数值才能计算积分。但f(b)和f(a)是单个标量值,传入trapz后,函数内部会尝试处理维度为0的数组,直接触发IndexError: list assignment index out of range。- 另外你误解了
trapz的定位:它本身就是数值积分工具,不是用来求精确积分的。要获取作为参考的"精确积分值",应该用scipy.integrate.quad——这是Scipy里的自适应高精度求积函数,精度足够作为对比基准。
修正后的完整代码
我把所有问题都修复了,还做了一些优化,代码如下:
from scipy import integrate import matplotlib.pyplot as plt # 补充之前遗漏的绘图库导入 def f(x): return 1 - x - 4*x**3 + 2*x**5 def trapezoid(a, b, n): h = (b - a) / n s = (f(a) + f(b)) # 用for循环替代while,更Pythonic for i in range(1, n): s += 2 * f(a + i * h) area = ((h / 2) * s) return area def graphTrapezoid(a, b): val = [] err = [] # 用quad获取高精度积分结果,第二个返回值是误差估计,我们用下划线忽略 exact_sum, _ = integrate.quad(f, a, b) for i in range(2, 100): trap_val = trapezoid(a, b, i) val.append(trap_val) # 计算相对误差,避免除以0(你的函数在1-5区间积分不为0,这里是安全的) errVal = abs((trap_val - exact_sum)/exact_sum) err.append(errVal) # 把区间数n作为x轴,比用积分值更直观,能看到误差随区间数的变化趋势 plt.plot(range(2,100), err) plt.xlabel('梯形法区间数n') plt.ylabel('相对误差') plt.title('梯形法积分相对误差随区间数变化') plt.show() a = 1 b = 5 graphTrapezoid(a, b)
关键修改点说明
- 修复精确积分获取:用
integrate.quad(f, a, b)替代错误的trapz用法,拿到可靠的基准积分值。 - 补充绘图库导入:之前代码直接用
plt但没导入,会触发NameError,现在补上了。 - 优化绘图逻辑:把x轴改成区间数
n,能清晰看到随着区间细分,相对误差逐渐减小的趋势(符合梯形法的收敛特性)。 - 代码风格优化:把
while循环改成for循环,更简洁易读;把a,b作为参数传入函数,避免依赖全局变量,让函数更健壮。
内容的提问来源于stack exchange,提问作者Kuma
相关产品推荐
相关产品推荐

