我在二维方格上测量了点。
。
如何将数据拟合到方格中?我想曲线拟合或最小二乘近似等一些方法会起作用,但我找不到任何针对同一问题的文献。
x0
和y0
)、旋转(θ
)、晶格间距(d
),并且不能表示为y=f(x; a,b,...)
形式。TLDR;不可能(没有细格子的惩罚)
所以我有同样的问题,我研究了为什么这是不可能的。我证明,对于每个
n
有理点,x1, ... , xn
都存在一些有理 q, b
,这样对于每个 i
都存在一个整数 z
,使得 xi = z * q + b
。
我们从
n=2
开始,为此,选择 q = x1 - x0
和 b = x0
让存在
x1, ..., xn+1
有理点。那么对于第一个 n
点,存在一些有理数 q, b
,使得对于每个 i<=n
都存在一个整数 z
,使得 xi = z * q + b
从假设中获取
q, b
。我们找到一个自然数 beta,使得 q' := q / s, b
满足 i<=n+1
的假设。
确实,对于每个自然数和
i<=n
,当 xi = z * q + b
时,也 xi = z * s * q' + b
现在我们必须选择一个自然的
s
,使得 x := xn+1 = z * q' + b
代表整数 z
。
我会推导出
s
,这也将证明这样的s
存在。定义 beta
到 x = beta * q + b
。因为除了 beta
之外的每个数字都是有理数,所以 beta
也是有理数:
beta = u / v
定义
s := v
那么它成立:
x = beta * q + b = u / v * q + b = u / v * s * q' + b = u * q' + b
其中 u
是整数。
使用证明中的公式,我制作了一个Python程序,可以为任意分数找到完美的格子:
from fractions import Fraction
import random
def random_fract():
return Fraction(
random.randint(2, 1_000),
random.randint(2, 100)
)
def test_one_lattice():
x_vals = [random_fract() for i in range(1_000)]
# remove duplicates -- the algorithm doesn't work for them
x_vals = list(set(x_vals))
q = x_vals[1] - x_vals[0]
b = x_vals[0]
for fract in x_vals[2:]:
q /= ((fract-b) / q).denominator
for x in x_vals:
z = (x - b) / q
assert z * q + b == x
assert z % 1 == 0
if __name__ == "__main__":
for _ in range(50):
test_one_lattice()
请记住,这也适用于空间的多个维度(它们是独立的)以及晶格的多个维度(只需将其他向量设置为零)