开发备忘

电路图中所有的网络是被netlistManager统一管理的,在netlistManager中有一个list用于存放netlistNode,当电路图中有多少网络节点,就相当于有多少个netlistNode被存放进list中。

每一个netlistNode相当于是一个网络节点,其内部又有一个list,用于记录着连接到了这一网络节点上的所有“引脚”,也就是接入到这一网络节点上的所有freePin,icPin,线段等等。

当需要生成矩阵(A)和向量(b)时,生成工作由netlistManager进行,它首先根据自身拥有的netlistNode数量决定矩阵和向量的大小,然后开辟内存空间:例如有8个netlistNode、也就是有8个网络节点,那么netlistManager将会创建一个8×8的矩阵A、长度为8的向量b、长度为8的向量solution、长度为8的……若干用到的params。

但是这里不能直接使用遍历netlistNode、不能借助for(key=>value)中的key作为行列依据。原因后面会说明。先说一下需要的做法:在准备生成矩阵和向量之前,要先对当前所有的netlistNode进行一次“编号分配”,这个编号分配出来的并不是netlistNode部分的“名称编号”,而是一个矩阵操作编号。

有了这个矩阵操作编号之后,每一个netlistNode内部的createMatrix()方法,便可以根据自己刚刚被赋予的矩阵操作编号,知道自己计算出来的系数放在矩阵的哪一行、或者哪一列中。

当netlistNode含有一个孤立IC时,自己的分配编号就对应到了行、列上。

当netlistNode含有电源或IC时,无论是基于电源的电压方程、还是基于IC的KCL方程,都可以生成出一个方程,这个方程的系数就是矩阵的行系数。

因为行是netlistNode自己已经知道的(分配编号),所以系数放在哪一行是明确的。

但是这个系数方程是通过各个电源或IC桥接其他网络计算出来的,而其他网络计算出来的结果就是系数中的列属性,这个时候就要知道所有的“桥”的另外一侧的网络是哪个列上的,因而回到最初的问题:要在createMatrix之前,先为所有的网络分配编号。

以前上学的时候觉得所有的知识都挺容易理解的,现在也许是年龄大了,即便是对已经已经熟练掌握了的知识,再看的时候,都会感觉是“一头雾水”,唯有继续艰难的、一点点的重新理解,才能让自己感觉有所收获。

Related Posts

使用SageMath对线性方程组求解备忘

如下图所示,完成对线性方程组求解: 与上述线性方程组相呼应的电路结构如下所示: 这里实际上,按道理是不应该能够解出上面的线性方程组的,原因是其中的矩阵是一个奇异矩阵。但是SageMath依然能够完成这个线性方程组的求解,是什么原因呢?也许是SageMath在面对这样的问题时,会给出一个特解来么?

C++代码备忘:数组旋转

临时备忘