手把手教你使用Numpy、Matplotlib、Scipy等5个Python库
導讀:用Python設計控制系統,你會用到接下來要介紹的幾個模塊:Numpy、Matplotlib、Scipy、Sympy和Python-Control。
作者:南裕樹(Yuki Minami)
來源:大數據DT(ID:hzdashuju)
01 Numpy
Numpy是用于數值計算的基礎包。
使用Numpy可以高速高效地進行各種數值計算、統計處理以及信號處理。
import?numpy?as?np加載Numpy模塊后,就可以使用平方根(np.sqrt)、絕對值(np.abs)、三角函數(np.sin、np.cos、np.arcsin、np.arccos)、指數(np.exp)、對數(np.log、np.log10)、四舍五入(np.round)等基本的數值計算用的函數了。
此外,弧度(rad)和角度(deg)換算的函數np.rad2deg也包括在內,還可以使用圓周率(np.pi)。
復數通過在虛部后面添加j來表示??梢允褂胣p.imag來取出虛部。同樣,可以使用np.real來取出實部,用np.conj來求得共軛復數。
還可以進行向量和矩陣運算。可以使用np.array來定義向量和矩陣。
A?=?np.array([?[1,?2],?[-3,?4]]) print(A)[[?1??2][-3??4]]可以使用T方法來求得轉置矩陣。
print(A.T)[[?1?-3][?2??4]]可以使用np.linalg.inv來求得逆矩陣。
B?=?np.linalg.inv(A) print(B)[[?0.4?-0.2][?0.3??0.1]]可以像下面這樣進一步求得矩陣對應的行列式的值、矩陣的秩、特征值以及范數。
np.linalg.det(A)?#行列式10.000000000000002np.linalg.matrix_rank(A)?#秩2w,?v?=?np.linalg.eig(A)?#特征值和特征向量 print('eigenvalue=',w) print('eigenvector=\n',v)eigenvalue=?[2.5+1.93649167j?2.5-1.93649167j] eigenvector=[[0.38729833-0.5j?0.38729833+0.5j][0.77459667+0.j??0.77459667-0.j?]]x?=?np.array([1,?2]) print(x) np.linalg.norm(x)2.23606797749979此外,還可以使用np.arange構建數列。
Td?=?np.arange(0,?10,?1) print(Td)[0?1?2?3?4?5?6?7?8?9]上例中構建了一個從0開始到10(不包含)為止,且間隔為1的數列。
02 Matplotlib
Matplotlib用于圖形描繪,可以用它制作各種類型的圖形和動畫。繪圖的具體例子可以參考它的主頁:
http://matplotlib.org/gallery.html
可以像下面這樣加載Matplotlib模塊。
import?matplotlib.pyplot?as?plt讓我們來看一個繪圖的例子(見代碼段2.1)。
代碼段2.1 繪圖
這樣可以畫出如圖2.9所示的圖形。
▲圖2.9 使用matplotlib繪圖的例子
如果需要對細節進行進一步的調整以做出更美觀的圖形,則僅僅這樣還是不夠的。此時需要如代碼段2.2所示采用能夠對細節進行調整的面向對象的繪圖方式。
代碼段2.2 面向對象的繪圖
可以在Figure對象中生成Axes對象,并將數據傳遞給Axes對象的方法(.plot())來進行繪圖??梢赃M一步使用Axes對象的方法(.set_xlabel()等)來對圖形進行調整。雖然可以像代碼段2.1這樣,在沒有明確地生成對象的前提下描繪圖形,但是如果明確生成各個對象,就可以在繪圖的同時對細節進行調整。例如,可以如圖2.10所示,在Figure中生成兩個Axes對象。
▲圖2.10?在Figure中生成兩個Axes對象
可以使用代碼段2.3生成圖2.11。
代碼段2.3?生成圖2.11的代碼
▲圖2.11?繪制面向對象型的圖形
圖例可以通過在繪圖時使用label = 'hogehoge'添加,并在最后通過ax.legend()輸出。還可以使用類似x.legend(loc = 'best')這樣的語句來指定圖例的位置。指定位置時可以使用表2.1中的字符串或數值。
▼表2.1?指定圖例位置時使用的字符串和數值
線的類型可以通過linestyle = '-'或者ls = '-'來設定。符號與線型的關系如下所示。
-:實線
-.:點畫線
--:虛線
..:點線
線的粗細可以使用類似linewidth = 2或者lw = 2這樣的代碼來指定。線的顏色可以通過color = 'r'或者c = 'r'來指定。字符與顏色的關系如下所示。
b:藍
g:綠
r:紅
c:青
m:品紅
y:黃
k:黑
w:白
記號的類型通過marker = 'o'來指定。部分記號的類型如下所示:
"."? ","? "o"? "v"? "^"? "<"? ">"? "1"? "2"? "3"? "4"? "8"
"s"? "p"? "*"? "h"? "H"? "+"? "x"? "D"? "d"? "|"? "_"? "$x$"
實際的顯示效果(按照順序)如圖2.12所示。記號的大小可以像s = 10這樣設定。
▲圖2.12?記號的類型
可以使用fig.savefig("hogehoge.pdf")來保存圖形。
03 Scipy
Scipy是用于數值計算算法的擴展包,提供了信號處理、優化和統計等功能的函數,還包含了控制系統分析和設計用的函數。這里介紹用于求解微分方程的odeint。
試求下述微分方程的數值積分:
假設輸入為u(t):
代碼段2.4的輸出結果如圖2.13所示。通過def定義微分方程system,并將其與初始值y0和時間t一起傳遞給odeint。
代碼段2.4 微分方程的數值積分
▲圖2.13?微分方程的數值計算
04 Sympy
Sympy是用于符號計算的模塊。通過它可以把變量當作符號處理并進行各種計算。例如,可以進行表達式展開、因式分解、微分、積分甚至是拉普拉斯變換。
import?sympy?as?sp? sp.init_printing() s?=?sp.Symbol('s') root?=?sp.solve(2?*?s**2?+5*s+3,?s) print(root)[-3/2,?-1]在上面的例子中,我們通過Symbol將變量定義為字符,使用solve求得方程的根。如果使用init_printing(),還可以輸出LaTeX格式的結果。此時不要使用print,應直接輸入root。
使用expand可以進行表達式展開,使用factor可以進行因式分解。
f?=?sp.expand(?(s+1)*(s+2)**2,?s) print(f)s**3?+?5*s**2?+?8*s?+?4g?=?sp.factor(f,?s)? print(g)(s?+?1)*(s?+?2)**2除了上面介紹的功能以外還有series(泰勒展開)、apart(部分分式分解)、laplace_transform(拉普拉斯變換)、inverse_laplace_transform(逆拉普拉斯變換)等功能。
05 Python-Control
本文通過實例介紹Python-Control函數。函數及其基本使用方法總結在表2.4~表2.8中,請讀者在閱讀過程中隨時查閱。如果系統sys表示成以下形式:
那么num就表示[bm,...,b0],den就表示[an,...a0],k就表示k,z就表示[z1,...,zm,p就表示[p1,...,pn]。如果系統sys表示成以下形式:
那么A就表示A,B就表示B,C就表示C,D就表示D。
可通過下述方法加載模塊。
import?control也可以使用下述方法從模塊中導入類MATLAB函數。
from?control.matlab?import?*▼表2.4 模型描述
▼表2.5 模型分析
▼表2.6 控制系統設計
▼表2.7 模型解析(from control import cannonical_form)
▼表2.8 控制系統設計(from control import mixsyn)
除了上面介紹的這些函數之外還有一些其他的方便實用的函數。
比如,求取根軌跡的函數rlocus、求取平衡降階模型的函數balred、求解李雅普諾夫方程的函數lyap、用于H2控制系統設計的函數h2syn以及用于H∞控制系統設計的函數hinfsyn等。
詳細內容可以參考Python Control Systems Library:
https://python-control.readthedocs.io/en/0.8.1/index.html
關于作者:南裕樹(Yuki Minami),大阪大學大學院工學研究科機械工學專業教授,京都大學大學院情報學研究科博士。主要研究領域包含制造技術、系統工程、深度學習等。
本文摘編自《用Python輕松設計控制系統》,經出版方授權發布。(ISBN:9787111688112)
《用Python輕松設計控制系統》
點擊上圖了解及購買
轉載請聯系微信:DoctorData
推薦語:面向用Python進行控制系統設計的人,邊學邊用Python進行編程實踐。重點闡述以狀態空間模型為對象的現代控制系統的設計。全書分七章,包括: Pythhon環境的構建、數據和流控制、反饋控制、狀態空間模型、閉環系統的控制設計、開環系統的控制設計、PID控制相位進延遲補償,以及穩健性控制數字實現的高級控制系統設計。
刷刷視頻👇
干貨直達👇
收藏!數據分析、人工智能、產品經理等6個方向學習路線圖及參考書目
盤點云原生的5大特征
終于有人把云計算與數據庫的關系講明白了
解決卡脖子問題:盤點中國工業軟件產業細分領域市場格局
更多精彩👇
在公眾號對話框輸入以下關鍵詞
查看更多優質內容!
讀書?|?書單?|?干貨?|?講明白?|?神操作?|?手把手
大數據?|?云計算?|?數據庫?|?Python?|?爬蟲?|?可視化
AI?|?人工智能?|?機器學習?|?深度學習?|?NLP
5G?|?中臺?|?用戶畫像?|?數學?|?算法?|?數字孿生
據統計,99%的大咖都關注了這個公眾號
👇
總結
以上是生活随笔為你收集整理的手把手教你使用Numpy、Matplotlib、Scipy等5个Python库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪些数据库是行存储?哪些是列存储?有什么
- 下一篇: 快抢!猪年之前最后一波送书福利,错过只能