自适应辛普森(复数)-1/3法则
1/3法则-自适应辛普森数值积分 复数版,没有进行过多的限制和检查,该方法仅针对我自己遇到的一些问题进行简单的快速迭代,适用于简单函数的快速积分。
1 def adaptive_simpson(func, lower, upper, tolerance=1e-6,): 2 if not callable(func): 3 raise TypeError(f"Function type error: {func}") 4 5 result = 0.0j 6 length = upper - lower 7 8 if abs(length) < tolerance: 9 return result 10 11 left = func(lower) 12 right = func(upper) 13 midpoint = (upper + lower) * 0.5 14 middle = func(midpoint) 15 16 stack = [(lower, upper, left, middle, right, (length * (left + 4.0 * middle + right) * 0.16666666666666666), tolerance)] 17 18 while stack: 19 (stack_lower, stack_upper, stack_left, stack_middle, stack_right, stack_integral, stack_tolerance) = stack.pop() 20 21 stack_midpoint = (stack_upper + stack_lower) * 0.5 22 stack_left_middle = func((stack_lower + stack_midpoint) * 0.5) 23 stack_right_middle = func((stack_midpoint + stack_upper) * 0.5) 24 stack_left_integral = ((stack_midpoint - stack_lower) * (stack_left + 4.0 * stack_left_middle + stack_middle) * 0.16666666666666666 ) 25 stack_right_integral = ((stack_upper - stack_midpoint) * (stack_middle + 4.0 * stack_right_middle + stack_right) * 0.16666666666666666) 26 stack_sum = stack_left_integral + stack_right_integral 27 28 error = (stack_sum - stack_integral) * 0.06666666666666666 29 30 if abs(error) < stack_tolerance: 31 result += stack_sum + error 32 else: 33 epsilon = stack_tolerance * 0.5 34 stack.append((stack_midpoint, stack_upper, stack_middle, stack_right_middle, stack_right, stack_right_integral, epsilon)) 35 stack.append((stack_lower, stack_midpoint, stack_left, stack_left_middle, stack_middle, stack_left_integral, epsilon)) 36 37 return result
浙公网安备 33010602011771号