数值积分——梯形公式和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)dx2ba[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(ba)[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)dx2h[f(a)+f(b)+2k=1n1f(xk)]h=nba,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)dx3h[f(a)+f(b)+2k=1m1f(x2k)+4k=1mf(x2k1)]n=2m,h=nba,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
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐