我正在尝试为Python编写Wilson的谱密度分解算法[1]的实现。该算法迭代地将[QxQ]矩阵函数分解为其平方根(它是用于谱密度矩阵的Newton-Raphson平方根查找器的扩展)。
问题是我的实现仅收敛于大小为45x45或更小的矩阵。因此,在20次迭代之后,矩阵之间的总平方差约为2.45e-13。但是,如果我输入大小为46x46的输入,则直到第100次迭代才会收敛。对于47x47或更大,矩阵永远不会收敛;大约100次迭代时,误差在100到1000之间波动,然后开始快速增长。
你会如何尝试调试这样的东西?似乎没有任何特定的点,它变得疯狂,并且矩阵太大,我实际上不能手动进行计算。有没有人有寻找奇怪的数字错误的提示/教程/启发式?
我以前从未处理过这样的事情,但我希望你们中的一些人......
谢谢, - 丹
[1] G. T. Wilson。 “基质谱密度的因式分解”。 SIAM J. Appl。数学(Vol 23,No。4,1972年12月)
答案 0 :(得分:4)
我建议在scipy-user邮件列表中提出这个问题,也许会提供一些代码示例。一般来说,名单上的人似乎对数值计算非常有经验,并且非常有帮助,只是在列表之后就是教育本身。
否则,我恐怕我没有任何想法...如果你认为它是一个数值精度/浮点舍入问题,你可以尝试的第一件事就是将所有dtypes压缩到{{1}并看看是否有任何区别。
答案 1 :(得分:2)
Interval arithmetic可以提供帮助,但我不确定性能是否足以真正允许您感兴趣的矩阵大小的有意义的调试(您必须计算几个数量级的减速,什么替换高硬件帮助“标量”浮点运算与SW重“间隔”运算之间的关系,并添加检查哪些区间变得过宽,何时,何地和为什么)。