SciPy Tutorial - Wanderlust

Chào mọi người, hôm nay mình sẽ viết về SciPy (đọc là “Sigh Pie” – “Sai Pai”), vừa để củng cố kiến thức, vừa để làm tài liệu hướng dẫn cho các bạn học môn Multimedia Communication ở UET.

I. Giới thiệu

Vậy SciPy là gì? Nếu bạn để ý một chút, chữ “P” trong SciPy được viết hoa, như thể đây là một từ ghép. SciPy là viết tắt của Science Python, nó là một thư viện mã nguồn mở các thuật toán và các công cụ toán học cho Python.

SciPy cung cấp khá nhiều module tính toán từ đại số tuyến tính, tích phân, vi phân, nội suy đến xử lý ảnh, fourier transform blabla… Chức năng của nó tương tự như MathLab, Octave. Scilab, R… nhưng nó được sử dụng khá rộng rãi do có hệ thống thư viện tính toán mạnh, ngôn ngữ Python rõ ràng, dễ hiểu, gần gũi với ngôn ngữ tự nhiên, mã nguồn mở và cộng đồng đang dần lớn mạnh từng ngày.

Với SciPy bạn có thể làm được nhiều thứ khá kì diệu chỉ trong một nốt nhạc, ví dụ thao tác với ma trận cực kì đơn giản (nếu đang học đại số bạn có thể dùng SciPy để kiểm tra xem mình nhân ma trận 4×4 có đúng không :3 ), vẽ các đồ thị, tạo ra các mô hình tính toán, mô phỏng hoạt động truyền tin giữa các host trong mạng…

II. Cài đặt

Bạn có thể cài đặt SciPy theo hướng dẫn trên website chính của SciPy tại đây.Để thuận tiện thì mọi người nên dùng một Scientific Python distribution, cơ bản nó là một gói tổng hợp tất cả những packages cần thiết để có thể sử dụng được SciPy, cụ thể hơn mình khuyến khích mọi người dùng Anaconda, giao diện đẹp, thân thiện, dễ sử dụng :3 Support cho cả Window, Mac và Linux. Nhớ download bản dùng Python 2 nha (đúng với thời điểm hiện tại), lí do là Python 3 vẫn đang phát triển và không hoàn toàn tương thích ngược với các hệ thống cũ chạy Python 2.

Chú ý: Khi cài đặt trên Linux, bạn cần đảm bảo rằng lệnh “python” sẽ chạy python của Anaconda thay vì bản python cài riêng trên máy. Hãy mở file ~/.bashrc (hidden file tại /home) và đảm bảo rằng trong file đó có dòng“export PATH=”/home/user/anaconda/bin:$PATH”Các minh hoạ trong phần còn lại của bài viết mình sẽ dùng Anaconda trên Window (tại mình dùng Window :”> )

III. Hướng dẫn sử dụng Anaconda (trên Window)

Bước 1: Mở Anaconda Navigator

Nói qua một chút về Anaconda. Nó là một bản phân phối mã nguồn mở của ngôn ngữ Python và R dùng để xử lý dữ liệu lớn, phân tích dữ liệu, tính toán khoa học,… Và nó bao gồm SciPy.Bạn sẽ thấy cửa sổ Anaconda Navigator hiện ra, và có nhiều application để bạn lựa chọn.

9-7-2016-5-00-59-pm

Bước 2: Mở application spyder bằng cách nhấn vào nút lauch. Spyder sẽ được bật lên.Như mọi IDE khác, nó cũng có thanh menu, thanh toolbar. Giao diện mặc định gồm 3 vùng chính:

  • Editor: Để soạn script.
  • IPython console: Vùng chạy lệnh script.
  • Console: Hiện tại không quan tâm lắm :”>

Như các bạn có thể đã biết, Python là một ngôn ngữ thông dịch, tức là ngôn ngữ không cần phải biên dịch ra file chạy mà đọc code đến đâu thì chạy đến đó, giống như giao diện dòng lệnh (Window command prompt hay Terminal) mình gõ lệnh nào thì lệnh đó được thực thi. Khu vực IPython console chính là giao diện thực thi dòng lệnh của Python. Khi có nhiều lệnh cần thực thi nhiều lần thì ta sẽ viết chúng vào một file .py (vùng editor) và nhấn nút Run (hình tam giác màu xanh lục) hoặc ấn F5 để thực thi đoạn lệnh trong file đó.

9-7-2016-5-00-59-pm

Bạn có thể ẩn hiện các vùng thoả mái trong menu View và kéo thả các vùng loạn xạ, ví dụ như thế này =))

9-7-2016-5-00-59-pm
IV. Làm quen SciPy

Vì SciPy được viết bằng Python nên bạn không thể học được SciPy nếu không có kiến thức cơ bản về Python. Bạn có thể tham khảo thêm về Python tại đây.

1. Import thư viện

SciPy được xây dựng từ NumPy, do đó để sử dụng những hàm xử lý mảng đơn giản, bạn chỉ cần import thư viện Numpy là ok :3>>> import numpy as np >>> np.some_function()

Để sử dụng các module của SciPy, bạn cần import chúng trực tiếp từ thư viện SciPy>>> from scipy import some_module >>> some_module.some_function()

2. Các hàm cơ bản

Vì là được xây dựng từ Python nên SciPy hỗ trợ tất cả các kiểu dữ liệu của Python (số tự nhiên, số thực, số phức, kiểu boolean, kiểu string, array…)

Hệ thống hàm của SciPy khiến nhiều thao tác được thực hiện một cách dễ dàng hơn.

2.1 Index tricks

NumPy có một số hàm như np.mgrid , np.ogrid , np.r_ , and np.c_ giúp chúng ta có thể tạo các mảng một cách cực kì nhanh chóng.

Ví dụ, thay vì phải viết một lệnh dài như thế này để nối các mảng In a = np.concatenate(([3], [0]*5, np.arange(-1, 1.002, 2/9.0))) Out: array([ 3. , 0. , 0. , 0. , 0. , 0. , -1. , -0.77777778, -0.55555556, -0.33333333, -0.11111111, 0.11111111, 0.33333333, 0.55555556, 0.77777778, 1. ])

ta có thể viết ngắn gọn hơn bằng lệnh np.r_>>> a = np.r_[3,[0]*5,-1:1:10j] array([ 3. , 0. , 0. , 0. , 0. , 0. , -1. , -0.77777778, -0.55555556, -0.33333333, -0.11111111, 0.11111111, 0.33333333, 0.55555556, 0.77777778, 1. ])

Kí tự “r” là viết tắt của row concatenation, hàm np.r_ sẽ gộp các mảng tham số lại làm một, miễn là các mảng tham số có số cột giống nhau.

Còn lệnh np._c sẽ gộp các mảng hai chiều thành một bằng các nối các cột lại với nhau (các mảng phải cùng số hàng):

>>> np.c_[[[1,2],[3,4]],[[5,6],[7,8]]] array([[1, 2, 5, 6], [3, 4, 7, 8]])

2.2 Đa thức

Ta có thể sử dụng class poly1s trong Numpy để biểu diễn đa thức.>>> from numpy import poly1d >>> p = poly1d([3,4,5]) >>> print p 2 3 x + 4 x + 5 >>> print p*p 4 3 2 9 x + 24 x + 46 x + 40 x + 25 >>> print p.integ(k=6) 3 2 1 x + 2 x + 5 x + 6 >>> print p.deriv() 6 x + 4 >>> p([4, 5]) array([ 69, 100])

2.3 Vectorizing functions (vectorize)

Một trong những tính năng của NumPy đó là véc tơ hoá các hàm. Thế tức là sao? Tức là nó có thể biết một hàm thành một dạng khác, nhận tham số vô hướng và trả lại kết quả vô hướng.>>> def addsubtract(a,b): ... if a > b: ... return a - b ... else: ... return a + b >>> vec_addsubtract = np.vectorize(addsubtract) >>> vec_addsubtract([0,3,6,9],[1,3,5,7]) array([1, 6, 1, 2])

3. Các hàm đặc biệt

Tính năng chính của package scipy.special là nó cung cấp một số lượng lớn các hàm vật lý tính toán. Các hàm có sẵn bao gồm hàm airy, eliptic, bessel, gamma, beta, hypergeometric, parabolic cylinder, mathieu, spheroidal wave, struve, và kelvin. Nó cũng cung cấp một số hàm thống kê cấp thấp trong stats module chủ yếu để phục vụ nhu cầu cơ bản. Phần lớn các hàm đó đều nhận tham số là mảng và trả về mảng.>>>from scipy import special >>>help(special)Hàm sẽ trả lại hướng dẫn sử dụng các hàm trong package scipy.special.

4. Tích phân (integration)

Sub-package scipy.integrate cung cấp khá nhiều kĩ thuật tích phân.

>>> help(integrate) Methods for Integrating Functions given function object.

quad -- General purpose integration. dblquad -- General purpose double integration. tplquad -- General purpose triple integration. fixed_quad -- Integrate func(x) using Gaussian quadrature of order n. quadrature -- Integrate with given tolerance using Gaussian quadrature. romberg -- Integrate func using Romberg integration.

Methods for Integrating Functions given fixed samples.

trapz -- Use trapezoidal rule to compute integral from samples. cumtrapz -- Use trapezoidal rule to cumulatively compute integral. simps -- Use Simpson's rule to compute integral from samples. romb -- Use Romberg Integration to compute integral from (2**k + 1) evenly-spaced samples.

See the special module's orthogonal polynomials (special) for Gaussian quadrature roots and weights for other weighting factors and regions.

Interface to numerical integrators of ODE systems.

odeint -- General integration of ordinary differential equations. ode -- Integrate ODE using VODE and ZVODE routines.

4.1 General integration (quad) – Tích phân tổng quát

Giả sử ta cần tính tích phân sau:$I = \int_{0}^{4,5}J_{2.5}(x) dx$Code:>>> import scipy.integrate as integrate >>> import scipy.special as special >>> result = integrate.quad(lambda x: special.jv(2.5,x), 0, 4.5) >>> result (1.1178179380783249, 7.8663172481899801e-09) >>> >>> from numpy import sqrt, sin, cos, pi >>> I = sqrt(2/pi)*(18.0/27*sqrt(2)*cos(4.5) - 4.0/27*sqrt(2)*sin(4.5) + ... sqrt(2*pi) * special.fresnel(3/sqrt(pi))[0]) >>> I 1.117817938088701 >>> >>> print(abs(result[0]-I)) 1.03761443881e-11

4.2 General multiple integration (dblquad, tplquad) – Tích phân tổng quát nhiều lớp

Kĩ thuật để có thể đạo hàm được 2 lớp, 3 lớp bằng hàm dbquad và tloquad. Ví dụ sau đây chỉ ra cách tính đạo hàm $I_{n}$:>>> from scipy.integrate import quad, dblquad >>> def I(n): ... return dblquad(lambda t, x: np.exp(-x*t)/t**n, 0, np.inf, lambda x: 1, lambda x: np.inf) >>> >>> print(I(4)) (0.2500000000043577, 1.29830334693681e-08) >>> print(I(3)) (0.33333333325010883, 1.3888461883425516e-08) >>> print(I(2)) (0.4999999999985751, 1.3894083651858995e-08)

5. Vẽ đồ thị với thư viện Matplotlib

Kết hợp Matplotlib và SciPy có thể giúp bạn vẽ khá nhiều đồ thị hàm số phức tạp. Ví dụ:Tạo một file .py có nội dung như dưới đây:import numpy as np import matplotlib.pyplot as plt n = 256 X = np.linspace(-np.pi, np.pi, 256, endpoint=True) C,S = np.cos(X), np.sin(X) plt.plot(X, C) plt.plot(X,S) plt.show()Sau khi nhấn chạy (nhấn vào nút tam giác màu xanh lục), console sẽ trả về đồ thì như sau:plot_exercice_1_1Bạn có thể tham khảo thêm về thư viên matplotlib tại đây: http://matplotlib.org/users/pyplot_tutorial.html

Mình mong qua bài viết các bạn đã có một cái nhìn tổng quan về SciPy cũng như hiểu được một số ứng dụng của thư viện này. Chúc các bạn học tốt.

Share this:

  • Twitter
  • Facebook
Like Loading...

Related

Từ khóa » Thư Viện Scipy