''' mbinary ######################################################################### # File : numerical_integration.py # Author: mbinary # Mail: zhuheqin1@gmail.com # Blog: https://mbinary.xyz # Github: https://github.com/mbinary # Created Time: 2018-10-02 21:14 # Description: ######################################################################### ''' ######################################################################### # File : numerical integration.py # Author: mbinary # Mail: zhuheqin1@gmail.com # Blog: https://mbinary.xyz # Github: https://github.com/mbinary # Created Time: 2018-05-11 08:58 # Description: # numerical intergration: using Newton-Cotes integration, and Simpson # 数值积分, 使用 牛顿-科特斯积分, 辛普森 ######################################################################### import numpy as np def trapezoidal(a,b,h,fs): '''梯形积分公式''' xs = [i for i in np.arange(a,b+h,h)] print(xs) ret = h*(sum(fs)-fs[0]/2 - fs[-1]/2) print(ret) return ret def simpson(a,b,h,fs): '''辛普森积分公式''' xs = [i for i in np.arange(a,b+h,h)] print(xs) ret = h/3*(4* sum(fs[1::2])+ 2*sum(fs[2:-1:2]) + fs[0]+fs[-1]) print(ret) return ret def romberg(a,b,f,epcilon): '''romberg(龙贝格) 数值积分''' h = b-a lst1=[h*(f(a)+f(b))/2] print(lst1) delta = epcilon k=1 while delta >= epcilon: h/=2 k+=1 lst2=[] lst2.append((lst1[0]+h*2*sum(f(a+(2*i-1)*h) for i in range(1,2**(k-2)+1)))/2) for j in range(0,k-1): lst2.append(lst2[j]+(lst2[j]-lst1[j])/(4**(j+1)-1)) delta = abs(lst2[-1]-lst1[-1]) lst1=lst2 print(lst1) if __name__=='__main__': a,b,h = 0.6,1.8,0.2 fs=[5.7,4.6,3.5,3.7,4.9,5.2,5.5] trapezoidal(a,b,h,fs) simpson(a,b,h,fs) romberg(1,2,lambda x:sin(x**4),1e-4)