天天看點

數值積分

 原文位址:http://old.sebug.net/paper/books/scipydoc/scipy_intro.html#id4,轉載請注明出處!

數值積分是對定積分的數值求解,例如可以利用數值積分計算某個形狀的面積。下面讓我們來考慮一下如何計算半徑為1的半圓的面積,根據圓的面積公式,其面積應該等于PI/2。機關半圓曲線可以用下面的函數表示:

def half_circle(x):
    return (1-x**2)**0.5      

下面的程式使用經典的分小矩形計算面積總和的方式,計算出機關半圓的面積:

import numpy as np
N = 10000
x = np.linspace(-1, 1, N)
dx = 2.0/N
y = half_circle(x)
print(y)
print(y[:-1])
print(y[1:])
print(dx * np.sum(y[:-1] + y[1:])) # 3.1412751679989044
      

用上述方式計算出的圓上一系列點的坐标,還可以用numpy.trapz進行數值積分:

print(np.trapz(y, x) * 2) # 面積的兩倍 3.1415893269315975      

此函數計算的是以x,y為頂點坐标的折線與X軸所夾的面積。同樣的分割點數,trapz函數的結果更加接近精确值一些。

如果我們調用scipy.integrate庫中的quad函數的話,将會得到非常精确的結果:

from scipy import integrate
pi_half, err = integrate.quad(half_circle, -1, 1)
print(pi_half*2) #3.141592653589797      

多重定積分的求值可以通過多次調用quad函數實作,為了調用友善,integrate庫提供了dblquad函數進行二重定積分,tplquad函數進行三重定積分。下面以計算機關半球體積為例說明dblquad函數的用法。

機關半球上的點(x,y,z)符合如下方程:

數值積分

是以可以如下定義通過(x,y)坐标計算球面上點的z值的函數:

def half_sphere(x, y):
    return (1-x**2-y**2)**0.5      

X-Y軸平面與此球體的交線為一個機關圓,是以積分區間為此機關圓,可以考慮為X軸坐标從-1到1進行積分,而Y軸從 -half_circle(x) 到 half_circle(x) 進行積分,于是可以調用dblquad函數:

A = integrate.dblquad(half_sphere, -1, 1,lambda x:-half_circle(x),lambda x:half_circle(x))
print(A) #(2.094395102393199, 1.0002356720661965e-09)
#通過球體體積公式計算的半球體積)
print(np.pi*4/3/2) #2.0943951023931953      

dblquad函數的調用方式為:

dblquad(func2d, a, b, gfun, hfun)
      

對于func2d(x,y)函數進行二重積分,其中a,b為變量x的積分區間,而gfun(x)到hfun(x)為變量y的積分區間。

半球體積的積分的示意圖如下:

數值積分

X軸的積分區間為-1.0到1.0,對于X=x0時,通過對Y軸的積分計算出切面的面積,是以Y軸的積分區間如圖中紅色點線所示。