我开发了一个科学应用程序(模拟在细胞核中移动的染色体)。染色体被分成小片段,这些片段使用 4x4 旋转矩阵围绕随机轴旋转。
问题是模拟执行了数千亿次旋转,因此浮点舍入误差会累积并呈指数增长,因此随着时间的流逝,片段往往会“飘走”并与染色体的其余部分分离。
我在 C++ 中使用双精度。该软件目前在 CPU 上运行,但将移植到 CUDA,并且模拟最多可以持续 1 个月。
我不知道如何以某种方式重新规范化染色体,因为所有片段都链接在一起(您可以将其视为双向链表),但如果可能的话,我认为这将是最好的主意。
你有什么建议吗 ?我觉得有点失落。
非常感谢你,
H。
编辑:添加了简化的示例代码。您可以假设所有矩阵数学都是经典实现。
// Rotate 1000000 times
for (int i = 0; i < 1000000; ++i)
{
// Pick a random section start
int istart = rand() % chromosome->length;
// Pick the end 20 segments further (cyclic)
int iend = (istart + 20) % chromosome->length;
// Build rotation axis
Vector4 axis = chromosome->segments[istart].position - chromosome->segments[iend].position;
axis.normalize();
// Build rotation matrix and translation vector
Matrix4 rotm(axis, rand() / float(RAND_MAX));
Vector4 oldpos = chromosome->segments[istart].position;
// Rotate each segment between istart and iend using rotm
for (int j = (istart + 1) % chromosome->length; j != iend; ++j, j %= chromosome->length)
{
chromosome->segments[j].position -= oldpos;
chromosome->segments[j].position.transform(rotm);
chromosome->segments[j].position += oldpos;
}
}