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

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)

关键修改点说明

  1. 修复精确积分获取:用integrate.quad(f, a, b)替代错误的trapz用法,拿到可靠的基准积分值。
  2. 补充绘图库导入:之前代码直接用plt但没导入,会触发NameError,现在补上了。
  3. 优化绘图逻辑:把x轴改成区间数n,能清晰看到随着区间细分,相对误差逐渐减小的趋势(符合梯形法的收敛特性)。
  4. 代码风格优化:把while循环改成for循环,更简洁易读;把a,b作为参数传入函数,避免依赖全局变量,让函数更健壮。

内容的提问来源于stack exchange,提问作者Kuma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:32:31