數值分析實驗之數值積分法(Python 代碼)


詳細實驗指導見上一篇,此處只寫內容啦

 

實驗內容

     選擇 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是上學期學的,但是通過本次課進行熟悉,收獲也頗多。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM