自适应辛普森(复数)-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

 

posted on 2025-11-17 14:39  Ice94  阅读(10)  评论(0)    收藏  举报

导航