数值积分——梯形公式和Simpson公式
数值积分——梯形公式和Simpson公式梯形公式:I(f)=∫abf(x)dx≈b−a2[f(a)+f(b)]I(f) = \displaystyle\int^b_a f(x)dx \approx\frac{b-a}{2}[f(a)+f(b)]I(f)=∫abf(x)dx≈2b−a[f(a)+f(b)]def Trapezoid(a,b):y = (a - b) * ((1/2) * f(a)
数值积分——梯形公式和Simpson公式
梯形公式:
I ( f ) = ∫ a b f ( x ) d x ≈ b − a 2 [ f ( a ) + f ( b ) ] I(f) = \displaystyle\int^b_a f(x)dx \approx\frac{b-a}{2}[f(a)+f(b)] I(f)=∫abf(x)dx≈2b−a[f(a)+f(b)]
def Trapezoid(a,b):
y = (a - b) * ((1/2) * f(a) + (1/2) * f(b))
return y
Simpson 公式:
I ( f ) = ∫ a b f ( x ) d x ≈ ( b − a ) [ 1 6 f ( a ) + 4 6 f ( a + b 2 ) + 1 6 f ( b ) ] I(f) = \displaystyle\int^b_a f(x)dx \approx(b-a)[\frac{1}{6}f(a)+\frac{4}{6}f(\frac{a+b}{2}) +\frac{1}{6}f(b)] I(f)=∫abf(x)dx≈(b−a)[61f(a)+64f(2a+b)+61f(b)]
def Simpson(a,b):
y = (a-b)*((1/6)*f(a) + (4/6)*f((a+b)/2) + (1/6) * f(b))
return y
测试一下:
def f(x):
f = np.exp(-x)
return f
print(Trapezoid(0.5,0.1))
print(Simpson(0.5,0.1))
结果为:
0.3022736155497186
0.298309397365031
复化梯形公式:
T n = ∫ a b f ( x ) d x ≈ h 2 [ f ( a ) + f ( b ) + 2 ∑ k = 1 n − 1 f ( x k ) ] h = b − a n , x k = a + k h , ( k = 0 , 1 , … , n ) T_n =\displaystyle\int^b_a f(x)dx\approx\frac{h}{2}[f(a)+f(b)+2\sum\limits_{k=1}^{n-1}f(x_k)] \\ h=\frac{b-a}{n},x_k = a + kh,(k =0,1,\dots,n) Tn=∫abf(x)dx≈2h[f(a)+f(b)+2k=1∑n−1f(xk)]h=nb−a,xk=a+kh,(k=0,1,…,n)
def complex_Trapezoid(n,a,b):
h = (b-a) / n
temp_s= 0
for k in range(1,n):
x_k = a + k*h
temp_s += f(x_k)
I = h/2 * (f(a) + f(b) + 2*temp_s)
return I
复化Simpson公式:
∫ a b f ( x ) d x ≈ h 3 [ f ( a ) + f ( b ) + 2 ∑ k = 1 m − 1 f ( x 2 k ) + 4 ∑ k = 1 m f ( x 2 k − 1 ) ] n = 2 m , h = b − a n , x k = a + k h , ( k = 0 , 1 , … , n ) \displaystyle\int^b_a f(x)dx\approx\frac{h}{3}[f(a)+f(b)+2\sum\limits_{k=1}^{m-1}f(x_{2k})+4\sum\limits_{k=1}^{m}f(x_{2k-1})] \\ n=2m,h=\frac{b-a}{n},x_k = a + kh,(k =0,1,\dots,n) ∫abf(x)dx≈3h[f(a)+f(b)+2k=1∑m−1f(x2k)+4k=1∑mf(x2k−1)]n=2m,h=nb−a,xk=a+kh,(k=0,1,…,n)
def complex_simpson(n,a,b):
'''
n:划分[a,b]区间成n等分
a: 积分下限
b: 积分上限
'''
h = (b-a) / n
temps_odd = 0
temps_even = 0
for k in range(1,n):
if k % 2 == 0:
x_k = a + k*h
temps_even += 2 * f(x_k)
else:
x_k = a + k*h
temps_odd += 4 * f(x_k)
I = (h/3) * (f(a) + f(b) + temps_even + temps_odd)
return I
测试一下:
def f(x):
if x == 0:
return 1
else:
f = np.sin(x) / x
return f
print(complex_Trapezoid(8,0,1))
print(complex_simpson(8,0,1))
结果为:
0.9456908635827014
0.9460833108884719
更多推荐
所有评论(0)