基于维基百科方程的java多点化实现

     2022-05-31     330

关键词:

我正在尝试在java中编写一个多点定位算法来测试我正在处理的项目,但是我遇到了一些问题。我按照维基百科页面here(eqn 7)上的算法,但是当我尝试它时,我得到了错误的答案。

这是我正在尝试的数据

double[] truth = new double[] {1, 4, 8};
double[][] sensorLocations = new double[][] {
        {0, 0, 0},
        {1, 15, 8},
        {13, 4, 8},
        {1, 4, 20}          
};
double[] timeDelays = new double[] {9, 11, 
            12, 12 };

注意时间延迟我假设v = 1,为了简单起见,我想出答案。因为我做了这个,我做了一些时间延迟,并确定传感器知道延迟(因为v = 1)与距离相同(sqrt(deltax ^ 2 + deltay ^ 2 + deltaz ^ 2))

但是,当我通过算法运行时,得到x = 0.1064,y = 4.2419,z = 8.5968。我知道这不是一个解决方案,因为距离点的距离与时间不匹配。

这是我在java中的算法(我假设最接近/最小的时间是第一次在算法的第一次切割中为了简单起见)

public double[] CalculatePosition(double[][] sensors, double[] timeDelays)
{
    double[] position = new double[3];

    //calculate the planes...
    double v = 1;
    double vt1 = v*timeDelays[0];

    double[] a = new double[timeDelays.length - 1];
    double[] b = new double[timeDelays.length - 1];
    double[] c = new double[timeDelays.length - 1];
    double[] d = new double[timeDelays.length - 1];
    for(int m = 1; m < timeDelays.length; m++)
    {
        double vtm = v*timeDelays[m];
        a[m-1] = 2*sensors[m][0]/vtm - 2*sensors[0][0]/vt1;
        b[m-1] = 2*sensors[m][1]/vtm - 2*sensors[0][1]/vt1;
        c[m-1] = 2*sensors[m][2]/vtm - 2*sensors[0][2]/vt1;
        d[m-1] = vtm - vt1 - 
                (sensors[m][0] * sensors[m][0] + sensors[m][1] * sensors[m][1] + 
                        sensors[m][2] * sensors[m][2])/vtm + 
                (sensors[0][0] * sensors[0][0] + sensors[0][1] * sensors[0][1] + 
                        sensors[0][2] * sensors[0][2])/vt1; 
        //negate d to make it in the right form for Gaussian elimination
        //i.e. from Ax + By + cZ + D = 0 to Ax + By + cZ = D
        d[m-1] = -d[m-1];
    }

    //Calculate where they intersect best
    //Gaussian elimination for now...
    //make the 2 and 3 a 0
    double mult2 = -a[1] / a[0];
    a[1] += mult2 * a[0];
    b[1] += mult2 * b[0];
    c[1] += mult2 * c[0];
    d[1] += mult2 * d[0];

    double mult3 = -a[2] / a[0];
    a[2] += mult3 * a[0];
    b[2] += mult3 * b[0];
    c[2] += mult3 * c[0];
    d[2] += mult3 * d[0];

    mult3 = -b[2] / b[1];
    a[2] += mult3 * a[1];
    b[2] += mult3 * b[1];
    c[2] += mult3 * c[1];
    d[2] += mult3 * d[1];

    //now use substitution to get the answer!
    position[2] = d[2] / c[2];
    position[1] = (d[1] - position[2] * c[1]) / b[1];
    position[0] = (d[0] - position[1] * b[0] - position[2] * c[0]) / b[0];


    return position;
}

任何人都可以帮我找到算法实现的问题,我用来测试它的数据,或者我做的任何假设?谢谢!

答案

以下任何具体原因:

double[] a = new double[timeDelays.length - 1];
double[] b = new double[timeDelays.length - 1];
double[] c = new double[timeDelays.length - 1];
double[] d = new double[timeDelays.length - 1];

因为下面你正在访问第三个元素,当timeDelays的长度是3时,这会溢出。

macos实现词典正常查询维基百科

...载proxifier代理工具设置应用走专门的代理,从而实现维基百科正常查询。二、下载proxifier,网址:https://www.proxifier.com/,可以免费使用一个月,但这里提供了一个网友给的注册码:P427L-9Y552-5433E-8DSR3-58Z68ÿ... 查看详情

java示例代码_使用jsoup提取维基百科文章中的特定链接

java示例代码_使用jsoup提取维基百科文章中的特定链接 查看详情

spark实战之:分析维基百科网站统计数据(java版)(代码片段)

...访问我的GitHub在《寻找海量数据集用于大数据开发实战(维基百科网站统计数据)》一文中,我们获取到维基百科网站的网页点击统计数据,也介绍了数据的格式和内容,今天就用这些数据来练习基本的spark开发,<fontcolor="red... 查看详情

wikipedia是啥

...什么?我是英语白痴请不吝赐教Wikipedia:维基百科(一个基于wiki技术的多语言的百科全书协作计划,也是一部用不同语言写成的网络百科全书,其目标及宗旨是为全人类提供自由的百科全书);开放性的百科全书1、读音:英&nbs... 查看详情

spiprotocol-维基百科

...,所以用法多样,这种现象类似于,CAN总线协议与CANOPEN/基于CAN的J1939协议)。这种多样性在于,传输数据的长度不固定、是否支持命令可选、可以只发不收或者只收、发送bits流数据的顺序(LSB/MSB)。【感想】非正式地 查看详情

复数的辐角(维基百科)

    查看详情

java示例代码_基于特定类实例化特定的实现

java示例代码_基于特定类实例化特定的实现 查看详情

数据降维pca(代码片段)

简介@维基百科在多元统计分析中,主成分分析(英语:Principalcomponentsanalysis,PCA)是一种统计分析、简化数据集的方法。它利用正交变换来对一系列可能相关的变量的观测值进行线性变换,从而投影为一系列线性不相关变量的... 查看详情

macos实现词典正常查询维基百科

...载proxifier代理工具设置应用走专门的代理,从而实现维基百科正常查询。二、下载proxifier,网址:https://www.proxifier.com/,可以免费使用一个月,但这里提供了一个网友给的注册码:P427L-9Y552-5433E-8DSR3-58Z68ÿ... 查看详情

xoops-模块-mediawiki维基百科

XOOPS-模块-MediaWiki维基百科克隆维基百科模块修改LocalSettings.php文件本文件修改了MediaWiki数据库表名的前缀,所修改的代码行已用Cloneable标记出。<?php/** *Configfileformediawiki * *ThefileiscomposedofXOOPSbasicpreferencesandmediawikiLocal 查看详情

phpphpbot获取维基百科的定义(代码片段)

查看详情

函数柯里化

定义维基百科中对柯里化(Currying)的定义为:Inmathematicsandcomputerscience,curryingisthetechniqueoftranslatingtheevaluationofafunctionthattakesmultiplearguments(oratupleofarguments)intoevaluatingasequenceoffunctions,e 查看详情

历史上的今天api(数据来自维基百科)

历史上的今天API(数据来自维基百科)  API地址:    http://history.lifetime.photo:81/api/history  参考/引用地址:    维基百科:https://zh.wikipedia.org/zh-cn/%E5%8E%86%E5%8F%B2%E4%B8%8A%E7%9A%84%E4%BB%8A%E5%A4%A9   &nb 查看详情

维基百科

1.什么是GNU/Linux?在GNU/Linux系统中,Linux就是内核组件。而该系统的其余部分主要是由GNU工程编写和提供的程序组成。因为单独的Linux内核并不能成为一个可以正常工作的操作系统,所以我们更倾向使用 “GNU/Linux” ... 查看详情

搜索和浏览离线wikipedia维基百科(中/英)数据工具

  为什么使用离线维基百科?一是因为最近英文维基百科被封,无法访问;二是不受网络限制,使用方便,缺点是不能及时更新,可能会有不影响阅读的乱码。  目前,主要有两种工具用来搜索和浏览离线维基百科数据:Kiw... 查看详情

storage-条带化磁盘(代码片段)

Storage-条带化磁盘条带化磁盘介绍根据维基百科,条带化磁盘是将连续的数据分段地存储在不同的磁盘上,如下图所示。条带化磁盘的实现LVMRAIDBtrfsandZFS条带化磁盘的优点提升总吞吐(throughput),计算公式ÿ... 查看详情

java示例代码_基于多个比较器实现对排序列表的add();参数化比较器

java示例代码_基于多个比较器实现对排序列表的add();参数化比较器 查看详情

python解析维基百科字符串中的文章链接(代码片段)

查看详情