好困、好累、好烦躁!
十分的烦躁!一晚上都在想办法拯救该死的网络环境! 晚上9点时,完成了新增线段时的端点新增的正确逻辑,以前的增加逻辑不好,现在的增加方式是正确的。然后顺带着进行了删除线段逻辑的改变。本来想着删除线段的逻辑改成正确的之后,自然而然地、水到渠成的可以完成“删除”功能。 但是服务器崩溃了,然后我就折腾了整整一个晚上,现在已经是凌晨5点——折腾了6个小时!浪费时间! Update: 2024.12.31,接下来是两个阶段的目标设定: 目标1:完成对当前代码中的四类代码review code优化调整; 目标2:完成电流计算;
矩阵求解问题备忘(2)
经过2天的完善,已经将MathMatrix类封装的比较适合阅读。其中可能还存在着大量的需要优化的地方,不过这些并不重要,即便不进行优化,也是可以正常运行的。 优化意味着能够让程序更快的运行,尤其是: 1、本身就是一个无需分块的矩阵,当前的做法是:依然会进行分块。这样做的好处是令程序的逻辑完全统一,坏处自然就是内存资源的浪费和CPU算力的浪费; 2、对于巨大的矩阵,分块、判断奇异性等都将是耗时的,需要更高级的方法去进行这些操作才好; 还有几个问题: 1、现在矩阵分块之后的子块是否完全正确? 2、奇异性判断里面用到的小数,是否合理? 3、当遇到奇异矩阵之后,会尝试一次“解奇异”,这个操作还没有实现,因而还无法真正完成电路求解计算。 Update 2024.12.23 今天又对 MathMatrixClass 进行了一遍重构,上面提到的若干问题并没有解决。今天重构的目的是:在外部构建出矩阵之后,传递进入 MathMatrixClass 之后,便都是以指针形式存储的,而进入 MathMatrixClass 之后又会被分解成多个小问题,依然是以指针传递。 这样在任何一个小问题内,方程得到解答的时候,只需要小问题内部自己对自身的变量进行更新,外部就可以得到更新了——因为内外用到的是一个相同的内存空间。 对于今天的这个重构,也还留有一些“尾巴”没有完成: 1、对于 递归 调用那里,我还是额外的创建了临时变量,这个地方其实也无需额外创建临时变量。 2、另外就是对于LU求解完成之后的结果写回,现在是在一个方法中;还有一个大问题分解后的小问题调用,也是在一个方法中。这两个地方其实应该写的啰嗦一些,分成两个方法依次调用,才能令程序的可读性更好一些。
矩阵问题备忘
今天把矩阵求解的相关代码抽取、封装到了独立的类中,并且基于昨天的求解算法已经基本实现了一个粗糙的矩阵求解过程。 接下来考虑的是对这个矩阵求解类进行扩充、完善,完成以下若干功能: 1、能够对已经给定的问题(矩阵)进行分块:如果能够实现分块操作,就相当于将图中不同的整体彼此分隔开了; 2、完成矩阵分割之后,相当于是一个大的线性方程组被重新切分成了多个小的线性方程组,这若干个线性方程组彼此之间没有任何关联,即便其中任何方程组是有问题的,也不会影响其他方程组的求解过程; 3、分割出来的若干小问题(小矩阵、小线性方程组),依次遍历,分别对每一个问题进行判断,检查矩阵是否是奇异矩阵。如果是奇异矩阵,就进入单元求解过程(寻找此网络中的地); 4、如果找到一个地,就将已知解带回矩阵,再次判断是否是奇异矩阵,循环这一过程; 5、直到:矩阵不再是奇异矩阵,就可以对这个小问题求解;如果最终判定为奇异矩阵,这个小问题就出现奇异网络、抛弃; 6、依次完成上述每一个小问题的求解,最终将每一个小问题的解,拼接会原始大矩阵中,最终得到整个当前网络的解。 以上问题中比较棘手的,是如何对一个矩阵进行分块。
C++ 中的 size_t 引发的一个小问题
代码在后面,因为 size_t 是无符号型的,所以在 for 循环中如果疏忽了它的这个符号问题,就会产生比较严重的后果。现在用了一个“临时解决方案”,但是感觉还是不稳妥,暂且记录、稍后再慢慢推敲。
开发备忘
电路图中所有的网络是被netlistManager统一管理的,在netlistManager中有一个list用于存放netlistNode,当电路图中有多少网络节点,就相当于有多少个netlistNode被存放进list中。 注:上面只是临时写的“list”,至于具体使用的容器应该是list还是vector,还有待进一步推敲。(2024.12.24) 每一个netlistNode相当于是一个网络节点,其内部又有一个list,用于记录着连接到了这一网络节点上的所有“引脚”,也就是接入到这一网络节点上的所有freePin,icPin,线段等等。 当需要生成矩阵(A)和向量(b)时,生成工作由netlistManager进行,它首先根据自身拥有的netlistNode数量决定矩阵和向量的大小,然后开辟内存空间:例如有8个netlistNode、也就是有8个网络节点,那么netlistManager将会创建一个8×8的矩阵A、长度为8的向量b、长度为8的向量solution、长度为8的……若干用到的params。 注:上面这里后面提及的若干个向量,感觉应该封装一下,以更方便使用;2024.12.24 注:上面提到的netlistManager创建的矩阵A,现在总是隐约感觉应该用指针,每一行具体的内容应该由各个netlistNode内部持有;2024.12.24 但是这里不能直接使用遍历netlistNode、不能借助for(key=>value)中的key作为行列依据。原因后面会说明。先说一下需要的做法:在准备生成矩阵和向量之前,要先对当前所有的netlistNode进行一次“编号分配”,这个编号分配出来的并不是netlistNode部分的“名称编号”,而是一个矩阵操作编号。 有了这个矩阵操作编号之后,每一个netlistNode内部的createMatrix()方法,便可以根据自己刚刚被赋予的矩阵操作编号,知道自己计算出来的系数放在矩阵的哪一行、或者哪一列中。 当netlistNode含有一个孤立IC时,自己的分配编号就对应到了行、列上。 当netlistNode含有电源或IC时,无论是基于电源的电压方程、还是基于IC的KCL方程,都可以生成出一个方程,这个方程的系数就是矩阵的行系数。 因为行是netlistNode自己已经知道的(分配编号),所以系数放在哪一行是明确的。 但是这个系数方程是通过各个电源或IC桥接其他网络计算出来的,而其他网络计算出来的结果就是系数中的列属性,这个时候就要知道所有的“桥”的另外一侧的网络是哪个列上的,因而回到最初的问题:要在createMatrix之前,先为所有的网络分配编号。
使用SageMath对线性方程组求解备忘
如下图所示,完成对线性方程组求解: 与上述线性方程组相呼应的电路结构如下所示: 这里实际上,按道理是不应该能够解出上面的线性方程组的,原因是其中的矩阵是一个奇异矩阵。但是SageMath依然能够完成这个线性方程组的求解,是什么原因呢?也许是SageMath在面对这样的问题时,会给出一个特解来么?
最近需要整理的blog文章备忘
1、 前几天看书,提到了牛顿二次展开式,当时以为是记下了。但时隔几天又遇到了这个展开式,只能记得它的存在、却想不起来具体的展开式,于是自己动手推导了一遍。“好记性不如烂笔头”这句话还真不是随便说的,自己推导过一遍之后感觉记忆的明显牢靠了。 有趣的是其中除了二项式展开之外,它的展开项系数恰巧是杨辉三角形,而杨辉三角形中的每一行的数列规律,又是可以通过“排列、组合”方面的知识进行计算的。 因为排列、组合的基础也已经忘得差不多了,所以这里面又有一个点是临时记忆,并没有动笔推敲。所以我想还是可以一路追下去、温故夯实一下,也顺便再动动笔吧。 2、 闲书最近也在看,主要是在看天文方面的,刚刚开始翻阅,一上来就是积分,很开心,原因是能够基本读懂书上的公式了。阅读到的主要是奥尔伯斯佯谬,我觉得既然也是和积分相关的话题,所以有时间的话,也可以整理出来,当作blog记录下来。 但是我现在感觉这个谬论得出的结论:宇宙的年龄并非无限、而是有限的。这一点上我还是无法理解。或者说,我的困惑是:如果宇宙的年龄已经是无限的了,就的不出当前的奥尔伯斯结论来了吗?如果宇宙的年龄已经无限,似乎也可以解释出天空是黑色的结论。 不过自己既然是初学,所以还是先将整本书通读下来,并把其中的困惑记录下来,等到二刷的时候,再一点点慢慢推敲、理解吧。
切菜板上了我的电脑桌
其实我的桌子并不能说是“电脑桌”,这是一张非常老旧的桌子,表面凹凸不平。这种凹凸不平的桌面平日总会让我觉得烦恼——键盘放在上面无法平稳,总是会在打字的时候感到键盘的晃动。 我总会用一些草稿纸垫在键盘下面,这样能够让键盘更加平稳一些,打字的时候才会有良好的手感。但是用纸垫着,也有弊端——总会将桌子搞得很乱、用不了多久就要重新整理一下桌面。 所以长久以来,我一直期望能够更换一张桌子、或者至少买一块垫板放在桌面上。 在宜家,看到过一款不错的垫板,皮革材质、足够大、足够重、手感也非常好。但是它太贵了,好像要三百多元吧。每次看到,我都动心想买,但每次都是纠结一阵,放弃。 直到今天收拾屋子的时候,找出来一块切菜板,是家里厨房中淘汰下来的。老婆平日很爱干净,切菜板、锅碗瓢盆经常会被淘汰下来,这些被老婆淘汰下来的各类物品,我都不舍得扔,所以就都从家中拿到了自己的工作室存放。 除非工作室中实在放不下、没有用途的东西,我才会丢弃。 这块切菜板我也是早早就拿到了工作室,尘封在一个角落中。今天找出来之后看到它的表面非常平整,猛然想到不如就用它当我的桌面垫板吧? 但是它曾经是在厨房使用,表面多少有一些油污,所以花了一些时间进行清理。清理干净之后发现它其实还是非常新,而且无论是大小还是重量,都非常适合放在桌面上。 此时此刻,我的键盘放在这块切菜板上,再没有了任何的摇晃,打起字来十分平稳,每一次敲击键盘都有着良好的手感和反馈感。真是不错!