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

使用Python实现Simpson法则时遭遇IndexError索引越界错误求助

问题分析
  1. 逻辑反转错误:你计划的是"不满足误差要求则步长减半",但当前代码中N = int(N/2)会减少采样点数量,反而让步长加倍,积分精度越来越差,永远无法达到误差要求,最终N会减至0。
  2. 空数组触发索引错误:当N变为0时,np.linspace(a, b, 0)生成空数组x2,而scipy.integrate.simps无法处理空的x参数,因此抛出IndexError。
解决方案

1. 修正步长调整逻辑

步长减半意味着需要更多采样点,因此要将N乘以2,而非除以2,这样才能真正让步长缩小一半:

N = N * 2

2. 添加循环终止保护

设置采样点数量上限(比如10000),避免无限循环或性能过载;同时保证采样点数量不会过少(Simpson法则至少需要3个点才能计算)。

3. 修正积分精度对应关系

按照你描述的Iₕ对应低精度、Iₕ/₂对应高精度的逻辑,调整代码中采样点的生成顺序,确保sim2是步长减半后的高精度积分结果。

修正后的代码
import numpy as np
from scipy.integrate import simps

a = 0
b = np.pi * 2
N = 100  # 初始采样点数量
ra = 0.1  # ρα
R = 0.05
fa = 35 * (np.pi/180)  # φα
za = 0.4
Q = 10**(-6)
k = 9 * 10**9
aa = np.sqrt(ra**2 + R**2 + za**2)  # 改用numpy原生sqrt,移除未使用的sympy依赖
error = 5 * 10**(-9)
max_N = 10000  # 最大采样点限制,防止无限循环

while True:
    # 计算步长h的低精度积分I_h
    x1 = np.linspace(a, b, N)
    f1 = 1 / ((aa ** 2 - 2 * ra * R * np.cos(x1 - fa)) ** (3 / 2))
    sim1 = simps(f1, x1)
    
    # 计算步长h/2的高精度积分I_h/2
    x2 = np.linspace(a, b, 2*N)
    f2 = 1 / ((aa ** 2 - 2 * ra * R * np.cos(x2 - fa)) ** (3 / 2))
    sim2 = simps(f2, x2)
    
    # 满足误差要求或达到最大采样点则终止循环
    if abs(sim1 - sim2) < error or N >= max_N:
        break
    # 步长减半:采样点数量加倍
    N = 2 * N

# 输出高精度积分结果
print(sim2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:05:16