矩阵问题备忘

今天把矩阵求解的相关代码抽取、封装到了独立的类中,并且基于昨天的求解算法已经基本实现了一个粗糙的矩阵求解过程。

接下来考虑的是对这个矩阵求解类进行扩充、完善,完成以下若干功能:

1、能够对已经给定的问题(矩阵)进行分块:如果能够实现分块操作,就相当于将图中不同的整体彼此分隔开了;

2、完成矩阵分割之后,相当于是一个大的线性方程组被重新切分成了多个小的线性方程组,这若干个线性方程组彼此之间没有任何关联,即便其中任何方程组是有问题的,也不会影响其他方程组的求解过程;

3、分割出来的若干小问题(小矩阵、小线性方程组),依次遍历,分别对每一个问题进行判断,检查矩阵是否是奇异矩阵。如果是奇异矩阵,就进入单元求解过程(寻找此网络中的地);

4、如果找到一个地,就将已知解带回矩阵,再次判断是否是奇异矩阵,循环这一过程;

5、直到:矩阵不再是奇异矩阵,就可以对这个小问题求解;如果最终判定为奇异矩阵,这个小问题就出现奇异网络、抛弃;

6、依次完成上述每一个小问题的求解,最终将每一个小问题的解,拼接会原始大矩阵中,最终得到整个当前网络的解。

以上问题中比较棘手的,是如何对一个矩阵进行分块。

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

Related Posts

好困、好累、好烦躁!

十分的烦躁!一晚上都在想办法拯救该死的网络环境! 晚上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求解完成之后的结果写回,现在是在一个方法中;还有一个大问题分解后的小问题调用,也是在一个方法中。这两个地方其实应该写的啰嗦一些,分成两个方法依次调用,才能令程序的可读性更好一些。