本文主要嘗試回答以下三個問題:
(1)系數已知的傳遞函數怎么求其零極點?
(2)系數為變量的傳遞函數怎么求其零極點表達式?
(3)只知道一組節點方程,如何推導系統傳遞函數?
01
系數已知的傳遞函數怎么求其零極點?
1.1 問題
如果我們拿到了一個傳遞函數,其所有系數是已知的,怎么計算其零極點?
1.2 解決方法
Matlab可通過兩種模型描述系統的傳遞函數,這兩種模型是:傳遞函數模型、零極點模型。它們之間是可以互相轉化的。如果一個系統傳遞函數的所有系數已知的,我們只要將其描述成傳遞函數模型,接著將其轉換成零極點模型。一旦完成轉換,我們就可以觀察到系統的零極點大小。此外,我們還可以畫出傳遞函數的零極點圖,更加直觀的看到零極點的分布位置。
EG1:如果a=1,求解G=(2*s+1)/(a*s^2+2*a*s+1)的零極點,Matlab代碼如下:
圖↑ 代碼
圖↑ 轉換為了零極點模型
圖↑ 零極點MAP圖
1.3 寫在最后
Matlab默認的傳遞函數模型一定是拉普拉斯形式的,它的輸入一般包括直接輸入和矩陣輸入。如果使用直接輸入的方式,需要在輸入之前定義Laplace算子,只有這樣Matlab才能視其為傳遞函數模型。
step( )、bode( )等分析方式只對傳遞函數模型有效
Laplace變換和其反變換只能針對符號表達式進行。也就是說,你對一個時域函數進行Laplace變換后得到的Lalace表達式,雖然在我們看來就是傳遞函數,但Matlab并不會視其為傳遞函數模型(除非定義Laplace算子后重新輸入一遍Lplace表達式)
02
系數為變量的傳遞函數怎么求其零極點表達式?
2.1 問題
你有沒有面臨過這樣一種情況:當你設計一個OP時,為了計算出它準確的傳遞函數,你首先畫出包含各種寄生電容效應的小信號模型圖,然后經過了艱難的計算,終于讓你算出了傳遞函數的表達式。為了穩定性設計,你需要知道它的零極點分布情況。這時候你需要接著對傳遞函數進行第二次的求解,目的是為了求得零極點表達式。只有這樣你才能清楚地知道零極點和哪些參數相關,來指導你在設計上實現優化。
但有時候,零極點表達式的計算是很困難。
基于上述的問題,尤其是當一個傳遞函數包含未知參數(多于1個)時,我們有沒有可能借助Matlab工具計算出零極點公式呢?回答是:如果傳遞函數是二階的,利用Matlab求零極點表達式是容易實現的。但對于更高階的系統而言,想通過Matlab來求得解析解是極其困難的。
我們通常求解傳遞函數的零極點,其實就是求解傳遞函數其分子或分母的根,那么該問題本質上就是一個求方程解的問題。該問題或可借助Matlab工具輔助解決。
Matlab的符號運算工具箱提供了一個solve()函數,該函數可以用于一般線性或非線性方程的解析求解,可以用來試著解決我們所關心的問題。
2.2 solve()函數簡介
solve的調用形式:
solve(eq)
solve(eq, var)
solve(eq1, eq2, …, eqn)
solve(eq1, eq2, …, eqn, var1, var2, …, varn)
eq為符號表達式,var為指定的要求解的變量。如果不聲明要求解的變量(第一和第三種形式),則matlab自動按默認變量進行求解。
下面試著以一個通用一元二次方程的求解例子來理解solve( )函數。
EG2:試對一個典型的一元二次方程y=a*x^2+b*x+c進行求解。Matlab的實現代碼和結果如下:
圖↑ 程序及結果
程序計算得到的結果是一元二次方程的通解,對于該結果我們應該是相當熟悉的。
2.3實際傳遞函數根的求解
EG3:下圖為拉扎維書上一個共源極放大器的例子,給出了該電路的精確傳遞函數。
我們先觀察該傳遞函數,發現它是一個二階系統。由于所有二階傳遞函數的分母的其實都是a*x^2+b*x+c的形式,表達式中的各個電阻、電容可以申明為變量。如此一來,此例的實現和EG2并沒有什么不同。令分母等于0,求解的結果便是系統的極點了。此例中零點可以直接觀察得出。
圖↑ 拉扎維書上的內容
思考這樣一個問題:我們真的需要借助Matlab對諸如此類的二階系統求零極點表達式嗎?
如前所述,我們很清楚一個二階方程a*x^2+b*x+c=0的通解是什么,那么就可以直接應用該公式進行極點求解,這時候用Matlab就有點多余了。
那么對于更高階的方程,比如三次方程,Matlab能夠勝任解析求解嗎?答案是不能。因為一個通用的一元三次方程是沒有通解的,因此想通過簡單申明變量、借助Matlab求其解析解的想法注定難以實現。需要注意的是,雖然三階方程沒有通解,但并不代表其沒有解,它的解是根據判別式的不同而不同的。而如果明確知道這個判別式,便可以將其作為一個新的約束方程,和傳遞函數進行方程聯解,這時候是有可能求出結果的。
在實際模擬電路的設計中,我們通常會通過“假設-保證假設成立”的方式來簡化方程求解。剛才說到的“判別式”像極了我們電路設計時的種種假設條件,所有的計算都有賴于這個前提的成立。關于eg2,在書中拉扎維不就假定主極點遠遠小于次極點來簡化零極點計算的么。倘若這種假設是合理的,這將為快速估算提供新的途徑。但是,這種堪稱宇宙無敵的假設法,一般人是用不了的,比如我就經常碰到這樣的問題:自認為完美的假設,在一圈計算下來之后才發現前提是不成立的。兩種假設之間的差別或許就代表著我和大神之間的距離,這多少有點打擊自信心。
至此可以做個小結:
對于包含變量的傳遞函數,如果其是二階的,利用Matlab求零極點表達式是容易實現的。但對于更高階的系統而言,想通過Matlab來求得解析解是極其困難的。
Matlab解出的表達式即使是準確的,仍需要我們自己去對公式進行近似。或許近似的公式不絕對準確,但卻可以用于指導設計。
2.4寫在最后
對于電路系統:
對于一個電路系統,它有可能是單輸入、單輸出的,也有可能是多輸入、多輸出的。對于前者,其傳遞函數是一個一元方程;而對于后者,其傳遞函數通常是一個方程組。但無論是哪種情況,都可以使用solve()函數嘗試對其求解 。
關于Matlab的符號計算:
計算精確:符號計算基于數學公式、定理并通過一系列推理、演繹得到方程的解或者數學表達式的值,對操作對象不進行離散化和近似化處理;
應用范圍有限:實際科研和生產中遇到的問題絕大多數都無法獲得精確的符號解,這時我們不得不求助數值計算;
對符號計算態度:用其來完成公式推導和解決簡單的對計算時效性要求不高的問題,綜合符號計算和數值計算各自的優點,視問題特點混合使用符號計算和數值計算。
關于solve():
solve()函數適用于單變量方程(比如只有x一個未知數 )或多變量方程(比如本文例子中有a,b,c,x,y多個變量)的求解。但該函數能求解的前提是求解對象確實存在解析解,如果沒有,那么只能求解數值解,但數值解需要傳遞函數的各系數已知。
03
只知道一組節點方程,如何推導系統傳遞函數?
3.1 問題
針對一個小信號模型,如果我們只能根據KCL/KVL列出節點方程,因此可以得到一組節點方程。我們能否借助Matlab工具根據節點方程組推導出傳遞函數呢?
3.2 解決方法
圖↑ 書上的一個例子
如上圖,這是拉扎維書上的一個例子,我們試著編寫程序,看看能否利用兩個節點方程推導出傳遞函數。
程序如下:
圖↑ 代碼
運行結果:
圖↑ 運行結果
直接求出的H1結果是正確的,但式中還帶有變量Vx,雖然上下式中都有,可以化簡掉,但該結果總是不那么理想。因此對H1進行合并同類項后得到H2,可以看到H2完全按照降冪排列,且已經化除了Vx,表達式和書上的完全一樣。
看來,利用Matlab是可以實現傳遞函數的推導的!
3.3 寫在最后
其實推導傳遞函數本身并沒有什么難度,即使手算無非也就是多花點時間,Matlab只是能讓我們偷個懶而已,況且你是否敢完全相信軟件的推導結果呢?
更有意義的是如何面對一個傳遞函數,比如了解它的零極點分布,了解怎樣在參數之間取舍才能得到一個穩定的系統。而這,軟件似乎無能為力。
審核編輯:黃飛
-
模擬電路
+關注
關注
125文章
1590瀏覽量
103718 -
matlab
+關注
關注
188文章
2998瀏覽量
233361 -
函數
+關注
關注
3文章
4372瀏覽量
64289
發布評論請先 登錄
matlab的根軌跡、增益選擇、方程求解和演示示例命令
請問這個電源系統的bode圖如何配置零極點?
MATLAB教程之如何使用MATLAB求解數學問題資料概述

評論