<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          手把手教你使用Numpy、Matplotlib、Scipy等5個(gè)Python庫(kù)

          共 7113字,需瀏覽 15分鐘

           ·

          2021-11-15 04:43

          導(dǎo)讀:用Python設(shè)計(jì)控制系統(tǒng),你會(huì)用到接下來(lái)要介紹的幾個(gè)模塊:Numpy、Matplotlib、Scipy、Sympy和Python-Control。


          作者:南裕樹(shù)(Yuki Minami)
          來(lái)源:大數(shù)據(jù)DT(ID:hzdashuju)




          01 Numpy

          Numpy是用于數(shù)值計(jì)算的基礎(chǔ)包。

          使用Numpy可以高速高效地進(jìn)行各種數(shù)值計(jì)算、統(tǒng)計(jì)處理以及信號(hào)處理。


          import numpy as np


          加載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([ [12], [-34]])
          print(A)


          [[ 1  2]
           [-3  4]]


          可以使用T方法來(lái)求得轉(zhuǎn)置矩陣。

          print(A.T)

          [[ 1 -3]
           [ 2  4]]

          可以使用np.linalg.inv來(lái)求得逆矩陣。

          B = np.linalg.inv(A)
          print(B)

          [[ 0.4 -0.2]
           [ 0.3  0.1]]

          可以像下面這樣進(jìn)一步求得矩陣對(duì)應(yīng)的行列式的值、矩陣的秩、特征值以及范數(shù)。

          np.linalg.det(A) #行列式

          10.000000000000002

          np.linalg.matrix_rank(A) #秩

          2

          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([12])
          print(x)
          np.linalg.norm(x)

          2.23606797749979

          此外,還可以使用np.arange構(gòu)建數(shù)列。

          Td = np.arange(0101)
          print(Td)

          [0 1 2 3 4 5 6 7 8 9]

          上例中構(gòu)建了一個(gè)從0開(kāi)始到10(不包含)為止,且間隔為1的數(shù)列。


          02 Matplotlib

          Matplotlib用于圖形描繪,可以用它制作各種類(lèi)型的圖形和動(dòng)畫(huà)。繪圖的具體例子可以參考它的主頁(yè):

          http://matplotlib.org/gallery.html

          可以像下面這樣加載Matplotlib模塊。

          import matplotlib.pyplot as plt

          讓我們來(lái)看一個(gè)繪圖的例子(見(jiàn)代碼段2.1)。

          • 代碼段2.1 繪圖

          import numpy as np
          import matplotlib.pyplot as plt
          x = np.arange(04 * 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()

          這樣可以畫(huà)出如圖2.9所示的圖形。

          ▲圖2.9 使用matplotlib繪圖的例子

          如果需要對(duì)細(xì)節(jié)進(jìn)行進(jìn)一步的調(diào)整以做出更美觀的圖形,則僅僅這樣還是不夠的。此時(shí)需要如代碼段2.2所示采用能夠?qū)?xì)節(jié)進(jìn)行調(diào)整的面向?qū)ο蟮睦L圖方式。

          • 代碼段2.2 面向?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ì)象

          可以使用代碼段2.3生成圖2.11。

          • 代碼段2.3 生成圖2.11的代碼

          fig, ax = plt.subplots(2,1#設(shè)置2行1列的子圖形

          x = np.arange(04 * 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(04*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(04*np.pi)
          ax[1].grid(ls=':')

          fig.tight_layout()

          ▲圖2.11 繪制面向?qū)ο笮偷膱D形

          圖例可以通過(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)系如下所示。

          • -:實(shí)線 
          • -.:點(diǎn)畫(huà)線
          • --:虛線
          • ..:點(diǎn)線

          線的粗細(xì)可以使用類(lèi)似linewidth = 2或者lw = 2這樣的代碼來(lái)指定。線的顏色可以通過(guò)color = 'r'或者c = 'r'來(lái)指定。字符與顏色的關(guān)系如下所示。

          • b:藍(lán)
          • g:綠
          • r:紅
          • c:青
          • m:品紅
          • y:黃
          • k:黑
          • w:白

          記號(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è)定。

          ▲圖2.12 記號(hào)的類(lèi)型

          可以使用fig.savefig("hogehoge.pdf")來(lái)保存圖形。


          03 Scipy

          Scipy是用于數(shù)值計(jì)算算法的擴(kuò)展包,提供了信號(hào)處理、優(yōu)化和統(tǒng)計(jì)等功能的函數(shù),還包含了控制系統(tǒng)分析和設(shè)計(jì)用的函數(shù)。這里介紹用于求解微分方程的odeint

          試求下述微分方程的數(shù)值積分:


          假設(shè)輸入為u(t):


          代碼段2.4的輸出結(jié)果如圖2.13所示。通過(guò)def定義微分方程system,并將其與初始值y0和時(shí)間t一起傳遞給odeint

          • 代碼段2.4 微分方程的數(shù)值積分



          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(0400.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ì)算


          04 Sympy

          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)

          [-3/2-1]

          在上面的例子中,我們通過(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)

          s**3 + 5*s**2 + 8*s + 4

          g = sp.factor(f, s) 
          print(g)

          (s + 1)*(s + 2)**2

          除了上面介紹的功能以外還有series(泰勒展開(kāi))、apart(部分分式分解)、laplace_transform(拉普拉斯變換)、inverse_laplace_transform(逆拉普拉斯變換)等功能。


          05 Python-Control

          本文通過(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就表示BC就表示C,D就表示D。

          可通過(guò)下述方法加載模塊。

          import control

          也可以使用下述方法從模塊中導(dǎo)入類(lèi)MATLAB函數(shù)。

          from control.matlab import *

          ▼表2.4 模型描述


          ▼表2.5 模型分析


          ▼表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

          關(guān)于作者:南裕樹(shù)(Yuki Minami),大阪大學(xué)大學(xué)院工學(xué)研究科機(jī)械工學(xué)專(zhuān)業(yè)教授,京都大學(xué)大學(xué)院情報(bào)學(xué)研究科博士。主要研究領(lǐng)域包含制造技術(shù)、系統(tǒng)工程、深度學(xué)習(xí)等。

          本文摘編自用Python輕松設(shè)計(jì)控制系統(tǒng)》,經(jīng)出版方授權(quán)發(fā)布。(ISBN:9787111688112

          用Python輕松設(shè)計(jì)控制系統(tǒng)
          點(diǎn)擊上圖了解及購(gòu)買(mǎi)
          轉(zhuǎn)載請(qǐng)聯(lián)系微信:DoctorData

          推薦語(yǔ):面向用Python進(jìn)行控制系統(tǒng)設(shè)計(jì)的人,邊學(xué)邊用Python進(jìn)行編程實(shí)踐。重點(diǎn)闡述以狀態(tài)空間模型為對(duì)象的現(xiàn)代控制系統(tǒng)的設(shè)計(jì)。全書(shū)分七章,包括: Pythhon環(huán)境的構(gòu)建、數(shù)據(jù)和流控制、反饋控制、狀態(tài)空間模型、閉環(huán)系統(tǒng)的控制設(shè)計(jì)、開(kāi)環(huán)系統(tǒng)的控制設(shè)計(jì)、PID控制相位進(jìn)延遲補(bǔ)償,以及穩(wěn)健性控制數(shù)字實(shí)現(xiàn)的高級(jí)控制系統(tǒng)設(shè)計(jì)。


          刷刷視頻??



          干貨直達(dá)??



          更多精彩??

          在公眾號(hào)對(duì)話框輸入以下關(guān)鍵詞
          查看更多優(yōu)質(zhì)內(nèi)容!

          讀書(shū) | 書(shū)單 | 干貨 | 講明白 | 神操作 | 手把手
          大數(shù)據(jù) | 云計(jì)算 | 數(shù)據(jù)庫(kù) | Python | 爬蟲(chóng) | 可視化
          AI | 人工智能 | 機(jī)器學(xué)習(xí) | 深度學(xué)習(xí) | NLP
          5G | 中臺(tái) | 用戶(hù)畫(huà)像 數(shù)學(xué) | 算法 數(shù)字孿生

          據(jù)統(tǒng)計(jì),99%的大咖都關(guān)注了這個(gè)公眾號(hào)
          ??
          瀏覽 22
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  狠狠狠狠狠狠狠狠狠狠狠狠狠狠 | av搬运一区二区三区在线观看 | 东方欧美在线 | 韩国一区二区三区四区不卡视频 | 成人黄色网址免费 |