学习数值分析与电路分析后的练手程序,较粗糙。 没有 加入更多电器元件的数学模型,如二极管、三极管、放大器、数字器件等等。
m脚本在:gittee仓库;
编程实现电路仿真,使用Matlab 。
背景:
电网络分析课程中,学习了电路的矩阵形式,和数值求解方法;数值分析课程了解了数值计算的概念和一些数值算法思想。于是我想,如何编程实现电路的仿真呢?
搞清几个概念
总是理不清思路:编程计算电路?理论分析电路?怎么转换呢?有什么不一样吗?得到各参数变量与待求量之间的关系?得到不同电路参数下的解???
所以首先要明确模糊的概念,以便理清思路。
数值计算
利用计算机求解数学问题,称为数值计算。计算机可以大量、快速的运算,但是它是基于硬件结构的机械式计算,不同于人的计算(更高级、更灵活、更包容、更连续)。
需要考虑到计算机计算与编程的特点,设计恰当的数学模型、合适的数值计算方法和形式。
求解
求解即已知题目求解答案。有得到精确解析解的数值计算方法,也有迭代近似解的数值方法。计算只是个过程,重要的是,题目是什么,想要得到什么样的结果?
需要确定什么是已知的,什么是未知的。再理清求解思路:先分析,列出已知条件,然后计算出结果,再进一步得到更多结果,这才是完整的逻辑。这个逻辑是理论(课程)中学到的,这说明理论与求解是相辅相成的,理论上的分析虽然不需要数值计算,但没有算例验证理论,可信度也不高;同时,算例数据可以直观的反映出问题的特点,给分析带来参考,有助于得出结论。
仿真
计算机仿真:一般以时间为变量,将仿真过程分成极短的片段,求解出每一时刻的状态近似作为对应片段内的状态。从而近似得到整个过程中任意时刻的状态。
而求解得到的是一个问题的答案(一个电路状态信息),而仿真需要每个时间片段的答案(每个时刻电路的状态信息),这意味着“连续求解”一个“连续的题目”,需要将前一个问题的答案作为已知去求解当前问题。
一次仿真,得到的往往是大量的求解,仿真的结果应当是连续的(连续的时间序列)、大量的解的集合(按照时间序列依次求解的解序列)。
思路
清楚上面的概念后,我理清了思路:
- 理论分析电路,编写能求解“某时刻电路”的程序(单次求解);
- 加入相邻时刻间的变量更新,在时间序列的每个时刻求解,实现电路仿真(连续多次求解);
- 改变电路参数,得到相应结果,解析法验证(计算算例,通过理论计算验证)。
具体实行
这是最难的一部分:概念上,混淆了求解与仿真;思想上,纠结于解析法,而忽略数值方法;实现上,多方面知识结合。
描述瞬时电路
利用图论的概念描述电网络,形成网络线图(G图):
- 抽象出节点和支路
- 每一元件为一条支路
- 各支路标有方向箭头(自指定方向)
利用电网络理论的知识,可得到电路的关联矩阵 A \boldsymbol A A,用于描述电路的拓扑结构。
- A = { a i j } {\boldsymbol A} = \{a_{ij}\} A={ aij}
- a i j = 1 a_{ij} = 1 aij=1:支路 j 箭头指向节点 i
- a i j = − 1 a_{ij}=-1 aij=−1:支路 j 箭头背离节点 i
- a i j = 0 a_{ij}=0 aij=0:支路 j 不与节点 i 关联
若有N+1个节点,M条支路,a个电导(电阻),b个电压源(包括电容),c个电流源(包括电感),
并考虑到极短时间内各参数不变,有以下矩阵:
- U s {\boldsymbol U}_{\rm s} Us:支路源电压向量(已知)
- U s = [ u s 1 , u s 2 , ⋯ , u s M ] T {\boldsymbol U}_{\rm s} = [u_{\rm s1}, u_{\rm s2},\cdots,u_{\rm sM}]^{\rm T} Us=[us1,us2,⋯,usM]T
- u s k u_{ {\rm s}k} usk :第 k 条支路的电压源电压,符号以G图对应支路的参考方向为正;k = 1 ~ M
- 电容视为电压源,其值为初始电压
- 无电压源或电容则为0
- I s {\boldsymbol I}_{\rm s} Is:支路源电流向量(已知)
- I s = [ i s 1 , i s 2 , ⋯ , i s M ] T {\boldsymbol I}_{\rm s} = [{i_{\rm s1}}, i_{\rm s2},\cdots,i_{\rm sM}]^{\rm T} Is=[is1,is2,⋯,isM]T
- i s k i_{ {\rm s}k} isk:第 k 条支路的电流源电流,符号以G图对应支路的参考方向为正;k = 1 ~ M
- 电感视为电流源,其值为初始电流
- 无电流源或电感则为0
- Y \boldsymbol Y Y:支路电导矩阵(已知)
- Y = d i a g [ y 1 y 2 ⋯ y M ] {\boldsymbol Y} = {\rm diag}[y_1~y_2~\cdots~y_{\rm M}] Y=diag[y1 y2 ⋯ yM]
- y k y_k yk:第 k 条支路的电导;k = 1 ~ M
- 电阻转化为电导,无电导则为0
- 好像含受控源的电路的受控关系可以用电导矩阵表示出来(没研究)
- U \boldsymbol U U:支路电压向量(未知)
- U = [ u 1 , u 2 , ⋯ , u M ] T {\boldsymbol U} = [u_1, u_2, \cdots, u_{\rm M}]^{\rm T} U=[u1,u2,⋯,uM]T
- u k u_k uk:第 k 条支路的电压,符号以G图对应支路的参考方向为正;k = 1 ~ M
- I \boldsymbol I I:支路电流向量(未知)
- I = [ i 1 , i 2 , ⋯ , i M ] T {\boldsymbol I} = [i_1,i_2,\cdots,i_{\rm M}]^{\rm T} I=[i1,i2,⋯,iM]T
- i k i_k ik:第 k 条支路的电流,符号以G图对应支路的参考方向为正;k = 1 ~ M
- U n {\boldsymbol U}_{\rm n} Un:节点电压向量(未知)
- U n = [ u n 1 , u n 2 , ⋯ , u n N ]