使用Python实现Simpson法则时遭遇IndexError索引越界错误求助
问题分析
- 逻辑反转错误:你计划的是"不满足误差要求则步长减半",但当前代码中
N = int(N/2)会减少采样点数量,反而让步长加倍,积分精度越来越差,永远无法达到误差要求,最终N会减至0。 - 空数组触发索引错误:当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
相关产品推荐
相关产品推荐

