上星期接到任务要研究一个晶体的xrd,由于任务目标有少许改变,我便乐呵呵地用一个我之前准备好但没用上的自制模块来工作。
啊,上面说得粗略了点,我再解释一下。目前的情况是已有方法A和方法B,A方法和B方法均可计算出晶体的xrd,并且已经通过了实践的检验。已有方法的限制是:对于B方法,现在我已经写好的代码只能处理单斜晶系,即有晶胞两个夹角是90度,但目前的任务要扩展到三斜晶系(即所有夹角都不是90度);对于A方法,它的输入参数被我设为是自动生成的,如果要改成手动指定的需要在A方法内部大改,但目前任务需要手动指定输入参数。
而在我写上述模块之前,就已经写好了能处理三斜晶系的升级版B方法的核心函数,但是由于后来改用方法A而没用上。于是我(闲得蛋碎)决定补完升级版B方法来处理最新的这个任务。
由于已有的B方法是被我(一时脑子进水)用matlab写的,由于我对matlab不大熟(虽然python也不算熟),考虑到长期使用,还是应该移到python上。痛苦地debug很久终于解决了matlab和python的fsolve函数不严格对应的这个恶心问题后,B方法终于移植过来了!(哎,半路出家都是泪。)我愉快地按下回车准备收割成果。
然而测试结果却是跟已有的AB方法的结果都对不上!我大跌眼镜,把代码检查了一遍又一遍,对了半天公式,又手动设置若干个简单的测试晶胞来手动验算,都没查出来。首先怀疑是代码写错了,又怀疑是方法错了,又怀疑是公式错了,甚至还怀疑是A方法错了。由于升级版B方法的核心要用到一个数值看起来没有意义的矩阵S,验算起来非常麻烦。
星期五弄了一下午加晚上,算得头晕眼花的,都没检查出来到底是怎么回事。星期六日一想到这事就头大,迟迟不想动手。直到现在,星期日晚上11点,我才受不了没做完工作的压力,打开了电脑,连到办公室那边继续工作。其实只要我改写A方法,也能解决现在的任务,但是一个“明明不会出问题的方案竟然出问题了”这一事实让我很不爽,我还是忍不住继续研究是哪里错了。为了不像盲头苍蝇那样浪费时间,我想好可能的假设,以及对应的检验方法,以免瞎搞。
又用各种方法debug了一个多小时,我终于找到了产生bug的地方——升级版B方法里的矩阵元被我手误写反了,S13和S23对换就行了。
这时知道真相的我只能是一副生无可恋脸……