python用复化梯形公式积分_复化梯形求积分——用Python进行数值计算
用程序來求積分的方法有很多,這篇文章主要是有關牛頓-科特斯公式。
學過插值算法的同學最容易想到的就是用插值函數代替被積分函數來求積分,但實際上在大部分場景下這是行不通的。
插值函數一般是一個不超過n次的多項式,如果用插值函數來求積分的話,就會引進高次多項式求積分的問題。這樣會將原來的求積分問題帶到另一個求積分問題:如何求n次多項式的積分,而且當次數變高時,會出現龍悲歌現象,誤差反而可能會增大,并且高次的插值求積公式有可能會變得不穩定:詳細原因不贅述。
牛頓-科特斯公式解決這一問題的辦法是將大的插值區間分為一堆小的插值區間,使得多項式的次數不會太高。然后通過引入參數函數
將帶有冪的項的取值范圍固定在一個固定范圍內,這樣一來就將多項式帶有冪的部分的求積變為一個固定的常數,只需手工算出來即可。這個常數可以直接帶入多項式求積函數。
上式中x的求積分區間為[a, b],h = (b - a)/n, 這樣一來積分區間變為[0, n],需要注意的是從這個公式可以看出一個大的區間被分為n個等長的小區間。 這一部分具體請參見任意一本有關數值計算的書!
n是一個事先確定好的值。
又因為一個大的插值區間需要被分為等長的多個小區間,并在這些小區間上分別進行插值和積分,因此此時的牛頓-科特斯公式被稱為:復化牛頓-科特斯公式。
并且對于n的不同取值牛頓-科特斯有不同的名稱: 當n=1時,叫做復化梯形公式,復化梯形公式也就是將每一個小區間都看為一個梯形(高為h,上底為f(t), 下底為f(t+1))。這與積分的本質:無限分隔 ?相同。
當n=2時,復化牛頓-科特斯公式被稱為復化辛普森公式(非美國法律界著名的那個辛普森)。
我這篇文章實現的是復化梯形公式:
首先寫一個函數求節點函數值求和那部分:
"""
@brief: 求和 ∑f(xk) : xk表示等距節點的第k個節點,不包括端點
xk = a + kh (k = 0, 1, 2, ...)
積分區間為[a, b]
@param: xk 積分區間的等分點x坐標集合(不包括端點)
@param: func 求積函數
@return: 返回值為集合的和
"""
def sum_fun_xk(xk, func):
return sum([func(each) for each in xk])
然后就可以寫整個求積分函數了:
"""
@brief: 求func積分 :
@param: a 積分區間左端點
@param: b 積分區間右端點
@param: n 積分分為n等份(復化梯形求積分要求)
@param: func 求積函數
@return: 積分值
"""
def integral(a, b, n, func):
h = (b - a)/float(n)
xk = [a + i*h for i in range(1, n)]
return h/2 * (func(a) + 2 * sum_fun_xk(xk, func) + func(b))
相當的簡單
試驗:
當把大區間分為兩個小區間時:
分為20個小區間時:
求的積分值就是這些彩色的梯形面積之和。
測試代碼:
if __name__ == "__main__":
func = lambda x: x**2
a, b = 2, 8
n = 20
print integral(a, b, n, func)
''' 畫圖 '''
import matplotlib.pyplot as plt
plt.figure("play")
ax1 = plt.subplot(111)
plt.sca(ax1)
tmpx = [2 + float(8-2) /50 * each for each in range(50+1)]
plt.plot(tmpx, [func(each) for each in tmpx], linestyle = '-', color='black')
for rang in range(n):
tmpx = [a + float(8-2)/n * rang, a + float(8-2)/n * rang, a + float(8-2)/n * (rang+1), a + float(8-2)/n * (rang+1)]
tmpy = [0, func(tmpx[1]), func(tmpx[2]), 0]
c = ['r', 'y', 'b', 'g']
plt.fill(tmpx, tmpy, color=c[rang%4])
plt.grid(True)
plt.show()
注意上面代碼中的n并不是上文開篇提到的公式中的n,開篇提到的n是指將每一個具體的插值區間(也就是小區間)等距插n個節點,復化梯形公式的n是固定的為1.
而代碼中的n指將大區間分為n個小區間。
python與數值計算環境搭建
數值計算的編程的軟件很多種,也見過一些編程繪圖軟件的對比. 利用Python進行數值計算,需要用到numpy(矩陣) ,scipy(公式符號), matplotlib(繪圖)這些工具包. 1.Linu ...
【編程練習】收集的一些c++代碼片,算法排序,讀文件,寫日志,快速求積分等等
寫日志: class LogFile { public: static LogFile &instance(); operator FILE *() const { return m_file ...
之前寫的收集的一些c++代碼片,算法排序,讀文件,寫日志,快速求積分等等
寫日志: class LogFile { public: static LogFile &instance(); operator FILE *() const { return m_file ...
牛頓插值法——用Python進行數值計算
拉格朗日插值法的最大毛病就是每次引入一個新的插值節點,基函數都要發生變化,這在一些實際生產環境中是不合適的,有時候會不斷的有新的測量數據加入插值節點集, 因此,通過尋找n個插值節點構造的的插值函數與n ...
Python 3 數值計算
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32Type & ...
分段二次插值——用Python進行數值計算
事實上在實際使用中,高次插值顯然是很不適合的,高次插值將所有樣點包涵進一個插值函數中,這是次冪高的原因.高次計算復雜,而且剛開始的一點誤差會被方的很大.因此將整個區間分為若干個小區間,在每一個小區間進 ...
埃爾米特插值問題——用Python進行數值計算
當插值的要求涉及到對插值函數導數的要求時,普通插值問題就變為埃爾米特插值問題.拉格朗日插值和牛頓插值的要求較低,只需要插值函數的函數值在插值點與被插函數的值相等,以此來使得在其它非插值節點插值函數的值 ...
拉格朗日插值法——用Python進行數值計算
插值法的偉大作用我就不說了.... 那么貼代碼? 首先說一下下面幾點: 1. 已有的數據樣本被稱之為 "插值節點" 2. 對于特定插值節點,它所對應的插值函數是必定存在且唯一的(關 ...
simpson法求積分 專題練習
[xsy1775]數值積分 題意 多組詢問,求\(\int_l^r\sqrt{a(1-{x^2\over b})}dx\) 分析 double f(double x) { return sqrt(a* ...
隨機推薦
Reverse Core 第一部分 代碼逆向技術基礎
@date: 2016/10/14 筆記 記錄書中較重要的知識,方便回顧 ps. 因有一些逆向基礎,所以我本來就比較熟悉的知識并未詳細記錄 第一章 關于逆向工程 目標, ...
HDU 1052
http://acm.hdu.edu.cn/showproblem.php?pid=1052 田忌賽馬本質就是一個貪心 res表示田忌的勝利場次 1.田忌最快馬快于王的最快馬,兩個最快馬比,res++ ...
SQL Sever2008 新手入門第一天安裝軟件
(計應154蘭家才)這學期,新來了一門課程,數據庫應用.剛開始什么都不懂,也不知道這東西到底是干嘛,本著路漫漫其修遠兮,吾將上下而求索的精神,開始了一段求知路程.剛開始找了一個簡單的綠化版sql200 ...
v2013調試無法訪問此網站 localhost 拒絕了我們的連接請求
問題描述: ? ? ? ? ?別人給的服務器代碼,在本地部署以后調試的,localhost:8080 可以訪問,localhost:2524訪問不了需要改什么配置嗎 解決思路: ? ? ? ? ??這 ...
k8s實戰之從私有倉庫拉取鏡像 - kubernetes
1.實戰目的 從私有docker倉庫拉取鏡像,部署pod.上一篇中,我們搭建了私有的鏡像倉庫,這一篇我們將與k8s結合實戰使用私有倉庫. 2.登錄docker 為了完成本次實戰,需要登錄docker, ...
HBase——HMaster啟動之一(HMaster的構建)
首先,讓我們來到HMaster的main方法.我們今天的流程就從這里開始. 我們需要注意,下圖所示的tool的類型就是HMasterCommandLine. 接下來,讓我們來到HMasterComma ...
2019 校內賽 RPG的地牢獵手(bfs+優先隊列)
Problem Description Luke最近沉迷一款RPG游戲,游戲中角色可以進入地牢關卡,只要順利走出地牢就可以獲得獎勵.地牢表示為n行m列的塊矩陣,其中每個塊只可以是障礙塊.入口.出口或數 ...
zabbix3.x添加H3C網絡設備詳解
zabbix3.x添加H3C網絡設備詳解 作者:尹正杰 版權聲明:原創作品,謝絕轉載!否則將追究法律責任. 前言: 歡迎加入:高級運維工程師之路 598432640 相信大家在看我的文章之前,也看過其 ...
Mysql 登錄及用戶切換、用戶權限查詢
啟動mysql: 方法一:net start mysql(或者是其他服務名) 方法二:在windows下啟動MySQL服務 MySql安裝目錄:"d:\MySql\" 進入命令行輸 ...
Activity設置Dialog屬性點擊區域外消失實現方式
通過配置:true 通過代碼:setFinish ...
總結
以上是生活随笔為你收集整理的python用复化梯形公式积分_复化梯形求积分——用Python进行数值计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python系统学习第二十四课
- 下一篇: 使用不正确的主题来学习WordPress