Uploaded by 1750645714

深圳杯

advertisement
基于优化模型的多个火箭残骸的准确定位
在现代航天技术中,火箭是实现空间探索的关键工具。由于火箭发射过程中
的高成本和复杂性,对火箭残骸的回收与重用变得越来越重要。本文将基于题目
给出数据构建优化模型对火箭残骸进行准确定位。
问题一,单个残骸音爆定位分析。首先需要将设备的地理坐标(经度、纬度)
转换为一个更适合计算的坐标系统,残骸发生音爆的位置(x,y,z) 和时间 t,使用
多边测量技术建立方程组。为了提高计算精度构建一个优化模型进行求解,得
到数值解,近似为残骸发生音爆的位置(x,y,z)和时间 t。
问题二、三,多残骸音爆的监测和定位,确定每个监测设备接收到的不同音
爆数据属于哪个具体的残骸。涉及到了最优值的求解,属于优化模型。建立一个
数学模型来解决多源定位问题。我们需要设置一个优化模型,以确定该残骸的
位置和音爆时间。首先将前四个设备的信号进行排列组合,再使用问题一中建
立的模型进行求解,选出可以通过剩下三个监测点检验的答案。最后利用三维
可视化验证了模型的有效性,并展示了监测设备和残骸的空间分布。
问题四,误差修正和精准定位,考虑到设备记录时间可能存在高达0.5秒的
随机误差。首先,为每个设备记录的时间添加一个随机误差,模拟实际条件中
可能的测量不准确性。这个误差可以通过添加一个均值为0,标准差为0.5秒的
正态噪声来模拟。多次模拟,使用样本的一阶矩估计爆炸位置。模型生成的结
果通过三维可视化和时间分析进行了展示和验证,表明模型能够在存在随机测量
误差时有效地估计残骸位置。
整体而言,通过建立数学模型并利用粒子群算法的全局优化能力,解决了复
杂的火箭残骸定位问题,即便在存在测量误差的挑战下也能给出准确的位置估计
这为类似问题提供了一个强大的求解框架和验证方法。
目
录
一、 问题重述 ............................................................................................................. 4
1.1 问题背景 ........................................................................................................ 4
1.2 问题回顾 ........................................................................................................ 5
二、 问题分析 ............................................................................................................. 6
2.1 问题一分析 .................................................................................................... 6
2.2 问题二三分析 ................................................................................................ 6
2.3 问题四分析 .................................................................................................... 6
三、 模型假设 ............................................................................................................. 7
模型假设 ............................................................................................................... 7
四、 符号说明 ............................................................................................................. 7
五、 模型的建立与求解 ............................................................................................. 8
5.1 问题一模型的建立与求解 ............................................................................ 8
5.1.1 数据分析 ............................................................................................. 8
5.1.2 单个残骸定位的建立 ....................................................................... 10
5.2 问题二三模型的建立与求解 ...................................................................... 13
5.2.1 数据分析 ........................................................................................... 13
5.2.2 多个残骸定位模型的建立 ............................................................... 14
5.3 问题四模型的建立与求解 .......................................................................... 19
六、 模型总结 ........................................................................................................... 21
6.1 模型优点 ...................................................................................................... 21
6.2 模型缺点 ...................................................................................................... 21
6.3 模型推广 ...................................................................................................... 22
七、 参考文献 ........................................................................................................... 22
八、 附录 ................................................................................................................... 23
一、问题重述
1.1 问题背景
多级火箭的每个级别在完成其推进任务后,通常会通过级间分离装置自主分
离。这些分离的组件,包括助推器和发动机等,将按预定的轨迹坠向地球。在其
坠落过程中,由于高速穿越大气层,残骸会超过音速,从而产生跨音速音爆。这
种音爆是由于残骸移动速度超过声音传播速度时,声波被压缩而形成的强烈震动
波。
为了有效回收这些高价值的火箭组件,科学家和工程师们开发了一种基于震
动波监测的定位技术。在这一技术中,在残骸预计的落区域内,布置多台震动波
监测设备。这些设备能够捕捉到由跨音速飞行的火箭残骸产生的音爆所引发的震
动波。通过精确测量这些震动波到达不同监测站的时间,可以计算出音爆发生的
位置。
定位技术的核心在于使用三角测量法。当至少三个监测设备接收到音爆信号
时,可以通过比较信号到达各监测站的时间差,确定音爆源的具体位置。这一计
算过程考虑了声速在不同高度和气候条件下的变化,以提高定位的准确性。
得到音爆发生位置后,专家们将进一步采用弹道外推法计算残骸的最终落地
点。这种方法基于残骸坠落时的速度、角度以及地面环境因素如风速和地形等。
通过对这些参数的精确测量和计算,可以预测残骸的落地轨迹,从而实现对落点
的快速定位。
此外,这种高精度的定位技术不仅对火箭残骸回收至关重要,也有助于减少
残骸坠落可能对地面造成的任何负面影响。通过及时回收和重新利用这些空间硬
件,可以显著降低发射成本,并减少环境污染。
综上所述,随着航天活动的增加,火箭残骸的准确快速定位和回收显得尤为
重要。这不仅能够提高资源的再利用率,也是保障地面安全和推动航天技术持续
进步的关键步骤。随着监测技术的不断进步和优化,未来的火箭残骸回收工作将
变得更加高效和精确。
1.2 问题回顾

问题 1 单个残骸音爆定位分析
建立数学模型以分析如何准确确定空中单个火箭残骸发生音爆时的位置坐
标(包括经度、纬度和高程)及时间。假设有 7 台监测设备布置在预计的落点附
近,每台设备记录了音爆抵达的时间。根据这些数据,如何选取合适的信息来计
算音爆的具体发生位置和时间?
2 问题 2 多残骸音爆的监测和定位
问题四,误差修正和精准定位,考虑到设备记录时间可能存在高达0.5秒的
随机误差。首先,为每个设备记录的时间添加一个随机误差,模拟实际条件中
可能的测量不准确性。这个误差可以通过添加一个均值为0,标准差为0.5秒的
正态噪声来模拟。多次模拟,使用样本的一阶矩估计爆炸位置。模型生成的结
果通过三维可视化和时间分析进行了展示和验证,表明模型能够在存在随机测量
误差时有效地估计残骸位置。“
整体而言,通过建立数学模型并利用粒子群算法的全局优化能力,解决了复杂
的火箭残骸定位问题,即便在存在测量误差的挑战下也能给出准确的位置估计这
为类似问题提供了一个强大的求解框架和验证方法。

问题 3 多残骸音爆的复杂数据分析
假设各台监测设备布置的坐标和4个音爆抵达时间已知。利用问题2所建立
的数学模型,选取合适的数据,确定4个残骸在空中发生音爆时的位置和时
间(4个残骸产生音爆的时间可能不同,但互相差别不超过5 s)。

问题 4 误差修正和精准定位
假设设备记录时间存在0.5 s的随机误差,请修正问题2所建立的模型以较
精确地确定4个残骸在空中发生音爆时的位置和时间。通过对问题3表中数
据叠加随机误差,给出修正模型的算例,并分析结果误差。如时间误差无
法降低,提供一种解决方案实现残骸空中的精准定位(误差 km),并自行
根据问题3所计算得到的定位结果模拟所需的监测设备位置和音爆抵达时间
数据,验证相关模型。
二、问题分析
2.1 问题一分析
对于问题一,单个残骸定位问题,首先需要将设备的地理坐标(经度、纬度)
转换为一个更适合计算的坐标系统,如笛卡尔坐标系。残骸发生音爆的位置(x,y,z)
和时间 t。给定 7 台设备的三维坐标和音爆抵达时间,可以使用多边测量技术建
立以下方程组,对建立的模型进行求解即可。
2.2 问题二三分析
对于问题二三,多个残骸定位问题,需要确定每个监测设备接收到的不同音
爆数据属于哪个具体的残骸,还需要确定这些残骸的精确位置和音爆时间。我们
需要设置一个优化模型,以确定该残骸的位置和音爆时间。首先将前四个设备的
信号进行排列组合,再使用问题一中建立的模型进行求解,选出可以通过剩下三
个监测点检验的答案。最后利用三维可视化验证模型的有效性,展示监测设备和
残骸的空间分布。
2.3 问题四分析
误差修正和精准定位,考虑到设备记录时间可能存在高达 0.5 秒的随机误
差。首先,为每个设备记录的时间添加一个随机误差,模拟实际条件中可能的
测量不准确性。这个误差可以通过添加一个均值为 0,标准差为 0.5 秒的正态
噪声来模拟。多次模拟,使用样本的一阶矩估计爆炸位置。模型生成的结果通
过三维可视化和时间分析进行了展示和验证,表明模型能够在存在随机测量误
差时有效地估计残骸位置。
三、模型假设
模型假设
为了方便模型的建立与模型的可行性,这里首先对模型提出一些假设,使得
模型更加完备,预测的结果更加合理。
1. 假设给出的数据均为真实数据,真实有效。
2. 假设给出的脱敏数据没有造成数据的损坏。
3.震动波的传播速度为 340 m/s。
4.计算两点间距离时可忽略地面曲率纬度间每度距离值近似为 111.263 km,经
度间每度距离值近似为 97.304 km。
四、符号说明
为了方便模型的建立与求解过程 ,这里对使用到的关键符号进行以下说明
符号
符号说明
X i1
X i2 X i3
第i个设备的位置
X jp
X jq X jr
第j个残骸的音爆位置
V sound
t j0
t jk
σ
声速
第j个爆炸发生时间
第i个监测点收到第k个音爆时间
随机误差
五、模型的建立与求解
5.1 问题一模型的建立与求解
5.1.1 数据分析
首先将问题一中各设备的经纬度换算成笛卡尔坐标系,我们选择设备 A 作
为参考点,假设设备 A 的平面直角坐标为 (0, 0)。
Y坐标(km)=维度×111.263-27.204×111.263
X坐标(km)=经度×97.304-110.241×97.304
则转换后的平面直角坐标系如下表所示:
利用python绘制了各设备的三维可视化图,如下:
5.1.2 单个残骸定位模型的建立与求解
设残骸的爆炸点坐标为(Xp,Xq,Xr),第i个监测点的坐标为
(Xi1,Xi2,Xi3),爆炸发生时间为t0,第i个监测点收到音爆时间为
ti,声速为 Vsound,ci=tiVsound,则有:
我们需要解答的未知数是:爆炸点的坐标和爆炸发生时间。理论上四个未
知数只需要四个方程,但是这个方程组可能存在多解,所以我们需要先用四个
监测点解方程然后用剩下的监测点做检查。我们选用ABCD四个监测点的数据建
立方程,并使用粒子群算法求解方程的数值解,具体模型如下图所示:
目标函数:
约束条件:
s.t.
利用matlab求解,并将笛卡尔坐标再次换算成经纬度,得到结果为:
经度(°): 110.663926
纬度(°): 27.084060
高程(m): 759.845011
时间(s): -13.947098(负号表示爆炸发生时间位于设备0点之前)
同时下表给出了该残骸与各个设备之间距离的误差范围:
5.2 问题二三模型的建立与求解
5.2.1 数据分析
本问有四个残骸碎片,首先同第一问的形式将经纬度先转化为笛卡尔坐标
系。由于各设备数据与第一问没有差异,故这里不再赘述。
5.2.2 多个残骸定位模型的建立
我们期望继续沿用第一问的思路求解。同时注意到每一个设备接收到
的音爆信号不能确定来自哪一个残骸。所以我们需要判断哪些信息属于同
一次音爆的内容。
由第一问可知,我们只需要使用四个设备即可确定音爆的坐标与时
间,因此我们仍然采用ABCD四台设备,但遍历每一种可能,最后得到4!
^4个答案。利用剩下三台设备检验计算结果,选出最合理的一种答案。
设第m个残骸的爆炸点坐标为(Xp,Xq,Xr),第i个监测点的坐标为
(Xi1,Xi2,Xi3),第m个爆炸发生时间为t0,第i个监测点收到第j个音爆信
号的时间为tij,声速为 vsound,
,则可以建立如下模型:
对于每一个残骸,都有:
目标函数:
约束条件:
s.t.
利用matlab求解并经过检验,选出一组最优解,将笛卡尔坐标再次
换算成经纬度,得到四个残骸的数据分别为:
残骸一:
经度(°): 110.499999
纬度(°): 27.310002
高程(m): 12512.195764
时间(s): 12.002013
残骸二:
经度(°): 110.299999
纬度(°): 27.650001
高程(m): 11477.542910
时间(s): 14.000334
5.2.2 多个残骸定位模型的建立
我们期望继续沿用第一问的思路求解。同时注意到每一个设备接收到的
音爆信号不能确定来自哪一个残骸。所以我们需要判断哪些信息属于同
残骸三:
经度(°): 110.299999
纬度(°): 27.650001
高程(m): 11477.552779
时间(s): 14.000335
残骸四:
经度(°): 110.699998
纬度(°): 27.650000
高程(m): 13468.342989
时间(s): 14.999912
各残骸与各设备之间的误差范围如下:
残骸一:
相对观测点A的距离差为: -7.7387e-06 km
相对观测点B的距离差为: 0.00017072 km
相对观测点C的距离差为: -1.9398e-06 km
相对观测点D的距离差为: 6.3329e-05 km
相对观测点E的距离差为: -0.00026543 km
相对观测点F的距离差为: 2.2138e-05 km
相对观测点G的距离差为: -8.2113e-05 km
残骸二:
相对观测点A的距离差为: -2.093e-05 km
相对观测点B的距离差为: 0.00030007 km
相对观测点C的距离差为: 4.4455e-09 km
相对观测点D的距离差为: -1.1811e-08 km
相对观测点E的距离差为: -4.097e-06 km
相对观测点F的距离差为: -5.6409e-05 km
相对观测点G的距离差为: 1.1927e-05 km
残骸三:
相对观测点A的距离差为: -1.4917e-05 km
相对观测点B的距离差为: 0.00030231 km
相对观测点C的距离差为: 3.3348e-09 km
相对观测点D的距离差为: 3.4108e-08 km
相对观测点E的距离差为: -4.1102e-07 km
相对观测点F的距离差为: -5.7402e-05 km
相对观测点G的距离差为: 1.9075e-05 km
残骸四:
相对观测点A的距离差为: 1.5193e-08 km
相对观测点B的距离差为: -6.3786e-06 km
相对观测点C的距离差为: 0.00020962 km
相对观测点D的距离差为: 3.2569e-06 km
相对观测点E的距离差为: -1.5997e-09 km
相对观测点F的距离差为: -2.7722e-06 km
相对观测点G的距离差为: -9.8967e-05 km
5.3 问题四模型的建立与求解
5.3.1模型建立
假设设备记录时间存在0.5s的随机误差,请修正问题2所建立的模型以较精
确地确定4个残骸在空中发生音爆时的位置和时间。通过对问题3表中数据叠加
随机误差,给出修正模型的算例,并分析结果误差。
首先,我们考虑去对原始的观测数据进行误差的引入,全糖奶茶屋我们对所
有的音爆到达时间增加一个0.5s之内的随机误差,共进行了10次这样的扰动,以
下展示其中一次扰动之后的结果:
​
接下来,我们需要针对扰动后的数据进行判断,第一,是否还能计算得到属于
同一次爆炸的所有音爆到达时间的分类结果,第二,是否还能够计算得到正确的
音爆时间和音爆位置,并估算这个新的音爆时间和位置和原来模型的真实值之
间的距离。
5.3.2扰动后的分类结果求解
我们使用第三问的相关分类模型,再次对扰动后的数据进行重新分类,得到了
分类结果,经过所有的随机变动,再次使用问题三的分类方式进行分类,我们可
以看到分类结果没有变化,所以问题三的模型在分类这一个方向上是仍然成立
的。
5.3.3扰动后的位置结果求解
接着,再次使用第一问中使用的优化模型来计算扰动后的数据,去求解对
应的音爆发生位置,以其中某组属于同一爆炸的音爆抵达时间及其扰动结果为
例,计算结果如下:
5.3.2扰动后的分类结果求解
我们使用第三问的相关分类模型,再次对扰动后的数据进行重新分类,得到了
分类结果,经过所有的随机变动,再次使用问题三的分类方式进行分类,我们可
以看到分类结果没有变化,所以问题三的模型在分类这一个方向上是仍然成立
的。
按题目要求,上文已给出修正模型的算例”,现“分析结果误差”。由于本
问的扰动是基于问题三进行,故将本问求解结果,同问题三进行比较。
在问题三中,求解得到的四组残骸爆炸时间(相对于0时刻)分别
为:-0.012069s,-0.013019s,-0.014000s,-0.015000。将问题三的结果(视为
标准结果)同问题四的结果(基于扰动数据求解的结果)进行对比,如下:
统计计算如下:
如上表,输入数据(时间扰动)的误差为0.5s(士0.5),而求解结果相对于标准结果的误差
分别为0.145s,0.176s,0.131s,0.113s,显著小于输入数据的误差,证明本文所构建的基
于优化方案的空间残骸定位模型,可以显著降低结果时间误差。
六、模型的评价
6.1模型优点
1.本文的优点在于所有模型均通过方程关系进行推导,这一方法保证了模型的准确
性和可靠性。采用方程关系推导模型能够确保模型与实际情况之间的严格对应,从
而提高了模型的预测能力和解释能力。此外,这种推导方法也使得模型的描述更加
清晰便于其他研究者理解和应用。
2.这些模型具有较强的实际应用价值,为位置测量工作提供了一定的理论指导。通
过这些模型,可以更准确地预测火箭残骸的落地位置,有助于提高火箭残骸的回收
效率。此外,这些模型也可以应用于其他领域的位置测量工作,为相关领域的实践
工作提供理论支持。这些模型的实际应用将为相关领域的技术发展和工程实践提供
有力的支持,具有重要的实际意义和应用前景。
3.我们还对这个模型的相关误差进行了深入研究和分析。研究结果表明,该模型具
有较强的拓展性,能够适用于不同环境、不同位置的测量情况。这意味着即使在复
杂多变的环境中,该模型仍能保持较高的准确性和稳定性,为位置测量工作提供了
更为可靠的理论支持。这一研究成果为未来相关领域的研究和实践工作提供了重要
的参考和借鉴,具有较大的推广和应用价值。
6.2模型缺点
1.本文的相关方程严重依赖于声音传播的速度,以及需要没有太多的音波干扰。因
此在实际应用中需要有准确的音波判断,以及环境不能太杂。这意味着在使用这些
模型进行火箭残骸回收时,需要对环境进行充分的评估和处理,确保音波传播的准
确性和稳定性在嘈杂的环境中,可能需要采取一些降噪措施或者调整模型参数,以
提高模型的适用性和准确性。
2.本文主要研究的是陆地附近小范围内的观测设备对空中的音爆发生位置的观测,
所以在假设中假定了计算两点间距离时可忽略地面曲率。然而,对于远距离卫星的
观测或者观测设备距离较远的情况,我们需要重新拟订方程进行测量。在这种情况
下,地面曲率和大气条件等因素可能会对声波传播速度和路径产生显著影响,需要
考虑这些因素来修正模型以提高准确性。因此,在实际应用中,需要根据具体情况
调整模型或者使用不同的测量方法来适应不同的观测场景,以保证测量结果的准确
性和可性。
6.3 模型推广
1.为了提高模型的精度,需要深入研究声波在不同介质中传播速度的变化规
律,并将这些因素纳入模型中进行准确建模。此外,引入先进的声学模型和高精
度声学传感器,结合实验数据对模型进行验证和修正,以确保模型能够准确反映
声波传播的实际情况,从而提高位置测量的精度和可靠性。
2.针对远距离观测或设备距离较远的情况,需要对声波传播路径进行地面曲
率修正。可以采用大地曲率计算公式或数值模拟方法,考虑地面曲率对声波传播
的影响,并将修正后的传播路径纳入模型中,以提高模型在不同距离下的适用性
和准确性。
3.通过结合多种传感器数据,如声波传感器、GNSS 等定位系统,采用传感器
融合技术,综合考虑多种信息源,提高位置测量的准确性和稳定性。通过传感器
融合,可以克服单一传感器可能存在的局限性,提高整体系统的性能和可性。
4.在实际应用中,需要建立实时环境监测系统,监测温度、湿度、风速等环
境因素对声波传播的影响。根据实时监测数据,及时调整模型参数或进行实时修
正,以确保模型在不同环境下的适用性和准确性,提高位冒测量的精度和实用
性。
5.将模型拓展到地质勘探、水声通信等领域,需要根据不同领域的需求和特
点进行适当的调整和优化。在拓展应用中,重点考虑如何将模型与其他领域的现
有技术和方法结合,以提高整体系统的性能和应用效果,拓展模型在不同领域的
应用范围和深度。
七、附录
问题一代码:
%%
clear;
clc;
%% 导入数据
data1 = readtable('data1.xlsx');
newColumnNames = {'device', 'lon', 'lat', 'height', 'time'};
data1.Properties.VariableNames(1:5) = newColumnNames;
disp(data1(1:5,:));
%%数据转换
data1.X_km = (data1.lon - 110.241) * 97.304;
data1.Y_km = (data1.lat - 27.204) * 111.263;
data1.Z_km = data1.height / 1000;
data1.R_km = data1.time * 340 / 1000;
disp(data1(:, {'X_km', 'Y_km', 'Z_km', 'R_km'}));
%%定义范围
bounds = [-100 100; -100 100; 0 50; -100 100];
%% 优化求解
options = optimoptions('particleswarm', 'Display', 'iter');
[result, fval, exitflag, output] = particleswarm(@(params)
objective_function(params, data1), 4, bounds(:,1), bounds(:,2), options);
%% 结果输出
if exitflag > 0
disp('Optimization successful');
fitted_point = result;
fprintf('经度(°): %f\n', fitted_point(1) / 97.304 + 110.241);
fprintf('纬度(°): %f\n', fitted_point(2) / 111.263 + 27.204);
fprintf('高程(m): %f\n', fitted_point(3) * 1000);
fprintf('时间(s): %f\n', - fitted_point(4) / 340 * 1000);
x = fitted_point(1);
y = fitted_point(2);
z = fitted_point(3);
c = fitted_point(4);
for index = 1:size(data1, 1)
actual_distance = sqrt((x - data1.X_km(index))^2 + (y - data1.Y_km(index))^2
+ (z - data1.Z_km(index))^2);
target_distance = data1.R_km(index) + c;
point = data1.device{index};
disp(['相对观测点', point, '的距离差为: ', num2str(actual_distance target_distance), ' km']);
end
else
fprintf('Optimization failed: %s\n', output.message);
end
function total_diff = objective_function(params, data)
x = params(1);
y = params(2);
z = params(3);
c = params(4);
total_diff = 0;
for idx = 1:height(data)
target_distance = (data.R_km(idx) + c)^2;
actual_distance = (x - data.X_km(idx))^2 + (y - data.Y_km(idx))^2 + (z data.Z_km(idx))^2;
difference = abs(actual_distance - target_distance);
total_diff = total_diff + difference;
end
total_diff = total_diff / height(data);
end
问题二、三代码
Group1
%%
clear;
clc;
%% 导入数据
data3 = readtable('data3.xlsx');
newColumnNames = {'device', 'lon', 'lat', 'height', 'time1', 'time2', 'time3',
'time4'};
data3.Properties.VariableNames(:) = newColumnNames;
disp(data3(1:5,:));
%% 数据转换
data3.X_km = (data3.lon - 110.241) * 97.304;
data3.Y_km = (data3.lat - 27.204) * 111.263;
data3.Z_km = data3.height / 1000;
data3.R1_km = data3.time1 * 340 / 1000;
data3.R2_km = data3.time2 * 340 / 1000;
data3.R3_km = data3.time3 * 340 / 1000;
data3.R4_km = data3.time4 * 340 / 1000;
disp(data3(:, {'X_km', 'Y_km', 'Z_km', 'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
%%
data_matrix = table2array(data3(:, {'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
%% 定义范围
bounds = [-100 100; -100 100; 0 30; -100 500];
%% 第一步:固定 A 为 1,循环遍历 BCD
results = ones(64, 7) * 100;
row = 1;
for i = 1:4
for j = 1:4
for k = 1:4
results(row, 1:3) = [i, j, k];
row = row + 1;
end
end
end
for row = 1:height(results)
device_combination = [1, results(row, 1:3)];
for itertime = 1:3
options = optimoptions('particleswarm', 'Display', 'none');
[result, fval, exitflag, output] = particleswarm(@(params)
objective_function(params, data3, data_matrix, device_combination), 4,
bounds(:,1), bounds(:,2), options);
fitted_point = result;
x = fitted_point(1);
y = fitted_point(2);
z = fitted_point(3);
c = fitted_point(4);
result_thistime = zeros(4, 1);
for index = 1:4
actual_distance = sqrt((x - data3.X_km(index))^2 + (y - data3.Y_km(index))^2
+ (z - data3.Z_km(index))^2);
target_distance = data_matrix(index, device_combination(index)) + c;
point = data3.device{index};
result_thistime(index) = abs(actual_distance - target_distance);
end
if sum(result_thistime) < sum(results(row, 4:7))
results(row, 4:7) = result_thistime;
end
end
disp(row)
end
results(:, 8) = sum(results(:, 4:7), 2);
sorted_results = sortrows(results, 8);
%%
disp(['第 1 组音爆分别对应检测设备 A、B、C、D 的序号:', num2str([1, sorted_results(1,
1:3)])]);
%% 第二步:明确 ABCD 分别为 1244,作差计算 EFG
EFG_matrix = ones(3, 4) * 100;
for itertime = 1:20
options = optimoptions('particleswarm', 'Display', 'none');
device_combination = [1, 2, 4, 4];
[result, fval, exitflag, output] = particleswarm(@(params)
objective_function(params, data3, data_matrix, device_combination), 4,
bounds(:,1), bounds(:,2), options);
fitted_point = result;
x = fitted_point(1);
y = fitted_point(2);
z = fitted_point(3);
c = fitted_point(4);
for index = 5:7
actual_distance = sqrt((x - data3.X_km(index))^2 + (y - data3.Y_km(index))^2
+ (z - data3.Z_km(index))^2);
for col = 1:4
target_distance = data_matrix(index, col) + c;
if abs((actual_distance - target_distance)) < abs(EFG_matrix(index-4, col))
EFG_matrix(index-4, col) = abs(actual_distance - target_distance);
end
end
end
disp(itertime)
end
%%
% 找到每行绝对值最小值的索引,即是第几列
[~, min_col_indices] = min(abs(EFG_matrix), [], 2);
disp(['第 1 组音爆分别对应检测设备 A、B、C、D、E、F、G 的序号 ', num2str([1,
sorted_results(1, 1:3), min_col_indices(1:3)'])]);
%% 目标函数
function total_diff = objective_function(params, data, data_matrix,
device_combination)
x = params(1);
y = params(2);
z = params(3);
c = params(4);
total_diff = 0;
for idx = 1:4
target_distance = (data_matrix(idx, device_combination(idx)) + c)^2;
actual_distance = (x - data.X_km(idx))^2 + (y - data.Y_km(idx))^2 + (z data.Z_km(idx))^2;
difference = abs(actual_distance - target_distance);
total_diff = total_diff + difference;
end
total_diff = total_diff / 4;
end
Group1_Calculate result
%%
clear;
clc;
%% 导入数据
data3 = readtable('data3.xlsx');
newColumnNames = {'device', 'lon', 'lat', 'height', 'time1', 'time2', 'time3',
'time4'};
data3.Properties.VariableNames(:) = newColumnNames;
disp(data3(1:5,:));
%% 数据转换
data3.X_km = (data3.lon - 110.241) * 97.304;
data3.Y_km = (data3.lat - 27.204) * 111.263;
data3.Z_km = data3.height / 1000;
data3.R1_km = data3.time1 * 340 / 1000;
data3.R2_km = data3.time2 * 340 / 1000;
data3.R3_km = data3.time3 * 340 / 1000;
data3.R4_km = data3.time4 * 340 / 1000;
disp(data3(:, {'X_km', 'Y_km', 'Z_km', 'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
%%
data_matrix = table2array(data3(:, {'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
%% 定义范围
bounds = [-100 100; -100 100; 0 30; -100 500];
%% 第一步:固定 A 为 1,循环遍历 BCD
results = ones(64, 7) * 100;
row = 1;
for i = 1:4
for j = 1:4
for k = 1:4
results(row, 1:3) = [i, j, k];
row = row + 1;
end
end
end
for row = 1:height(results)
device_combination = [1, results(row, 1:3)];
for itertime = 1:3
options = optimoptions('particleswarm', 'Display', 'none');
[result, fval, exitflag, output] = particleswarm(@(params)
objective_function(params, data3, data_matrix, device_combination), 4,
bounds(:,1), bounds(:,2), options);
fitted_point = result;
x = fitted_point(1);
y = fitted_point(2);
z = fitted_point(3);
c = fitted_point(4);
result_thistime = zeros(4, 1);
for index = 1:4
actual_distance = sqrt((x - data3.X_km(index))^2 + (y - data3.Y_km(index))^2
+ (z - data3.Z_km(index))^2);
target_distance = data_matrix(index, device_combination(index)) + c;
point = data3.device{index};
result_thistime(index) = abs(actual_distance - target_distance);
end
if sum(result_thistime) < sum(results(row, 4:7))
results(row, 4:7) = result_thistime;
end
end
disp(row)
end
results(:, 8) = sum(results(:, 4:7), 2);
sorted_results = sortrows(results, 8);
%%
disp(['第 1 组音爆分别对应检测设备 A、B、C、D 的序号:', num2str([1, sorted_results(1,
1:3)])]);
%% 第二步:明确 ABCD 分别为 1244,作差计算 EFG
EFG_matrix = ones(3, 4) * 100;
for itertime = 1:20
options = optimoptions('particleswarm', 'Display', 'none');
device_combination = [1, 2, 4, 4];
[result, fval, exitflag, output] = particleswarm(@(params)
objective_function(params, data3, data_matrix, device_combination), 4,
bounds(:,1), bounds(:,2), options);
fitted_point = result;
x = fitted_point(1);
y = fitted_point(2);
z = fitted_point(3);
c = fitted_point(4);
for index = 5:7
actual_distance = sqrt((x - data3.X_km(index))^2 + (y - data3.Y_km(index))^2
+ (z - data3.Z_km(index))^2);
for col = 1:4
target_distance = data_matrix(index, col) + c;
if abs((actual_distance - target_distance)) < abs(EFG_matrix(index-4, col))
EFG_matrix(index-4, col) = abs(actual_distance - target_distance);
end
end
end
disp(itertime)
end
%%
% 找到每行绝对值最小值的索引,即是第几列
[~, min_col_indices] = min(abs(EFG_matrix), [], 2);
disp(['第 1 组音爆分别对应检测设备 A、B、C、D、E、F、G 的序号 ', num2str([1,
sorted_results(1, 1:3), min_col_indices(1:3)'])]);
%% 目标函数
function total_diff = objective_function(params, data, data_matrix,
device_combination)
x = params(1);
y = params(2);
z = params(3);
c = params(4);
total_diff = 0;
for idx = 1:4
target_distance = (data_matrix(idx, device_combination(idx)) + c)^2;
actual_distance = (x - data.X_km(idx))^2 + (y - data.Y_km(idx))^2 + (z data.Z_km(idx))^2;
difference = abs(actual_distance - target_distance);
total_diff = total_diff + difference;
end
total_diff = total_diff / 4;
end
Group1_Calculate result
%%
clear;
clc;
%% 导入数据
data3 = readtable('data3.xlsx');
newColumnNames = {'device', 'lon', 'lat', 'height', 'time1', 'time2', 'time3',
'time4'};
data3.Properties.VariableNames(:) = newColumnNames;
disp(data3(1:5,:));
%% 数据转换
data3.X_km = (data3.lon - 110.241) * 97.304;
data3.Y_km = (data3.lat - 27.204) * 111.263;
data3.Z_km = data3.height / 1000;
data3.R1_km = data3.time1 * 340 / 1000;
data3.R2_km = data3.time2 * 340 / 1000;
data3.R3_km = data3.time3 * 340 / 1000;
data3.R4_km = data3.time4 * 340 / 1000;
disp(data3(:, {'X_km', 'Y_km', 'Z_km', 'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
%%
data_matrix = table2array(data3(:, {'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
result_group1 = [1, 2, 4, 4, 3, 4, 2];
data_array = zeros(1, 7);
for i = 1:7
data_array(i) = data_matrix(i, result_group1(i));
end
%% 定义范围
bounds = [-100 100; -100 100; 0 30; -100 500];
%% 优化求解
options = optimoptions('particleswarm', 'Display', 'iter');
[result, fval, exitflag, output] = particleswarm(@(params)
objective_function(params, data3, data_array), 4, bounds(:,1), bounds(:,2),
options);
%% 结果输出
if exitflag > 0
disp('Optimization successful');
fitted_point = result;
fprintf('经度(°): %f\n', fitted_point(1) / 97.304 + 110.241);
fprintf('纬度(°): %f\n', fitted_point(2) / 111.263 + 27.204);
fprintf('高程(m): %f\n', fitted_point(3) * 1000);
fprintf('时间(s): %f\n', - fitted_point(4) / 340 * 1000);
x = fitted_point(1);
y = fitted_point(2);
z = fitted_point(3);
c = fitted_point(4);
for index = 1:size(data3, 1)
actual_distance = sqrt((x - data3.X_km(index))^2 + (y - data3.Y_km(index))^2
+ (z - data3.Z_km(index))^2);
target_distance = data_array(index) + c;
point = data3.device{index};
disp(['相对观测点', point, '的距离差为: ', num2str(actual_distance target_distance), ' km']);
end
else
fprintf('Optimization failed: %s\n', output.message);
end
% 目标函数
function total_diff = objective_function(params, data, data_array)
x = params(1);
y = params(2);
z = params(3);
c = params(4);
total_diff = 0;
for idx = 1:height(data)
target_distance = (data_array(idx) + c)^2;
actual_distance = (x - data.X_km(idx))^2 + (y - data.Y_km(idx))^2 + (z data.Z_km(idx))^2;
difference = abs(actual_distance - target_distance);
total_diff = total_diff + difference;
end
total_diff = total_diff / height(data);
end
Group2
%%
clear;
clc;
%% 已知,1244342 是一组。
%% 导入数据
data3 = readtable('data3.xlsx');
newColumnNames = {'device', 'lon', 'lat', 'height', 'time1', 'time2', 'time3',
'time4'};
data3.Properties.VariableNames(:) = newColumnNames;
disp(data3(1:5,:));
%% 数据转换
data3.X_km = (data3.lon - 110.241) * 97.304;
data3.Y_km = (data3.lat - 27.204) * 111.263;
data3.Z_km = data3.height / 1000;
data3.R1_km = data3.time1 * 340 / 1000;
data3.R2_km = data3.time2 * 340 / 1000;
data3.R3_km = data3.time3 * 340 / 1000;
data3.R4_km = data3.time4 * 340 / 1000;
disp(data3(:, {'X_km', 'Y_km', 'Z_km', 'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
%%
data_matrix = table2array(data3(:, {'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
%% 定义范围
bounds = [-100 100; -100 100; 0 30; -100 500];
%% 第一步:固定 A 为 2,循环遍历 BCD
results = ones(27, 7) * 100;
row = 1;
for i = [1, 3, 4]
for j = [1, 2, 3]
for k = [1, 2, 3]
results(row, 1:3) = [i, j, k];
row = row + 1;
end
end
end
for row = 1:height(results)
device_combination = [4, results(row, 1:3)];
for itertime = 1:10
options = optimoptions('particleswarm', 'Display', 'none');
[result, fval, exitflag, output] = particleswarm(@(params)
objective_function(params, data3, data_matrix, device_combination), 4,
bounds(:,1), bounds(:,2), options);
fitted_point = result;
x = fitted_point(1);
y = fitted_point(2);
z = fitted_point(3);
c = fitted_point(4);
result_thistime = zeros(4, 1);
for index = 1:4
actual_distance = sqrt((x - data3.X_km(index))^2 + (y - data3.Y_km(index))^2
+ (z - data3.Z_km(index))^2);
target_distance = data_matrix(index, device_combination(index)) + c;
point = data3.device{index};
result_thistime(index) = actual_distance - target_distance;
end
if sum(result_thistime) < sum(results(row, 4:7))
results(row, 4:7) = result_thistime;
end
end
disp(row)
end
results(:, 8) = sum(abs(results(:, 4:7)), 2);
sorted_results = sortrows(results, 8);
disp(['第 2 组音爆分别对应检测设备 A、B、C、D 的序号:', num2str([4, sorted_results(1,
1:3)])]);
%% 第二步:明确 ABCD 分别为 1244,作差计算 EFG
EFG_matrix = ones(3, 4) * 100;
for itertime = 1:20
options = optimoptions('particleswarm', 'Display', 'none');
device_combination = [4, sorted_results(1, 1:3)];
[result, fval, exitflag, output] = particleswarm(@(params)
objective_function(params, data3, data_matrix, device_combination), 4,
bounds(:,1), bounds(:,2), options);
fitted_point = result;
x = fitted_point(1);
y = fitted_point(2);
z = fitted_point(3);
c = fitted_point(4);
for index = 5:7
actual_distance = sqrt((x - data3.X_km(index))^2 + (y - data3.Y_km(index))^2
+ (z - data3.Z_km(index))^2);
for col = 1:4
target_distance = data_matrix(index, col) + c;
if abs((actual_distance - target_distance)) < abs(EFG_matrix(index-4, col))
EFG_matrix(index-4, col) = actual_distance - target_distance;
end
end
end
disp(itertime)
end
% EFG_matrix(1, )
%%
% 找到每行绝对值最小值的索引,即是第几列
Group1 = [1, 2, 4, 4, 3, 4, 2];
for i = 5:7
EFG_matrix(i-4, Group1(i)) = 100;
end
[~, min_col_indices] = min(abs(EFG_matrix), [], 2);
disp(['第 2 组音爆分别对应检测设备 A、B、C、D、E、F、G 的序号 ', num2str([4,
sorted_results(1, 1:3), min_col_indices(1:3)'])]);
%% 目标函数
function total_diff = objective_function(params, data, data_matrix,
device_combination)
x = params(1);
y = params(2);
z = params(3);
c = params(4);
total_diff = 0;
for idx = 1:4
target_distance = (data_matrix(idx, device_combination(idx)) + c)^2;
actual_distance = (x - data.X_km(idx))^2 + (y - data.Y_km(idx))^2 + (z data.Z_km(idx))^2;
difference = abs(actual_distance - target_distance);
total_diff = total_diff + difference;
end
total_diff = total_diff / 4;
end
Group2
%%
clear;
clc;
%% 已知,1244342 是一组。
%% 导入数据
data3 = readtable('data3.xlsx');
newColumnNames = {'device', 'lon', 'lat', 'height', 'time1', 'time2', 'time3',
'time4'};
data3.Properties.VariableNames(:) = newColumnNames;
disp(data3(1:5,:));
%% 数据转换
data3.X_km = (data3.lon - 110.241) * 97.304;
data3.Y_km = (data3.lat - 27.204) * 111.263;
data3.Z_km = data3.height / 1000;
data3.R1_km = data3.time1 * 340 / 1000;
data3.R2_km = data3.time2 * 340 / 1000;
data3.R3_km = data3.time3 * 340 / 1000;
data3.R4_km = data3.time4 * 340 / 1000;
disp(data3(:, {'X_km', 'Y_km', 'Z_km', 'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
%%
data_matrix = table2array(data3(:, {'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
%% 定义范围
bounds = [-100 100; -100 100; 0 30; -100 500];
%% 第一步:固定 A 为 2,循环遍历 BCD
results = ones(27, 7) * 100;
row = 1;
for i = [1, 3, 4]
for j = [1, 2, 3]
for k = [1, 2, 3]
results(row, 1:3) = [i, j, k];
row = row + 1;
end
end
end
for row = 1:height(results)
device_combination = [4, results(row, 1:3)];
for itertime = 1:10
options = optimoptions('particleswarm', 'Display', 'none');
[result, fval, exitflag, output] = particleswarm(@(params)
objective_function(params, data3, data_matrix, device_combination), 4,
bounds(:,1), bounds(:,2), options);
fitted_point = result;
x = fitted_point(1);
y = fitted_point(2);
z = fitted_point(3);
c = fitted_point(4);
result_thistime = zeros(4, 1);
for index = 1:4
actual_distance = sqrt((x - data3.X_km(index))^2 + (y - data3.Y_km(index))^2
+ (z - data3.Z_km(index))^2);
target_distance = data_matrix(index, device_combination(index)) + c;
point = data3.device{index};
result_thistime(index) = actual_distance - target_distance;
end
if sum(result_thistime) < sum(results(row, 4:7))
results(row, 4:7) = result_thistime;
end
end
disp(row)
end
results(:, 8) = sum(abs(results(:, 4:7)), 2);
sorted_results = sortrows(results, 8);
disp(['第 2 组音爆分别对应检测设备 A、B、C、D 的序号:', num2str([4, sorted_results(1,
1:3)])]);
%% 第二步:明确 ABCD 分别为 1244,作差计算 EFG
EFG_matrix = ones(3, 4) * 100;
for itertime = 1:20
options = optimoptions('particleswarm', 'Display', 'none');
device_combination = [4, sorted_results(1, 1:3)];
[result, fval, exitflag, output] = particleswarm(@(params)
objective_function(params, data3, data_matrix, device_combination), 4,
bounds(:,1), bounds(:,2), options);
fitted_point = result;
x = fitted_point(1);
y = fitted_point(2);
z = fitted_point(3);
c = fitted_point(4);
for index = 5:7
actual_distance = sqrt((x - data3.X_km(index))^2 + (y - data3.Y_km(index))^2
+ (z - data3.Z_km(index))^2);
for col = 1:4
target_distance = data_matrix(index, col) + c;
if abs((actual_distance - target_distance)) < abs(EFG_matrix(index-4, col))
EFG_matrix(index-4, col) = actual_distance - target_distance;
end
end
end
disp(itertime)
end
% EFG_matrix(1, )
%%
% 找到每行绝对值最小值的索引,即是第几列
Group1 = [1, 2, 4, 4, 3, 4, 2];
for i = 5:7
EFG_matrix(i-4, Group1(i)) = 100;
end
[~, min_col_indices] = min(abs(EFG_matrix), [], 2);
disp(['第 2 组音爆分别对应检测设备 A、B、C、D、E、F、G 的序号 ', num2str([4,
sorted_results(1, 1:3), min_col_indices(1:3)'])]);
%% 目标函数
function total_diff = objective_function(params, data, data_matrix,
device_combination)
x = params(1);
y = params(2);
z = params(3);
c = params(4);
total_diff = 0;
for idx = 1:4
target_distance = (data_matrix(idx, device_combination(idx)) + c)^2;
actual_distance = (x - data.X_km(idx))^2 + (y - data.Y_km(idx))^2 + (z data.Z_km(idx))^2;
difference = abs(actual_distance - target_distance);
total_diff = total_diff + difference;
end
total_diff = total_diff / 4;
end
Group2_Calculate result
%%
clear;
clc;
%% 导入数据
data3 = readtable('data3.xlsx');
newColumnNames = {'device', 'lon', 'lat', 'height', 'time1', 'time2', 'time3',
'time4'};
data3.Properties.VariableNames(:) = newColumnNames;
disp(data3(1:5,:));
%% 数据转换
data3.X_km = (data3.lon - 110.241) * 97.304;
data3.Y_km = (data3.lat - 27.204) * 111.263;
data3.Z_km = data3.height / 1000;
data3.R1_km = data3.time1 * 340 / 1000;
data3.R2_km = data3.time2 * 340 / 1000;
data3.R3_km = data3.time3 * 340 / 1000;
data3.R4_km = data3.time4 * 340 / 1000;
disp(data3(:, {'X_km', 'Y_km', 'Z_km', 'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
%%
data_matrix = table2array(data3(:, {'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
result_group2 = [4, 4, 2, 1, 4, 1, 3];
data_array = zeros(1, 7);
for i = 1:7
data_array(i) = data_matrix(i, result_group2(i));
end
%% 定义范围
bounds = [-100 100; -100 100; 0 30; -100 500];
%% 优化求解
options = optimoptions('particleswarm', 'Display', 'iter');
[result, fval, exitflag, output] = particleswarm(@(params)
objective_function(params, data3, data_array), 4, bounds(:,1), bounds(:,2),
options);
%% 结果输出
if exitflag > 0
disp('Optimization successful');
fitted_point = result;
fprintf('经度(°): %f\n', fitted_point(1) / 97.304 + 110.241);
fprintf('纬度(°): %f\n', fitted_point(2) / 111.263 + 27.204);
fprintf('高程(m): %f\n', fitted_point(3) * 1000);
fprintf('时间(s): %f\n', - fitted_point(4) / 340 * 1000);
x = fitted_point(1);
y = fitted_point(2);
z = fitted_point(3);
c = fitted_point(4);
for index = 1:size(data3, 1)
actual_distance = sqrt((x - data3.X_km(index))^2 + (y - data3.Y_km(index))^2
+ (z - data3.Z_km(index))^2);
target_distance = data_array(index) + c;
point = data3.device{index};
disp(['相对观测点', point, '的距离差为: ', num2str(actual_distance target_distance), ' km']);
end
else
fprintf('Optimization failed: %s\n', output.message);
end
% 目标函数
function total_diff = objective_function(params, data, data_array)
x = params(1);
y = params(2);
z = params(3);
c = params(4);
total_diff = 0;
for idx = 1:height(data)
target_distance = (data_array(idx) + c)^2;
actual_distance = (x - data.X_km(idx))^2 + (y - data.Y_km(idx))^2 + (z data.Z_km(idx))^2;
difference = abs(actual_distance - target_distance);
total_diff = total_diff + difference;
end
total_diff = total_diff / height(data);
end
Group3_
%%
clear;
clc;
%% 已知,1244342 是一组, 4421413 是一组
%% 导入数据
data3 = readtable('data3.xlsx');
newColumnNames = {'device', 'lon', 'lat', 'height', 'time1', 'time2', 'time3',
'time4'};
data3.Properties.VariableNames(:) = newColumnNames;
disp(data3(1:5,:));
%% 数据转换
data3.X_km = (data3.lon - 110.241) * 97.304;
data3.Y_km = (data3.lat - 27.204) * 111.263;
data3.Z_km = data3.height / 1000;
data3.R1_km = data3.time1 * 340 / 1000;
data3.R2_km = data3.time2 * 340 / 1000;
data3.R3_km = data3.time3 * 340 / 1000;
data3.R4_km = data3.time4 * 340 / 1000;
disp(data3(:, {'X_km', 'Y_km', 'Z_km', 'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
%%
data_matrix = table2array(data3(:, {'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
%% 定义范围
bounds = [-100 100; -100 100; 0 30; -100 500];
%% 第一步:固定 A 为 2,循环遍历 BCD
results = ones(8, 7) * 100;
row = 1;
for i = [1, 3]
for j = [1, 3]
for k = [2, 3]
results(row, 1:3) = [i, j, k];
row = row + 1;
end
end
end
for row = 1:height(results)
device_combination = [2, results(row, 1:3)];
for itertime = 1:10
options = optimoptions('particleswarm', 'Display', 'none');
[result, fval, exitflag, output] = particleswarm(@(params)
objective_function(params, data3, data_matrix, device_combination), 4,
bounds(:,1), bounds(:,2), options);
fitted_point = result;
x = fitted_point(1);
y = fitted_point(2);
z = fitted_point(3);
c = fitted_point(4);
result_thistime = zeros(4, 1);
for index = 1:4
actual_distance = sqrt((x - data3.X_km(index))^2 + (y - data3.Y_km(index))^2
+ (z - data3.Z_km(index))^2);
target_distance = data_matrix(index, device_combination(index)) + c;
point = data3.device{index};
result_thistime(index) = actual_distance - target_distance;
end
if sum(result_thistime) < sum(results(row, 4:7))
results(row, 4:7) = result_thistime;
end
end
disp(row)
end
results(:, 8) = sum(abs(results(:, 4:7)), 2);
sorted_results = sortrows(results, 8);
disp(['第 3 组音爆分别对应检测设备 A、B、C、D 的序号:', num2str([2, sorted_results(1,
1:3)])]);
%% 第二步:明确 ABCD 分别为 2332,作差计算 EFG
EFG_matrix = ones(3, 4) * 100;
for itertime = 1:20
options = optimoptions('particleswarm', 'Display', 'none');
device_combination = [2, sorted_results(1, 1:3)];
[result, fval, exitflag, output] = particleswarm(@(params)
objective_function(params, data3, data_matrix, device_combination), 4,
bounds(:,1), bounds(:,2), options);
fitted_point = result;
x = fitted_point(1);
y = fitted_point(2);
z = fitted_point(3);
c = fitted_point(4);
for index = 5:7
actual_distance = sqrt((x - data3.X_km(index))^2 + (y - data3.Y_km(index))^2
+ (z - data3.Z_km(index))^2);
for col = 1:4
target_distance = data_matrix(index, col) + c;
if abs((actual_distance - target_distance)) < abs(EFG_matrix(index-4, col))
EFG_matrix(index-4, col) = actual_distance - target_distance;
end
end
end
disp(itertime)
end
%%
Group1 = [1, 2, 4, 4, 3, 4, 2];
Group2 = [4, 4, 2, 1, 4, 1, 3];
for i = 5:7
EFG_matrix(i-4, Group1(i)) = 100;
EFG_matrix(i-4, Group2(i)) = 100;
end
[~, min_col_indices] = min(abs(EFG_matrix), [], 2);
disp(['第 3 组音爆分别对应检测设备 A、B、C、D、E、F、G 的序号 ', num2str([2,
sorted_results(1, 1:3), min_col_indices(1:3)'])]);
%% 目标函数
function total_diff = objective_function(params, data, data_matrix,
device_combination)
x = params(1);
y = params(2);
z = params(3);
c = params(4);
total_diff = 0;
for idx = 1:4
target_distance = (data_matrix(idx, device_combination(idx)) + c)^2;
actual_distance = (x - data.X_km(idx))^2 + (y - data.Y_km(idx))^2 + (z data.Z_km(idx))^2;
difference = abs(actual_distance - target_distance);
total_diff = total_diff + difference;
end
total_diff = total_diff / 4;
end
Group3_Calculate result
%%
clear;
clc;
%% 导入数据
data3 = readtable('data3.xlsx');
newColumnNames = {'device', 'lon', 'lat', 'height', 'time1', 'time2', 'time3',
'time4'};
data3.Properties.VariableNames(:) = newColumnNames;
disp(data3(1:5,:));
%% 数据转换
data3.X_km = (data3.lon - 110.241) * 97.304;
data3.Y_km = (data3.lat - 27.204) * 111.263;
data3.Z_km = data3.height / 1000;
data3.R1_km = data3.time1 * 340 / 1000;
data3.R2_km = data3.time2 * 340 / 1000;
data3.R3_km = data3.time3 * 340 / 1000;
data3.R4_km = data3.time4 * 340 / 1000;
disp(data3(:, {'X_km', 'Y_km', 'Z_km', 'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
%%
data_matrix = table2array(data3(:, {'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
result_group2 = [2, 3, 3, 2, 2, 2, 1];
data_array = zeros(1, 7);
for i = 1:7
data_array(i) = data_matrix(i, result_group2(i));
end
%% 定义范围
bounds = [-100 100; -100 100; 0 30; -100 500];
%% 优化求解
options = optimoptions('particleswarm', 'Display', 'iter');
[result, fval, exitflag, output] = particleswarm(@(params)
objective_function(params, data3, data_array), 4, bounds(:,1), bounds(:,2),
options);
%% 结果输出
if exitflag > 0
disp('Optimization successful');
fitted_point = result;
fprintf('经度(°): %f\n', fitted_point(1) / 97.304 + 110.241);
fprintf('纬度(°): %f\n', fitted_point(2) / 111.263 + 27.204);
fprintf('高程(m): %f\n', fitted_point(3) * 1000);
fprintf('时间(s): %f\n', - fitted_point(4) / 340 * 1000);
x = fitted_point(1);
y = fitted_point(2);
z = fitted_point(3);
c = fitted_point(4);
for index = 1:size(data3, 1)
actual_distance = sqrt((x - data3.X_km(index))^2 + (y - data3.Y_km(index))^2
+ (z - data3.Z_km(index))^2);
target_distance = data_array(index) + c;
point = data3.device{index};
disp(['相对观测点', point, '的距离差为: ', num2str(actual_distance target_distance), ' km']);
end
else
fprintf('Optimization failed: %s\n', output.message);
end
% 目标函数
function total_diff = objective_function(params, data, data_array)
x = params(1);
y = params(2);
z = params(3);
c = params(4);
total_diff = 0;
for idx = 1:height(data)
target_distance = (data_array(idx) + c)^2;
actual_distance = (x - data.X_km(idx))^2 + (y - data.Y_km(idx))^2 + (z data.Z_km(idx))^2;
difference = abs(actual_distance - target_distance);
total_diff = total_diff + difference;
end
total_diff = total_diff / height(data);
end
Group4_Calculate result
%%
clear;
clc;
%% 导入数据
data3 = readtable('data3.xlsx');
newColumnNames = {'device', 'lon', 'lat', 'height', 'time1', 'time2', 'time3',
'time4'};
data3.Properties.VariableNames(:) = newColumnNames;
disp(data3(1:5,:));
%% 数据转换
data3.X_km = (data3.lon - 110.241) * 97.304;
data3.Y_km = (data3.lat - 27.204) * 111.263;
data3.Z_km = data3.height / 1000;
data3.R1_km = data3.time1 * 340 / 1000;
data3.R2_km = data3.time2 * 340 / 1000;
data3.R3_km = data3.time3 * 340 / 1000;
data3.R4_km = data3.time4 * 340 / 1000;
disp(data3(:, {'X_km', 'Y_km', 'Z_km', 'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
%%
data_matrix = table2array(data3(:, {'R1_km', 'R2_km', 'R3_km', 'R4_km'}));
result_group2 = [3, 1, 1, 3, 1, 3, 4];
data_array = zeros(1, 7);
for i = 1:7
data_array(i) = data_matrix(i, result_group2(i));
end
%% 定义范围
bounds = [-100 100; -100 100; 0 30; -100 500];
%% 优化求解
options = optimoptions('particleswarm', 'Display', 'iter');
[result, fval, exitflag, output] = particleswarm(@(params)
objective_function(params, data3, data_array), 4, bounds(:,1), bounds(:,2),
options);
%% 结果输出
if exitflag > 0
disp('Optimization successful');
fitted_point = result;
fprintf('经度(°): %f\n', fitted_point(1) / 97.304 + 110.241);
fprintf('纬度(°): %f\n', fitted_point(2) / 111.263 + 27.204);
fprintf('高程(m): %f\n', fitted_point(3) * 1000);
fprintf('时间(s): %f\n', - fitted_point(4) / 340 * 1000);
x = fitted_point(1);
y = fitted_point(2);
z = fitted_point(3);
c = fitted_point(4);
for index = 1:size(data3, 1)
actual_distance = sqrt((x - data3.X_km(index))^2 + (y - data3.Y_km(index))^2
+ (z - data3.Z_km(index))^2);
target_distance = data_array(index) + c;
point = data3.device{index};
disp(['相对观测点', point, '的距离差为: ', num2str(actual_distance target_distance), ' km']);
end
else
fprintf('Optimization failed: %s\n', output.message);
end
% 目标函数
function total_diff = objective_function(params, data, data_array)
x = params(1);
y = params(2);
z = params(3);
c = params(4);
total_diff = 0;
for idx = 1:height(data)
target_distance = (data_array(idx) + c)^2;
actual_distance = (x - data.X_km(idx))^2 + (y - data.Y_km(idx))^2 + (z data.Z_km(idx))^2;
difference = abs(actual_distance - target_distance);
total_diff = total_diff + difference;
end
total_diff = total_diff / height(data);
end
Download