詳細實驗指導見上一篇,此處只寫內容啦
實驗內容
選擇 y=arctan(x) 在0-1上的積分
• 復化simpson算法
1 from sympy import * 2 import math 3 4 def func(x): 5 return math.atan(x) 6 def sum_fun_xk(xk, func): 7 return sum([func(each) for each in xk]) 8 9 def integral(a, b, n, func): 10 h = (b - a)/float(n) 11 xk = [a + i*h for i in range(1, n)] 12 return h/2 * (func(a) + 2 * sum_fun_xk(xk, func) + func(b)) 13 14 if __name__ == "__main__": 15 16 a, b = 0, 1 17 n = 50 18 y=integral(a, b, n, func) 19 print ("復化simpson公式:",y)
運行結果:
將區間分成50份所得結果:
將區間分成100份所得結果:
• 復化梯形算法
1 import numpy 2 from scipy import integrate 3 import matplotlib.pyplot as plt 4 import math 5 6 #x [0,2pi] 7 def f(x): 8 return math.atan(x) 9 10 def T(a,b,n=50): 11 h = (b - a) / n 12 temp = 0 13 for i in range(1,n): 14 x = a + i * h 15 temp += 2 * f(x) 16 return (b - a) / (2 * n) * (f(a) + temp + f(b)) 17 18 #50 100 200 500 1000 19 def S(a,b,n=50): 20 h = (b - a) / n 21 temp1 = 0 22 temp2 = 0 23 for i in range(1,n): 24 xk1 = a + h * i 25 xk2 = a + h * (i + 1) 26 xk12 = (xk1 + xk2) / 2 27 temp1 += f(xk1) 28 temp2 += f(xk12) 29 temp2 += f((a + a + h) / 2) 30 return (b - a) / (6 * n) * (f(a) + 4 * temp2 + 2 * temp1 + f(b)) 31 32 if __name__ == '__main__': 33 n =1000 #50 100 200 500 1000 34 a = 0 35 b = 1 36 37 print ('Truth-value:',integrate.quad(f,a,b)[0]) 38 print ('T-Estimated-value:',T(a,b,n)) 39 print ('S-Estimated-value:',S(a,b,n))
運行結果:
體會
首先同一方法的比較,我們將區間分成了50份和100份進行計算,得出結果:將區間分成100份的計算結果精度較高。其次,不同方法之間的比較,我們選用的復化梯形算法和復化辛普森算法對該積分進行計算,發現在將區間分成50份時,所得精度相差不大。總而言之,通過本次實驗,我對數值分析中相關的知識更加熟悉。其次,對各種編程軟件的使用也進一步了解,雖然java是上學期學的,但是通過本次課進行熟悉,收獲也頗多。