python求不规则图形面积_python 微积分之---黎曼和
黎曼求和
這里有一塊形狀不規則的土地,要測量它的面積,怎么辦呢?一個叫黎曼的德國數學家(Bernhard Riemann, 1826-1866),他想了個辦法:將這不規則圖形切成一條條的小長條兒,然后將這個長條近似的看成一個矩形,再分別測量出這些小矩形的長度,再計算出它們的面積,把所有矩型面積加起來就是這塊不規則地的面積。這就是著名的“黎曼和”。小長條寬度趨于0時,即為面積微分,各個面積求和取極限即為定積分。雖然牛頓時代就給出了定積分的定義,但是定積分的現代數學定義卻是用黎曼和的極限給出。
定義
對一個在閉區間有定義的實值函數,關于取樣分割、的黎曼和定義為以下和式:
和式中的每一項是子區間長度與在處的函數值的乘積。直觀地說,就是以標記點到X軸的距離為高,以分割的子區間為長的矩形的面積。
函數
在分區上:求和:
每個值在
$ 中每個子間隔中是任意的。黎曼和很重要,因為提供了一種簡便的方法來逼近定積分:
請注意,每個i的乘積$f(x_i^ * ) (x_i - x_{i-1})$是高度為$f(x_i^ * )$且寬度為$x_i - x_{i-1}$的矩形的面積。 我們可以將黎曼和視為N個矩形的面積,其高度由$x_i - x_{i-1}$來確定。
$x_i^$在每個子間隔中選擇的是任意的,但是有一些明顯的選擇: 左黎曼和是指每個$x_i^ = x_{i-1}$是子區間$[x_{i-1},x_i]$的左端點 右黎曼和是指每個$xi^ = xi$是子區間$[xi-1,xi]$的右端點 中點黎曼和是每個$xi^* =(xi-1 + xi)/ 2$是子區間$[xi-1,xi]$的中點
通過以下舉例函數,用Python可視化左、右、中黎曼和: $$f(x) = frac{1}{1 + x^2}$$ 在間隔$[0,5]$上,分區大小為$N = 10$。
import numpy as np import matplotlib.pyplot as plt %matplotlib inline f = lambda x : 1/(1+x**2) a = 0; b = 5; N = 10 n = 10 # Use n*N+1 points to plot the function smoothlyx = np.linspace(a,b,N+1) y = f(x)X = np.linspace(a,b,n*N+1) Y = f(X)plt.figure(figsize=(15,5))plt.subplot(1,3,1) plt.plot(X,Y,'b') x_left = x[:-1] # Left endpoints y_left = y[:-1] plt.plot(x_left,y_left,'b.',markersize=10) plt.bar(x_left,y_left,width=(b-a)/N,alpha=0.2,align='edge',edgecolor='b') plt.title('Left Riemann Sum, N = {}'.format(N))plt.subplot(1,3,2) plt.plot(X,Y,'b') x_mid = (x[:-1] + x[1:])/2 # Midpoints y_mid = f(x_mid) plt.plot(x_mid,y_mid,'b.',markersize=10) plt.bar(x_mid,y_mid,width=(b-a)/N,alpha=0.2,edgecolor='b') plt.title('Midpoint Riemann Sum, N = {}'.format(N))plt.subplot(1,3,3) plt.plot(X,Y,'b') x_right = x[1:] # Left endpoints y_right = y[1:] plt.plot(x_right,y_right,'b.',markersize=10) plt.bar(x_right,y_right,width=-(b-a)/N,alpha=0.2,align='edge',edgecolor='b') plt.title('Right Riemann Sum, N = {}'.format(N))plt.show()$$f(x)[a,b]int_a^b f(x) dx$$ 讓我們計算每個黎曼和的值:
dx = (b-a)/N x_left = np.linspace(a,b-dx,N) x_midpoint = np.linspace(dx/2,b - dx/2,N) x_right = np.linspace(dx,b,N)print("按劃分為",N,"個子區間計算:") left_riemann_sum = np.sum(f(x_left) * dx) print("左黎曼和:",left_riemann_sum)midpoint_riemann_sum = np.sum(f(x_midpoint) * dx) print("中點黎曼和:",midpoint_riemann_sum)right_riemann_sum = np.sum(f(x_right) * dx) print("右黎曼和:",right_riemann_sum) 按劃分為 10 個子區間計算: 左黎曼和: 1.613488696614725 中點黎曼和: 1.373543428316664 右黎曼和: 1.1327194658454942實際上$int_0^5 frac{1}{1 + x^2} dx = arctan(5)$
I = np.arctan(5) print(I) 1.373400766945016 print("左黎曼和誤差:",np.abs(left_riemann_sum - I)) print("中點黎曼和:",np.abs(midpoint_riemann_sum - I)) print("右黎曼和誤差:",np.abs(right_riemann_sum - I)) 左黎曼和誤差: 0.24008792966970915 中點黎曼和: 0.00014266137164820059 右黎曼和誤差: 0.24068130109952168誤差分析:
左黎曼和誤差分析: $$L_N(f) = sum_{i=1}^N f(x_{i-1} ) Delta x$$ 其中:$Delta x = (b-a)/N$,$x_i = a + i Delta x$ $$E_N^{L}(f) = left| int_a^b f(x) dx - L_N(f) right| leq frac{(b-a)^2}{2 N} K_1$$ 有黎曼和誤差分析: $$R_N(f) = sum_{i=1}^N f(x_{i} ) Delta x$$ 其中:$Delta x = (b-a)/N$,$x_i = a + i Delta x$ $$E_N^{R}(f) = left| int_a^b f(x) dx - R_N(f) right| leq frac{(b-a)^2}{2 N} K_1$$ 中點黎曼誤差分析: $$M_N(f) = sum_{i=1}^N f(x_i^ ) Delta x$$ 其中:$Delta x = (b-a)/N$,$x_i^ = (x_{i-1} + x_i)/2$,$x_i = a + i Delta x$ $$E_N^{M}(f) = left| int_a^b f(x) dx - M_N(f) right| leq frac{(b-a)^3}{24 N^2} K_2$$ 有幾點要注意: 左和右黎曼和具有相同的誤差范圍,該誤差范圍取決于一階導數$f'(x)$ 中點黎曼和誤差界取決于二階導數$f''(x)$ * 我們期望中點黎曼和能夠給出更好的近似值,即$N→∞N^2N$
Python求黎曼和的方法
讓我們寫一個調用的函數riemann_sum這需要5個輸入參數f,a,b,N和method并返回黎曼和 $$sum_{i=1}^N f(x_i^*) Delta x$$ 其中:$Delta x = (b-a)/N$,$x_i = a + iDelta x$
def riemann_sum(f,a,b,N,method='midpoint'):'''Compute the Riemann sum of f(x) over the interval [a,b].Parameters----------f : functionVectorized function of one variablea , b : numbersEndpoints of the interval [a,b]N : integerNumber of subintervals of equal length in the partition of [a,b]method : stringDetermines the kind of Riemann sum:right : Riemann sum using right endpointsleft : Riemann sum using left endpointsmidpoint (default) : Riemann sum using midpointsReturns-------floatApproximation of the integral given by the Riemann sum.'''dx = (b - a)/Nx = np.linspace(a,b,N+1)if method == 'left':x_left = x[:-1]return np.sum(f(x_left)*dx)elif method == 'right':x_right = x[1:]return np.sum(f(x_right)*dx)elif method == 'midpoint':x_mid = (x[:-1] + x[1:])/2return np.sum(f(x_mid)*dx)else:raise ValueError("Method must be 'left', 'right' or 'midpoint'.")讓我們通過特例來驗證下這個函數,比如一下具體例子,我們知道: $$int_0^{pi/2} sin(x) , dx = 1$$ 對于$sin(x)[0,pi/2]$,運行函數:
riemann_sum(np.sin, 0, np.pi/2, 100) 1.0000102809119054 riemann_sum(np.sin, 0, np.pi/2, 100, 'right') # 右黎曼和 1.007833419873582 riemann_sum(np.sin, 0, np.pi/2, 100, 'left') # 左黎曼和 0.992125456605633再來個例子:$int_0^1 x , dx = 1/2$
riemann_sum(lambda x : x,0,1,1) 0.5總結
以上是生活随笔為你收集整理的python求不规则图形面积_python 微积分之---黎曼和的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8类网线利弊_超6类网线和7类网线有何区
- 下一篇: 定金可以退不