python Scipy積分運算大全(integrate模塊——一重、二重及三重積分)


python中Scipy模塊求取積分的方法:

SciPy下實現求函數的積分的函數的基本使用,積分,高等數學里有大量的講述,基本意思就是求曲線下面積之和。

其中rn可認為是偏差,一般可以忽略不計,wi可以視為權重。

在SciPy里提供了很多的求各類積分的函數,依據傳入參數的不同可以分為兩類:一類是傳入一個已知的函數和積分的上下限;另一類是傳入點集,這個適用於做完物理實現后收集的一些數據,但函數無法確定,但有很多的數據點,那么這些點包絡下的面積是多少,也是積分問題,所以在SciPy里有針對點集求積分的函數,形式上函數的參數是數組或者列表。

1、已知函數型求積分

本節以幾個問題的形式展示SciPy下如何求積分。

  • 問題1:這里假設函數為f(x)=x+1,求積分的上下限為[1,2],數學表達式為:

可以利用Scipy模塊下的子模塊integrate里的quad函數來求這個數學問題的計算值。

from scipy import integrate def f(x): return x + 1 v, err = integrate.quad(f, 1, 2) print v 

程序的執行結果為:

2.5

問題2:但對於f(x)=ax+b這種函數,a和b肯能未知的這種函數,quad能用么?答案是可以的,quad有形參args可以傳入一些參數進去的。
from scipy import integrate def f(x, a, b): return a * x + b v, err = integrate.quad(f, 1, 2, args = (-1, 1)) print v 

程序的執行結果是:

-0.5

問題3:如果遇到積分函數有斷點,可以通過quad函數的points給出斷點繼續求積分。例如:


這里f(x)在x=0的地方存在斷點,如果沒有給出斷點就通過quad計算計算:
from scipy import integrate import numpy as np def f(x): return 1 / np.sqrt(abs(x)) v, err = integrate.quad(f, -1, 1) print v 

程序運行時:

scipy1801.py:4: RuntimeWarning: divide by zero encountered in double_scalars return 1 / np.sqrt(abs(x)) inf 

結果是inf(無限、無窮)且有除0錯誤! 修改一下:

from scipy import integrate import numpy as np def f(x): return 1 / np.sqrt(abs(x)) v, err = integrate.quad(f, -1, 1, points=[0]) print v 

結果是:

4

我們可以繪制一下這個函數的可視化曲線:

from scipy import integrate import numpy as np def f(x): return 1 / np.sqrt(abs(x)) v, err = integrate.quad(f, -1, 1, points=[0]) print v import numpy as np, matplotlib.pyplot as plt from mpl_toolkits.mplot3d.axes3d import Axes3D fig, ax = plt.subplots(figsize=(8, 3)) x = np.linspace(-1, 1, 10000) ax.plot(x, f(x), lw=2) ax.fill_between(x, f(x), color='green', alpha=0.5) ax.set_xlabel("$x$", fontsize=18) ax.set_ylabel("$f(x)$", fontsize=18) ax.set_ylim(0, 25) plt.show() 

得到如下的結果圖: 

2 給出點集的積分

在無法確認積分函數的情況下,給出一些序列也可做積分。

  • 問題4求積分而是有這個函數的10個樣本數據,那傳入quad函數的不是f(x)=x, 而是對應的各個(xi,yi)。
from scipy import integrate import numpy as np def f(x): return np.sqrt(x) x = np.linspace(0, 2, 10) y = f(x) v = integrate.trapz(y, x) print v 

程序的運行結果:

1.8652953655957172

3 多重積分

SciPy下的二重積分可以用dblquad函數來計算、三重積分可以用tplquad函數來計算而關於f(x1,x2,⋯,xn)的多重積分可以使用nquad函數。

  • 二重積分dblquad函數來計算,假設有一個函數f(x,y)需要計算其二重積分。
如何用Scipy的dblquad函數呢? 對於一個泛型的二重積分的一般表達式格式為:

那么dblquad函數的第一個形參應是f(x,y)、第2、3、4、5分別是a、b、g(x)、h(x),也就是說dblquad函數的第4和5是一個函數。
from scipy import integrate import numpy as np def f(x, y): return x * y def h(x): return x v, err = integrate.dblquad(f, 1, 2, lambda x: 1, h) print v 

程序的執行結果:

1.125


三重積分可以使用tplquad來計算。三重積分的一般表達式格式為:

tqlquad(f, a, b, g, h, q, r) 

其中f、g、h、q、r均為函數。下面以計算

用Python編寫的程序如下所示:

from scipy import integrate import numpy as np f = lambda x, y, z : x g = lambda x : 0 h = lambda x : (1 - x) / 2 q = lambda x, y : 0 r = lambda x, y : 1 - x - 2 * y v, err = integrate.tplquad(f, 0, 1, g, h, q, r) print v 

程序執行結果:

0.02083333333


 

 

 


免責聲明!

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



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