上一篇文章把普通支路接进了节点电压法。电阻支路可以写成:
i=G(ua−ub)电感、电容和 RLC 串联支路离散以后,也可以整理成:
i=Geq(ua−ub)+Ihis所以它们进入节点矩阵时,结构都很像:
[iaib]=[G−G−GG][uaub]+[Ihis−Ihis]源类元件会让事情多一层。前面 R、L、C 支路的电流主要由自己两端的电压和历史状态决定;而电流源、电压源和受控源,还会引入一个“源量”。
这个源量有两种常见来源。一种是外部显式给定的信号,例如一个工频正弦电流、工频正弦电压、控制器输出的 PWM 占空比,或者某个仿真模块传进来的参考量;这种情况下,源量在当前步开始前通常已经是已知量。另一种是来自电路内部,例如另两个节点之间的电压,或者某条支路的电流;这种情况下,源量可能和当前待求的节点电压、支路电流耦合在一起。
所以本文先从最普通的显式电流源、显式电压源讲起,再看它们推广成受控源以后,怎样写进节点电压法的矩阵。
本文仍然沿用上一篇文章的约定:
- 节点电压写作ua,ub,uc,ud。
- 输出支路方向从节点a指向节点b。
- 对节点写方程时,从该节点流出的支路电流记为正。
- 控制电压写作ucd=uc−ud。
显式电流源
先看最普通的独立电流源。设电流源接在节点a和节点b之间,电流方向从a指向b,当前步电流值为已知量Is:
显式电流源连接节点 a 和节点 bi=Is按“流出节点为正”的约定,对两个端点有:
ia=Isib=−Is写成矩阵形式就是:
[iaib]=[0000][uaub]+[Is−Is]这个式子很直观:理想电流源不提供导纳,所以左边的矩阵是零矩阵;它只给当前步节点方程贡献一个已知电流向量。
显式电流源的工程建模
工程软件里,理想电流源经常不会孤零零地放进网络。很多模型会给电流源并联一个很大的电阻,也就是并联一个很小的导纳。这样做不是为了改变电流源的主要物理作用,而是为了让这个端口在节点矩阵里多少有一点导纳约束。
为什么要这样做?先看一个“不并联”的例子。只给一个理想电流源时,支路本身不提供导纳约束。即使这个电流源再串联一个电阻,只要从节点矩阵角度把中间节点也列出来,局部矩阵仍然可能是奇异的。
看下面这个例子。显式电流源从节点a指向节点b,电流为Is;节点b再经过电阻R连接到节点d:
显式电流源串联电阻时,电流源端口仍然不提供导纳约束电阻支路电流为:
iR=G(ub−ud)其中G=1/R。按前面的符号约定,三个节点的局部贡献可以写成:
iaibid=0000G−G0−GGuaubud+Is−Is0这个矩阵仍然是奇异的。第一列全是 0,说明节点a的电压不会影响任何支路电流。物理上也很好理解:理想电流源会强制给出支路电流,电流源两端电压由外部网络决定;如果节点a没有再接到别的导纳、地或电压约束,仅靠这条“电流源 + 电阻”的局部支路,无法唯一确定ua。
这不是说“电流源串联电阻不能用”,而是说它需要放进完整网络里看。如果节点a还接着其他电阻、电感伴随导纳、电容伴随导纳或电压约束,那么全局矩阵可能仍然可解;但理想电流源本身不会像电阻那样给两端节点贡献一个稳定的2×2导纳块。
因此,很多工程模型不会只给一个理想电流源,而是给一个电流源并联一个导纳,或者在数值上并联一个很大的电阻。比如诺顿等效、Dommel 伴随模型里的“等效导纳 + 历史电流源”,都可以看成这种形式。
工程上常把电流源并联一个大电阻,也就是一个小导纳设并联导纳为G,电流源仍然从a指向b,则支路总电流为:
i=G(ua−ub)+Is节点贡献为:
ia=G(ua−ub)+Isib=G(ub−ua)−Is矩阵形式为:
[iaib]=[G−G−GG][uaub]+[Is−Is]这个式子其实就是前面 Dommel 形式的通用外壳:
i=Gequ+Ihis只不过这里把Ihis换成了一个显式已知的Is。从矩阵装配角度看,二者完全同型:G进入导纳矩阵,已知电流源进入当前步的已知项。
显式电压源
显式电压源比电流源麻烦,因为理想电压源给的是电压约束,而不是支路电流。先只看一个单独的理想电压源:
理想电压源规定两端电压,但不直接给出支路电流它告诉我们:
ua−ub=Us如果我们想像前面那样把支路整理成:
i=G(ua−ub)+Ihis会立刻卡住。理想电压源没有给出i和ua−ub之间的导纳关系。它只说电压必须等于Us,至于为了维持这个电压需要流过多少电流,要由外部电路决定。
所以单独一个理想电压源不能直接写成普通支路的 Dommel 形式。那就回到上一篇文章的 RLC 例子:理想电压源驱动一条 RLC 串联支路。RLC 离散以后可以写成:
i=Geq(ua−ub)+Ihis
理想电压源串联 RLC 支路(未接地)先不要急着接地。把 RLC 串联支路整体看成一个等效导纳Geq和历史项Ihis。假设电压源和 RLC 支路都接在节点a,b之间,电压源给出:
ua−ub=Us只看 RLC 这条支路本身,矩阵表达是:
[iaib]=[Geq−Geq−GeqGeq][uaub]+[Ihis−Ihis]这个式子看起来已经没有什么问题了:有导纳矩阵,也有已知源项,形式上非常像前面一直写的:
I=GV+Ihis再加上电压源约束:
ua−ub=Us看起来好像也说得通:RLC 支路电流由ua−ub决定,电压源又给出了ua−ub。
问题出在整个网络没有参考地。如果整个网络只有这两个节点,而且没有任何一个节点被选为参考地,那么它仍然缺一个绝对电位参考。**因为电压源只规定两个节点之间的差值,它没有规定ua和ub分别相对于哪里。**两个节点电压同时加上同一个常数,支路电压、电压源约束和所有支路电流都不变。
从矩阵上也能直接看出来。上面的矩阵本质上就是:
Y=[Geq−Geq−GeqGeq]这个矩阵的行列式为:
det(Y)=Geq2−Geq2=0所以它不能求逆。换句话说,存在一个“共同平移”的方向,矩阵乘上去以后什么也不变:
Y[11]=[00]这个式子不用想得太抽象。向量[11]T表示两个节点电压一起增加同一个量;矩阵乘出来是 0,意思就是这种共同增加不会改变任何支路电压差。于是解不唯一。例如:
ua=100,ub=0和:
ua=110,ub=10对只关心ua−ub的支路来说是同一个状态。这个时候,矩阵就会出现参考电位未定的问题。
所以,真正做节点电压法时必须选一个参考地。上一篇文章里为了把实战讲清楚,采用的就是最简单的情况:电压源一端接地,另一端接节点a。
此时:
ub=0电压源直接给出:
ua=Us这时节点a的电压就有了明确参考,前面那个“整体平移”的自由度被消掉了。
显式电压源的工程建模
那么,有没有办法可以让电压源也写成I=GV+Ihis模式?工程上有一种常见处理:把电压源串联一个很小的电阻Rs,把理想电压源变成带内阻的实际电压源。
工程上常把电压源串联一个小电阻,使支路能写成导纳形式若按图中方向把Us看成从a到b的电压源压降,则:
ua−ub=Us+Rsi于是:
i=Rs1(ua−ub)−RsUs令Gs=1/Rs,就得到:
i=Gs(ua−ub)−GsUs矩阵形式为:
[iaib]=[Gs−Gs−GsGs][uaub]+[−GsUsGsUs]这样它又回到了“导纳矩阵 + 已知源项”的形式。如果它再和 RLC 支路并联,总导纳就是:
Gtot=Geq+Gs对应矩阵可以写成:
[iaib]=[Gtot−Gtot−GtotGtot][uaub]+[Ihis−GsUs−Ihis+GsUs]但要注意,串联Rs解决的是“电压源支路能不能写成导纳形式”的问题,不解决“整个网络有没有参考地”的问题。如果整个网络仍然浮空,这个2×2矩阵依然行和为 0,仍然不可逆。接地是为了给节点电压选择参考零点,不能由Rs代替。
代价是Rs是人为加入的工程参数;取得太小,矩阵可能病态,取得太大,又会明显改变电路行为。
如果电压源浮接在两个非参考节点之间,又不想引入这个串联小电阻近似,就不能再强行把它当成普通导纳支路处理了。后面讨论受控电压源时,会再看到这种电压约束怎样把问题推向 MNA。
压控电流源 VCCS
有了显式电流源以后,再看压控电流源就很自然了。显式电流源的Is是当前步已知量;压控电流源只是把这个电流值换成了另一个节点电压差的线性函数。
受控源有输出端口,也有控制量来源设受控电流源输出端口接在节点a和节点b之间,输出电流方向从a指向b。它受节点c到节点d的电压控制:
i=gm(uc−ud)其中gm是跨导,单位是西门子。它表示控制端电压每变化1 V,输出端口电流变化多少安培。
这里要注意,gm不一定是节点c,d之间某个真实电阻的电导。节点c,d之间的电压uc−ud只是控制信号;gm是受控源模型自己给定的比例系数。只有当后面明确写出某条真实电阻支路,例如ix=Gx(uc−ud)时,那个Gx才表示c,d支路的电导。
对输出端口两个节点来说:
ia=i=gm(uc−ud)ib=−i=−gm(uc−ud)如果把节点顺序取为a,b,c,d,就可以写成:
iaibicid=00000000gm−gm00−gmgm00uaubucud这个矩阵容易让人误会,关键要分清“输出端口”和“控制端口”。
前两行说明的是输出端口:节点a,b的流出电流由控制电压uc−ud决定,所以ia,ib和uc,ud有关,而不是和ua,ub有关。这正是受控电流源和普通电阻的区别。普通电阻的支路电流由自己两端电压决定;VCCS 的输出电流由另一个电压差决定。
后两行写成 0,并不是说这个元件和uc,ud没有关系。它的意思是:理想控制端口只“读取”uc−ud,不从节点c,d吸收电流。换句话说,uc,ud是控制信号来源,ic,id不是由这只受控源注入的电流。
这个局部矩阵本身也确实是奇异的。它不能像一个完整电路那样单独拿来求逆,因为它没有给a,b端口提供导纳约束,也没有给c,d端口提供电流约束。节点电压法里的“元件矩阵”更准确地说是全局矩阵的一个装配贡献:程序把这些系数加到全局矩阵里,再和其他电阻、伴随导纳、接地约束、电压源约束一起求解。
所以,VCCS 仍然属于普通节点电压法能直接处理的形式。因为右边只含节点电压,没有出现新的未知电流;它的问题不是“不能装配”,而是“不能把这一只元件的局部矩阵当成完整可逆系统”。
如果控制端口和输出端口刚好是同一对节点,也就是c=a,d=b,那么 VCCS 退化成:
i=gm(ua−ub)这时它就像一个电导值为gm的普通支路:
[iaib]=[gm−gm−gmgm][uaub]所以 VCCS 并不神秘。只要控制量是节点电压差,它就能直接变成节点矩阵中的若干系数。
我们实战模拟一下。假设 VCCS 的输出端a,b之间并了一个电阻Ro,导纳为Go=1/Ro;控制端c,d之间接了一个显式电压源Us,同时并联一个电阻Rx,导纳为Gx=1/Rx。这时图上看起来有两个部分:左边是输出端口,右边是控制端口,中间只有控制关系,不是一根真实导线。
VCCS 的输出端和控制端可以属于两个浮空部分控制端电压源给出:
uc−ud=Us节点电流可以写成:
iaibicid=Go−Go00−GoGo00gm−gmGx−Gx−gmgm−GxGxuaubucud电压源约束可以写成:
[001−1]uaubucud=Us这组式子已经能看出受控关系:c,d的电压差会通过gm影响a,b端口电流;控制端并联的Rx也会给c,d两行贡献一个普通导纳块。但是如果整个网络只有这两块,仍然还没有唯一解。原因是:c,d之间的理想电压源和并联电阻都只关心uc−ud,没有规定uc,ud整体相对于哪里;a,b之间的电阻只规定由ua−ub产生的电流,也没有规定a,b整体相对于哪里。
所以如果a,b和c,d是两个互相没有导纳连接的浮空部分,最简单的处理就是各选一个参考点,例如:
ub=0,ud=0这时:
uc=Us若节点a没有外部注入电流,取ia=0,则:
Goua+gmUs=0因此:
ua=−GogmUs也就是说,受控源的“控制关系”会把c,d的电压差带到a,b的方程里,但它不等于一条普通导线,也不自动给每个浮空部分提供参考地。真正求解时,每个独立浮空网络都需要有参考点,或者接到一个已经有参考点的外部网络。
后面几类受控源也会遇到同样的问题。为了避免文章变得重复,后文主要讨论它们怎样进入矩阵;至于某个具体电路能不能唯一求解,仍然要回到全局网络里检查参考地、导纳路径和额外约束是否足够。
流控电流源 CCCS
流控电流源的输出电流由另一条支路电流控制。设输出端口仍然是a→b,输出电流为:
流控电流源用控制支路电流决定输出端口电流i=βix其中β是电流放大系数,ix是控制支路电流。
图中右侧的Rx支路只是用来测量或定义控制电流ix,左侧菱形电流源才是输出端口。CCCS 的意思就是:输出端口流出多少电流,不直接由输出端口电压ua−ub决定,而是由另一条支路里的电流ix决定。
这里要分两种情况。
如果控制电流ix本身可以由节点电压直接写出来,例如它是节点c到节点d之间一个电阻支路的电流:
ix=Gx(uc−ud)那么 CCCS 立刻变成:
i=βGx(uc−ud)这和 VCCS 完全同型,只是把gm换成βGx:
iaibicid=00000000βGx−βGx00−βGxβGx00uaubucud这时它仍然可以放进普通节点电压法。
但如果ix不是一个能直接由节点电压表达的量,例如它是某个理想电压源支路的电流,或者是某个需要额外未知量才能得到的内部电流,那么普通节点电压法就不够用了。程序必须把ix也作为额外未知量,或者从对应元件模型的内部状态里取出这个控制量。
所以 CCCS 能不能直接写进节点矩阵,关键不在“它是受控电流源”这几个字,而在控制电流ix是否已经能写成节点电压的线性组合。
压控电压源 VCVS
受控电压源就麻烦得多。设电压源接在节点a和节点b之间,输出电压受uc−ud控制:
压控电压源的输出端是电压约束,控制量来自另一个电压差ua−ub=μ(uc−ud)其中μ是电压放大倍数。
这个式子不是电流方程,而是电压约束。普通节点电压法习惯的是:
节点流出电流=节点电压的线性组合但理想电压源不直接告诉我们支路电流是多少。为了写 KCL,必须引入这个电压源支路电流作为额外未知量。设该电流为iE,方向从a到b。
于是对节点a,b有:
ia=iEib=−iE同时还要加上电压源约束:
ua−ub−μuc+μud=0把未知量顺序取为:
[uaubucudiE]T则这个 VCVS 对方程的贡献可以写成:
iaibicid0=000010000−10000−μ0000μ1−1000uaubucudiE最后一行不是 KCL,而是电压约束方程。也正是因为多了这一行、多了iE这个未知量,我们已经从普通节点电压法走向了改进节点电压法,也就是常说的 MNA,英文全称是 Modified Nodal Analysis。
这不是坏事。工程程序里处理理想电压源、受控电压源、理想变压器等元件时,本来就经常需要这种“节点电压 + 支路电流”的混合未知量。MNA 的完整组装和求解细节以后会单独讲;这里先不展开,只需要看清楚受控电压源为什么会把额外支路电流带进方程组。
流控电压源 CCVS
流控电压源的输出电压由另一个支路电流控制。设:
流控电压源的输出端是电压约束,控制量来自另一条支路电流ua−ub=rmix其中rm是转移电阻,单位是欧姆。
如果控制电流ix能够写成某个电阻支路的电流:
ix=Gx(uc−ud)那么约束方程可以写成:
ua−ub−rmGx(uc−ud)=0仍然引入输出电压源电流iH,方向从a到b。这里的iH不是外部给定的控制量,而是这个受控电压源输出端实际流过的支路电流。因为电压源本身只规定输出电压,不直接给出输出电流,所以求解器必须把这个电流也当成未知量一起求。
未知量顺序取为:
[uaubucudiH]T矩阵形式为:
iaibicid0=000010000−10000−rmGx0000rmGx1−1000uaubucudiH如果ix本身不能由节点电压直接表达,那么还需要把ix作为额外未知量。此时约束行更像:
ua−ub−rmix=0这说明 CCVS 比 VCVS 又多了一层依赖:不仅输出端是电压源约束,控制量也可能要求额外变量。
小结
这一篇的核心其实很简单:受控源能不能自然进入普通节点电压法,取决于它能不能写成“节点流出电流等于节点电压的线性组合”。
压控电流源最友好:
i=gm(uc−ud)它可以直接写进节点导纳矩阵,只是矩阵通常不再对称。
流控电流源要看控制电流能不能由节点电压表示。如果:
ix=Gx(uc−ud)那么它也可以化成类似 VCCS 的形式;否则就需要额外变量或内部状态。
受控电压源则不同。它给的是电压约束:
ua−ub=μ(uc−ud)这类元件通常必须引入电压源支路电流作为额外未知量,于是问题自然进入 MNA。普通节点电压法不是不能继续发展,而是未知量集合已经从“只有节点电压”扩展成了“节点电压 + 某些支路电流”。
所以,从程序实现角度看,受控源不是一个单独的魔法元件。受控电流源主要是在矩阵中增加跨行列系数;受控电压源主要是在方程组中增加约束行和额外电流未知量。把这一点看清楚,后面再理解 MNA 就会顺很多。