利用辛普森公式可以近似求出复杂函数的积分值,公式如下:
∫
a
b
f
(
x
)
d
x
≈
h
3
[
y
0
+
y
2
n
−
1
+
4
(
∑
i
=
1
n
−
1
y
2
i
−
1
)
+
∑
i
=
1
n
−
1
y
2
i
]
\int_{a}^{b} f(x) dx \approx \frac{h}{3}\left[ y_0 + y_{2n-1} + 4(\sum\limits_{i=1}^{n-1} y_{2i-1}) + \sum\limits_{i=1}^{n-1} y_{2i} \right]
∫abf(x)dx≈3h[y0+y2n−1+4(i=1∑n−1y2i−1)+i=1∑n−1y2i]
其中 y 0 y_0 y0 到 y 2 n − 1 y_{2n-1} y2n−1的值是原函数在等分点上的函数值。
下面是一个简单的示例:
import numpy as np
def calculate_simpson_integral(target_fun, left_zone, right_zone, zone_num):
""" 使用辛普森规则计算积分近似值 """
# 计算区间的步长
step_len = (right_zone - left_zone) / zone_num
# 在区间上生成 zone_num+1 个等距的点
dots = np.linspace(left_zone, right_zone, zone_num + 1)
# 求分段点的函数值
fun_values = target_fun(dots)
# 利用公式求近似积分值
return step_len / 3 * (fun_values[0] + fun_values[-1] +
4 * np.sum(fun_values[1:-1:2]) +
2 * np.sum(fun_values[2:-2:2]))
# 测试
def integral_function(x):
""" 定义被积函数"""
return x ** 2
# 定义区间参数和分区数量
left_zone = 0
right_zone = 1
zone_num = 100
result = calculate_simpson_integral(integral_function, left_zone, right_zone,
zone_num)
print("定积分的近似值为:", result)
你可以根据实际需要定义被积函数,然后利用calculate_simpson_integral
求其在指定区间上的积分值。