來(lái)源:大數(shù)據(jù)DT(ID:hzdashuju)
Numpy是用于數(shù)值計(jì)算的基礎(chǔ)包。使用Numpy可以高速高效地進(jìn)行各種數(shù)值計(jì)算、統(tǒng)計(jì)處理以及信號(hào)處理。
加載Numpy模塊后,就可以使用平方根(np.sqrt)、絕對(duì)值(np.abs)、三角函數(shù)(np.sin、np.cos、np.arcsin、np.arccos)、指數(shù)(np.exp)、對(duì)數(shù)(np.log、np.log10)、四舍五入(np.round)等基本的數(shù)值計(jì)算用的函數(shù)了。此外,弧度(rad)和角度(deg)換算的函數(shù)np.rad2deg也包括在內(nèi),還可以使用圓周率(np.pi)。復(fù)數(shù)通過(guò)在虛部后面添加j來(lái)表示??梢允褂?/span>np.imag來(lái)取出虛部。同樣,可以使用np.real來(lái)取出實(shí)部,用np.conj來(lái)求得共軛復(fù)數(shù)。還可以進(jìn)行向量和矩陣運(yùn)算??梢允褂?/span>np.array來(lái)定義向量和矩陣。
A = np.array([ [1, 2], [-3, 4]])
print(A)
可以使用T方法來(lái)求得轉(zhuǎn)置矩陣。可以使用np.linalg.inv來(lái)求得逆矩陣。B = np.linalg.inv(A)
print(B)
可以像下面這樣進(jìn)一步求得矩陣對(duì)應(yīng)的行列式的值、矩陣的秩、特征值以及范數(shù)。np.linalg.matrix_rank(A) #秩
w, 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)
此外,還可以使用np.arange構(gòu)建數(shù)列。Td = np.arange(0, 10, 1)
print(Td)
上例中構(gòu)建了一個(gè)從0開(kāi)始到10(不包含)為止,且間隔為1的數(shù)列。Matplotlib用于圖形描繪,可以用它制作各種類(lèi)型的圖形和動(dòng)畫(huà)。繪圖的具體例子可以參考它的主頁(yè):http://matplotlib.org/gallery.htmlimport matplotlib.pyplot as plt
讓我們來(lái)看一個(gè)繪圖的例子(見(jiàn)代碼段2.1)。import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 4 * np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y) #橫軸使用x,縱軸使用y繪圖
plt.xlabel('x') #設(shè)定x軸的標(biāo)簽
plt.ylabel('y') #設(shè)定y軸的標(biāo)簽
plt.grid() #顯示網(wǎng)格
plt.show()

如果需要對(duì)細(xì)節(jié)進(jìn)行進(jìn)一步的調(diào)整以做出更美觀的圖形,則僅僅這樣還是不夠的。此時(shí)需要如代碼段2.2所示采用能夠?qū)?xì)節(jié)進(jìn)行調(diào)整的面向?qū)ο蟮睦L圖方式。fig, ax = plt.subplots() #生成Figure和Axes對(duì)象
ax.plot(x, y) #在Axes對(duì)象中生成圖形
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.grid()
plt.show()
可以在Figure對(duì)象中生成Axes對(duì)象,并將數(shù)據(jù)傳遞給Axes對(duì)象的方法(.plot())來(lái)進(jìn)行繪圖??梢赃M(jìn)一步使用Axes對(duì)象的方法(.set_xlabel()等)來(lái)對(duì)圖形進(jìn)行調(diào)整。雖然可以像代碼段2.1這樣,在沒(méi)有明確地生成對(duì)象的前提下描繪圖形,但是如果明確生成各個(gè)對(duì)象,就可以在繪圖的同時(shí)對(duì)細(xì)節(jié)進(jìn)行調(diào)整。例如,可以如圖2.10所示,在Figure中生成兩個(gè)Axes對(duì)象。
▲圖2.10 在Figure中生成兩個(gè)Axes對(duì)象fig, ax = plt.subplots(2,1) #設(shè)置2行1列的子圖形
x = np.arange(0, 4 * np.pi, 0.1)
y = np.sin(x)
z = np.cos(x)
w = y + z
#生成第一個(gè)圖形
ax[0].plot(x, y, ls='-', label='sin', c='k')
ax[0].plot(x, z, ls='-.', label='cos', c='k')
ax[0].set_xlabel('x')
ax[0].set_ylabel('y, z')
ax[0].set_xlim(0, 4*np.pi)
ax[0].grid()
ax[0].legend()
#生成第二個(gè)圖形
ax[1].plot(x, w, color='k', marker='.')
ax[1].set_xlabel('x')
ax[1].set_ylabel('w')
ax[1].set_xlim(0, 4*np.pi)
ax[1].grid(ls=':')
fig.tight_layout()

圖例可以通過(guò)在繪圖時(shí)使用label = 'hogehoge'添加,并在最后通過(guò)ax.legend()輸出。還可以使用類(lèi)似x.legend(loc = 'best')這樣的語(yǔ)句來(lái)指定圖例的位置。指定位置時(shí)可以使用表2.1中的字符串或數(shù)值。▼表2.1 指定圖例位置時(shí)使用的字符串和數(shù)值
線的類(lèi)型可以通過(guò)linestyle = '-'或者ls = '-'來(lái)設(shè)定。符號(hào)與線型的關(guān)系如下所示。線的粗細(xì)可以使用類(lèi)似linewidth = 2或者lw = 2這樣的代碼來(lái)指定。線的顏色可以通過(guò)color = 'r'或者c = 'r'來(lái)指定。字符與顏色的關(guān)系如下所示。記號(hào)的類(lèi)型通過(guò)marker = 'o'來(lái)指定。部分記號(hào)的類(lèi)型如下所示:"." "," "o" "v" "^" "<" ">" "1" "2" "3" "4" "8""s" "p" "*" "h" "H" "+" "x" "D" "d" "|" "_" "$x$"實(shí)際的顯示效果(按照順序)如圖2.12所示。記號(hào)的大小可以像s = 10這樣設(shè)定。
可以使用fig.savefig("hogehoge.pdf")來(lái)保存圖形。Scipy是用于數(shù)值計(jì)算算法的擴(kuò)展包,提供了信號(hào)處理、優(yōu)化和統(tǒng)計(jì)等功能的函數(shù),還包含了控制系統(tǒng)分析和設(shè)計(jì)用的函數(shù)。這里介紹用于求解微分方程的odeint。

代碼段2.4的輸出結(jié)果如圖2.13所示。通過(guò)def定義微分方程system,并將其與初始值y0和時(shí)間t一起傳遞給odeint。from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt
#定義微分方程
def system(y, t):
if t < 10.0:
u = 0.0
else:
u = 1.0
dydt = (-y + u)/5.0
return dydt
#通過(guò)設(shè)定初始值和時(shí)間求解微分方程
y0 = 0.5
t = np.arange(0, 40, 0.04)
y = odeint(system, y0, t)
#繪圖
fig, ax = plt.subplots()
ax.plot(t, y, label='y', c='k')
ax.plot(t, 1 * (t>=10), ls='--', label='u')
ax.set_xlabel('t')
ax.set_ylabel('y, u')
ax.legend(loc='best')
ax.grid(ls=':')

▲圖2.13 微分方程的數(shù)值計(jì)算Sympy是用于符號(hào)計(jì)算的模塊。通過(guò)它可以把變量當(dāng)作符號(hào)處理并進(jìn)行各種計(jì)算。例如,可以進(jìn)行表達(dá)式展開(kāi)、因式分解、微分、積分甚至是拉普拉斯變換。import sympy as sp
sp.init_printing()
s = sp.Symbol('s')
root = sp.solve(2 * s**2 +5*s+3, s)
print(root)
在上面的例子中,我們通過(guò)Symbol將變量定義為字符,使用solve求得方程的根。如果使用init_printing(),還可以輸出LaTeX格式的結(jié)果。此時(shí)不要使用print,應(yīng)直接輸入root。使用expand可以進(jìn)行表達(dá)式展開(kāi),使用factor可以進(jìn)行因式分解。f = sp.expand( (s+1)*(s+2)**2, s)
print(f)
g = sp.factor(f, s)
print(g)
除了上面介紹的功能以外還有series(泰勒展開(kāi))、apart(部分分式分解)、laplace_transform(拉普拉斯變換)、inverse_laplace_transform(逆拉普拉斯變換)等功能。本文通過(guò)實(shí)例介紹Python-Control函數(shù)。函數(shù)及其基本使用方法總結(jié)在表2.4~表2.8中,請(qǐng)讀者在閱讀過(guò)程中隨時(shí)查閱。如果系統(tǒng)sys表示成以下形式:
那么num就表示[bm,...,b0],den就表示[an,...a0],k就表示k,z就表示[z1,...,zm,p就表示[p1,...,pn]。如果系統(tǒng)sys表示成以下形式:
那么A就表示A,B就表示B,C就表示C,D就表示D。也可以使用下述方法從模塊中導(dǎo)入類(lèi)MATLAB函數(shù)。from control.matlab import *


▼表2.6 控制系統(tǒng)設(shè)計(jì)
▼表2.7 模型解析(from control import cannonical_form)
▼表2.8 控制系統(tǒng)設(shè)計(jì)(from control import mixsyn)
除了上面介紹的這些函數(shù)之外還有一些其他的方便實(shí)用的函數(shù)。比如,求取根軌跡的函數(shù)rlocus、求取平衡降階模型的函數(shù)balred、求解李雅普諾夫方程的函數(shù)lyap、用于H2控制系統(tǒng)設(shè)計(jì)的函數(shù)h2syn以及用于H∞控制系統(tǒng)設(shè)計(jì)的函數(shù)hinfsyn等。詳細(xì)內(nèi)容可以參考Python Control Systems Library:https://python-control.readthedocs.io/en/0.8.1/index.html