我有一个 3D 晶格,其单元格(即最小重复单元)为 16 个点。由于它是 3D 晶格,因此它在所有 3 个维度(x、y、z)上都是周期性的。详细来说,晶胞如下所示:
3 个晶格向量 a1、a2、a3 是
bulk_vecs = [[14.56578026795, 0.0, 0.0 ], # a1
[0.0, 8.919682340494, 0.0 ], # a2
[7.282890133975, 2.973227446831, 4.20477857933]] # a3
这16个点的笛卡尔坐标为
bulk_coords = [[ 0.00000000, 0.00000000, 0.00000000],
[ 10.9243352, 6.34420137, 2.66488775],
[ 18.2072253, 6.34420137, 2.66488775],
[ 12.7450577, 3.17210068, 1.33244387],
[ 10.6807662, 8.91968234, 0.42187384],
[ 16.1429338, 3.37097392, 1.19181926],
[ 19.7843789, 9.31742882, 3.29420855],
[ 9.34718165, 2.97322745, 1.47306849],
[ 14.8093492, 6.34420137, 2.24301390],
[ 9.10361267, 9.11855558, 3.43483316],
[ 3.88501404, 0.39774648, 0.14062462],
[ 7.03932116, 5.94645489, 2.52426313],
[ 12.9886267, 8.91968234, 3.57545778],
[ 7.28289013, 0.00000000, 0.00000000],
[ 5.46216760, 3.17210068, 1.33244387],
[ 16.3865028, 9.11855558, 3.43483316]]
现在我有一个参考 2D 晶格,其中包含 32 个晶胞点。请注意,这里的“2D”意味着它仅在 x 和 y 维度上是周期性的,但在 z 方向上仍然可以具有厚度。它的晶胞看起来像这样(这只是一个简单的例子,晶胞可以是任何形状,不一定是立方体):
3 个晶格向量由下式给出
ref_vecs = [[8.1968234, 0., 0. ], # x-direction (periodic)
[0., 13.38535656, 0. ], # y-direction (periodic)
[0., 0., 7.7280392142]] # z-thickness (non-periodic)
这32个点的笛卡尔坐标为
ref_coords = [[ 5.65852755, 9.84826406, 0.10024035],
[ 5.66769587, 3.14583318, 0.03049278],
[ 5.84383908, 6.16622816, 0.33687635],
[ 3.06154746, 11.5036515, 0.89497370],
[ 3.04533245, 4.74684988, 0.80482405],
[ 2.81714593, 7.85388222, 0.95654678],
[ 3.09409158, 1.66514480, 1.21902173],
[-0.03484920, 9.98872688, 1.91238251],
[ 0.07586672, 6.55689489, 2.02252838],
[ 0.15624468, 13.1218508, 2.07583316],
[ 0.30441248, 2.82022739, 2.21046382],
[ 5.46226670, 11.2187312, 2.95396399],
[ 5.83993074, 5.03326172, 3.11251461],
[ 5.40963696, 8.13117939, 3.23409626],
[ 5.45612978, 1.47718658, 3.32634157],
[ 2.72591886, 6.68506441, 3.86756751],
[ 2.91602855, 3.06649570, 3.90688764],
[ 2.95946887, 9.79329729, 3.96116732],
[ 3.11916042, 12.9792231, 4.17677610],
[ 0.35863087, 4.72533071, 4.75876360],
[ 0.31594175, 11.4937246, 4.67355664],
[ 0.03089551, 1.37091216, 4.91348486],
[ 0.39020723, 8.35223658, 5.11836201],
[ 5.45925351, 3.34155067, 5.87036690],
[ 5.62981527, 13.2212649, 5.93479016],
[ 5.64259931, 6.46196620, 5.93435713],
[ 5.83825398, 9.54653517, 6.08472919],
[ 2.80592452, 4.61964086, 6.76956275],
[ 3.15087591, 11.6754589, 6.98585963],
[ 2.68542186, 1.40293444, 7.10791606],
[ 2.73378423, 8.13529985, 7.12898617],
[ 0.03114729, -0.01057378, 7.78083813]]
此参考 2D 晶格表示类似于从 3D 晶格中提取的“厚层”,其 x 和 y 方向上的 2 个晶格向量是 parallel to a1 和 a2(即平行于 xy 平面)。现在我想在当前 3D 晶格内找到与该参考 2D 晶格最匹配的并行 2D 晶格。相似性应取决于两个二维晶格晶胞的“拓扑”。例如,参考晶胞可以被认为是对最佳匹配的二维晶格晶胞的分数坐标和晶格参数应用小扰动。下面是从 3D 晶格提取 2D 晶格的图示: 在 3D 晶格空间中搜索所有可能的并行 2D 晶格单元的空间是很困难的,特别是考虑到我可能需要扩展 3D 晶格单元以在整个空间中搜索(但我应该扩展多少?) 。我想知道是否有任何算法可以在整个3D点阵空间中相对较快地找到最佳拓扑匹配的2D点阵晶胞? 具体来说,我想获得最佳匹配的2D点阵向量和32个笛卡尔坐标晶格晶胞。欢迎任何建议甚至想法。
为了评估每个候选解决方案的适合度,您可以计算参考 2D 晶格和候选 2D 晶格之间的相似性度量。正如您提到的,这可能基于两个晶格的拓扑结构,以及其他因素,例如晶格点之间的距离和晶格向量之间的角度。
要实现此方法,您需要定义一个适应度函数,该函数将候选 2D 晶格作为输入,并根据其与参考 2D 晶格的相似性返回适应度分数。然后,您将使用搜索算法迭代生成和评估候选解决方案,直到找到满意的解决方案。
我希望这个建议可以帮助您开始在 3D 晶格空间中寻找最匹配的 2D 晶格单元。如果您还有任何其他问题或疑虑,请告诉我。