首页 > 解决方案 > 计算和校正仪器中的时钟漂移

问题描述

我正在尝试实施我最近在 Math SE 上提出的这个问题的解决方案。我将在这里重新创建相关细节。

我有一个由以下形式的方程组成的系统:

在此处输入图像描述

这里, c, a_ir, 和向量p_r是已知的。向量x0v以及ti's 是未知的。此外,TR是已知的,但会有所不同(即不能硬编码)。

我最熟悉此类系统的符号操作和解决方案,以及SymPy包,所以我从那里开始。不幸的是,事实证明,也许并不奇怪SymPy的求解器并不适合这样的问题。由于所讨论的知识将来自真实世界的实验数据,因此可能只能以数值方式获得解决方案,并且SymPy仅提供一个数值求解器 ,nsolve()它很快就被阻塞了。

我想将我所做的转换SymPy为与 兼容的东西SciPy,它提供了更大的灵活性以及许多线性和非线性求解器。不幸的是,我对 不是很熟悉,我SciPy也不清楚我在其中的非常具有象征意义的表达方式如何SymPy翻译成SciPy


到目前为止,这是我所拥有的(诚然,这是一个相当粗糙的初稿):

T = 10; R = 3

x,y,z, vx,vy,vz = sp.symbols('x,y,z, vx,vy,vz', real=True)
collection = sp.symbols(" ".join(f"t{x}" for x in range(T)), real=True)
 
@dataclass
class Vertexer:
 
    receivers: list
 
    def find(self, data):
        eqs = []
 
        for r in range(R):
            for i in range(T):
                eqs.append(sp.Eq(c**2 * (data[r][i] - collection[i])**2, (vx**2 + vy**2 + vz**2) * (collection[i] - collection[0])**2 + 2 * (collection[i] - collection[0]) * (vx * (x - self.receivers[r][0]) + vy * (y - self.receivers[r][1]) + vz * (z - self.receivers[r][2])) + ((x - self.receivers[r][0])**2 + (y - self.receivers[r][1])**2 + (z - self.receivers[r][2])**2)))
                print(sp.nsolve(eqs, (x,y,z,vx,vy,vz) + collection))

这里,data是一个list包含R大小的列表T,其中又包含air'S. 最终,T将由R这个矩阵的大小决定,而不是像这里那样硬编码。receivers是一个包含列表的列表,这些列表表示's(例如)R的向量分量。pr[[p1x, p1y, p1z], [p2x, ...

我不确定从哪里开始将其转换为SciPy. 一方面,t_1, t_2,.... t_T除了许多其他未知数(vxvyx等)之外,我在这里“动态地”为未知数生成符号。我不确定如何用潜在的大量动态符号未知数来翻译这个符号表达式。

如果我可以简单地将表达式重写为与求解器兼容的东西,那么SciPy继续求解它应该是相当微不足道的。

如何解决这个问题?

标签: pythonmathscipysympy

解决方案


推荐阅读