內容來自王曉華老師
這塊內容有點硬核,先做了解,主要學習如何使用迭代解決問題的步驟
兩種計算數值積分的常用演算法,分別是變步長梯形公式法和變步長辛普森公式法。首先從梯形公式入手來推導出復合梯形公式法,在實現復合梯形公式法的基礎上,再實現變步長梯形公式法。
同樣,變步長辛普森公式法也是從辛普森公式入手的,首先實現復合辛普森公式法的演算法,然後再實現變步長辛普森公式法
梯形公式法
復合梯形公式法
用梯形公式計算定積分,當區間 [a,b] 比較大的時候,其誤差也會大到無法接受。如果將大的區間分割成 n 個小的區間,對每個小區間應用梯形公式計算內接梯形面積,然後再將所有小梯形的面積求和得到結果,誤差則會大大的縮小,這就是復合梯形公式法。這樣分割以後,每個小區間的長度被稱為「步長」,即 step=(b-a)/n。積分區間分割得越細,梯形公式法得到的近似值就越逼近真實值。
}變步長梯形公式法為了提高迭代計算的效率,人們想出了一種利用迭代思想的變步長梯形公式法。在對定積分圖形的內接梯形分割的時候,每個迭代都把上乙個迭代分割的梯形再平均分割成兩個小梯形。隨著迭代次數增加,逐步增加梯形分割的個數,使得梯形分割沿積分自變數方向的步長由粗到細,逐步變化,就是所謂的變步長。每個迭代計算一次小梯形面積的和,並與上個迭代計算的小梯形面積的和做比較,若相鄰兩次迭代的差值達到精度要求,則退出迭代計算,否則就對當前的所有小梯形繼續分割,進行下次迭代計算。如圖(2)所示,每次分割得到的兩個小梯形的面積之和都比分割前的大梯形面積更接近曲線的積分值。
double vs_trapezium(std::function func, double a, double b, double辛普森公式法eps)
while (diff >=eps);
return
t1;}
復合辛普森公式法
s;}可變長辛普森公式法和梯形公式一樣,復合辛普森公式也可以改造為變步長辛普森公式法。改造的方法就是使用迭代法的思想,通過改變區間個數 n 使得步長 step 也跟著變化,當迭代差值符合精度要求時即可停止迭代。演算法的迭代變數仍然是每次分割後的小區間上使用辛普森公式計算的插值曲線面積之和,迭代關係則非常簡單,就是用本迭代的迭代變數代替上個迭代的迭代自變數的值,迭代終止條件就是兩個迭代的迭代變數之差小於精度值。迭代變數的初始值就是在區間 [a,b] 上應用辛普森公式計算最大的區間面積。用乙個變數 n 表示當前迭代分割小梯形的個數,n 的值每個迭代增加一倍。而每次分割後的小區間面積和的計算可由第 2-2 課中給出的復合辛普森公式演算法 simpson() 函式計算,迭代演算法的整體結構與變步長梯形法類似。
double vs_simpson(std::function func, double a, double b, doubleeps)
while (diff >=eps);
return
s1;}
第 2 3 課 迭代法計算定積分
這一課我們介紹兩種計算數值積分的常用演算法,分別是變步長梯形公式法和變步長辛普森公式法。首先從梯形公式入手來推導出復合梯形公式法,在實現復合梯形公式法的基礎上,再實現變步長梯形公式法。同樣,變步長辛普森公式法也是從辛普森公式入手的,首先實現復合辛普森公式法的演算法,然後再實現變步長辛普森公式法。這兩...
平均值法計算定積分
include cstdio include time.h using namespace std const unsigned long maxshort 65536l const unsigned long multiplier 1194211693l const unsigned long a...
python計算牛頓迭代法
利用python的符號計算庫sympy庫來計算函式的雅可比矩陣和海森矩陣 from sympy import import numpy as np 計算具體值 defcalculatevalue jac or hess,x,isjacmac result x dic for data in rang...