这里是数模宝典,火速更新,为您带来独家数维杯A题完整思路与攻略!
数维杯(ABC3题题)完整内容可以在文章末尾领取!
第一个问题是结合题目信息与数据,建立机会信号的数学表达式。同时,针对每一类机会信号,讨论能够唯一确定飞行器位置的最少的机会信号个数。
假设飞行器在三维空间中的位置为(x,y,z),发射源的位置为(xi,yi,zi),接收到的机会信号的到达时间为ti,到达时间差为td,多普勒频率差为df,到达角度信息为α,接收强度指标为rssi。
-
达到时间信息TOA的数学表达式为:
ti = t0 + ∥(xi - x)² + (yi - y)² + (zi - z)²∥ / c
其中,t0为发射时间,c为光速。 -
到达时间差信息TDOA的数学表达式为:
td = ∥(xi - x)² + (yi - y)² + (zi - z)²∥ / c
其中,c为光速。 -
多普勒频率差信息DFD的数学表达式为:
df = f0 / c * ((vx * (xi - x) + vy * (yi - y) + vz * (zi - z)) / ∥(xi - x)² + (yi - y)² + (zi - z)²∥ - (vx * (xi’ - x) + vy * (yi’ - y) + vz * (zi’ - z)) / ∥(xi’ - x)² + (yi’ - y)² + (zi’ - z)²∥)
其中,f0为发射信号的频率,c为光速,vx、vy、vz为飞行器的速度分量,(xi’,yi’,zi’)为另一个发射源的位置。 -
到达角度信息AOA的数学表达式为:
tanα = (z - zi) / √((x - xi)² + (y - yi)²)
其中,(xi,yi,zi)为发射源的位置,(x,y,z)为飞行器的位置。 -
接收强度指标信息RSSI的数学表达式为:
rssi = r0 - 10 * n * lg(d / d0)
其中,r0为标称信号强度,n为信道衰减系数,d为接收源与发射源的距离,d0为标称距离。
针对每一类机会信号,能够唯一确定飞行器位置的最少机会信号个数如下:
TOA:由于需要至少3个发射源发射信号,因此至少需要3个信号。
TDOA:由于需要至少2个发射源发射信号,因此至少需要2个信号。
DFD:由于需要至少2个发射源发射信号,因此至少需要2个信号。
AOA:由于需要至少1个发射源发射信号,因此至少需要1个信号。
RSSI:由于需要至少1个发射源发射信号,因此至少需要1个信号。
综上所述,至少需要3个信号才能唯一确定飞行器的位置。
解:首先,根据题目背景,可以得出机会信号导航的目标是通过接收到的机会信号信息,实时计算飞行器自身的三维空间位置。为了实现这一目标,需要建立机会信号的数学表达式,以及确定能够唯一确定飞行器位置的最少的机会信号个数。
- 机会信号数学表达式
根据题目背景,机会信号可以分为五类:达到时间信息(TOA)、到达时间差信息(TDOA)、多普勒频率差信息(DFD)、到达角度信息(AOA)、接收强度指标信息(RSSI)。下面分别给出这五类机会信号的数学表达式。
(1)达到时间信息TOA:
设飞行器接收到的某个发射源信号的到达时间为t,信号发射的时间为t0,则该机会信号的达到时间信息TOA可以表示为:
t T O A = t − t 0 t_{TOA} = t - t_0 tTOA=t−t0
(2)到达时间差信息TDOA:
设飞行器接收到的某个发射源1和发射源2信号的到达时间分别为 t 1 t_1 t1和 t 2 t_2 t2,信号发射的时间分别为 t 01 t_{01} t01和 t 02 t_{02} t02,则该机会信号的到达时间差信息TDOA可以表示为:
t T D O A = t 1 − t 2 − ( t 01 − t 02 ) t_{TDOA} = t_1 - t_2 - (t_{01} - t_{02}) tTDOA=t1−t2−(t01−t02)
(3)多普勒频率差信息DFD:
设飞行器接收到的某个发射源1和发射源2信号的频率分别为 f 1 f_1 f1和 f 2 f_2 f2,信号传播速度为c,发射源1和发射源2相对接收源的速度向量为 v 1 v_1 v1和 v 2 v_2 v2,发射源1和发射源2相对接收源的位移向量为 r 1 r_1 r1和 r 2 r_2 r2,发射源与接收源的距离为r,则该机会信号的多普勒频率差信息DFD可以表示为:
t D F D = f 1 c ⋅ ( v 1 ⋅ r 1 r ) − f 2 c ⋅ ( v 2 ⋅ r 2 r ) t_{DFD} = \frac{f_1}{c} \cdot (\frac{v_1 \cdot r_1}{r}) - \frac{f_2}{c} \cdot (\frac{v_2 \cdot r_2}{r}) tDFD=cf1⋅(rv1⋅r1)−cf2⋅(rv2⋅r2)
(4)到达角度信息AOA:
设飞行器接收到的某个发射源信号的到达角度信息为 θ \theta θ,则该机会信号的到达角度信息AOA可以表示为:
t A O A = t a n θ t_{AOA} = tan \theta tAOA=tanθ
(5)接收强度指标信息RSSI:
设飞行器接收到的某个发射源信号的强度指标信息为 I I I,标称距离下的信号强度为 I 0 I_0 I0,信道衰减系数为 k k k,发射源与接收源的相对距离为 r r r,标称距离为 r 0 r_0 r0,则该机会信号的接收强度指标信息RSSI可以表示为:
t R S S I = I − 10 k log r r 0 t_{RSSI} = I - 10k\log\frac{r}{r_0} tRSSI=I−10klogr0r
- 能够唯一确定飞行器位置的最少的机会信号个数
根据上述五类机会信号的数学表达式,可以发现,TOA、TDOA、DFD、AOA四类机会信号中,每一类都含有一个未知量,因此每一类机会信号都可以提供一条方程,当机会信号个数大于等于四类时,可以通过解方程组来唯一确定飞行器的位置。而RSSI类机会信号虽然没有未知量,但是可以提供一条强度指标信息,可以用来判断解的可靠性。因此,能够唯一确定飞行器位置的最少的机会信号个数为四类。
总结起来,能够唯一确定飞行器位置的最少的机会信号个数为四类,即TOA、TDOA、DFD、AOA四类机会信号。
# 导入相关库
import numpy as np
from scipy.optimize import leastsq
# 读取数据
data = np.loadtxt('附件1.txt')
# 初始化各个机会信号的数据
TOA = data[:, 0] # 达到时间信息
TDOA = data[:, 1] # 到达时间差信息
DFD = data[:, 2] # 多普勒频率差信息
AOA = data[:, 3] # 到达角度信息
RSSI = data[:, 4] # 接收强度指标信息
# 定义机会信号的数学表达式
def signal_func(x, A, B):
return A * x + B
# 定义误差函数
def error_func(params, x, y):
return signal_func(x, params[0], params[1]) - y
# 计算TOA的最小二乘解
p0 = [1, 0]
TOA_params = leastsq(error_func, p0, args=(TOA, 0))[0]
print('TOA最小二乘解:', TOA_params)
# 计算TDOA的最小二乘解
TDOA_params = leastsq(error_func, p0, args=(TDOA, 0))[0]
print('TDOA最小二乘解:', TDOA_params)
# 计算DFD的最小二乘解
DFD_params = leastsq(error_func, p0, args=(DFD, 0))[0]
print('DFD最小二乘解:', DFD_params)
# 计算AOA的最小二乘解
AOA_params = leastsq(error_func, p0, args=(AOA, 0))[0]
print('AOA最小二乘解:', AOA_params)
# 计算RSSI的最小二乘解
RSSI_params = leastsq(error_func, p0, args=(RSSI, 0))[0]
print('RSSI最小二乘解:', RSSI_params)
# 计算每类机会信号的最小二乘解的个数
TOA_num = np.sum(np.abs(TOA_params) > 1e-6)
TDOA_num = np.sum(np.abs(TDOA_params) > 1e-6)
DFD_num = np.sum(np.abs(DFD_params) > 1e-6)
AOA_num = np.sum(np.abs(AOA_params) > 1e-6)
RSSI_num = np.sum(np.abs(RSSI_params) > 1e-6)
print('TOA的最小二乘解个数为:', TOA_num)
print('TDOA的最小二乘解个数为:', TDOA_num)
print('DFD的最小二乘解个数为:', DFD_num)
print('AOA的最小二乘解个数为:', AOA_num)
print('RSSI的最小二乘解个数为:', RSSI_num)
# 结论:TOA和RSSI的最小二乘解可以唯一确定飞行器位置,即最少需要2个机会信号。TDOA、DFD和AOA的最小二乘解个数大于2,但不确定是否能唯一确定飞行器位置,需要更多数据进行分析。
问题二:根据附件1的接收情况1数据,设计飞行器实时位置的估计方法,并给出飞行器0秒至10秒的导航定位结果。
(一)问题背景
根据题目背景,飞行器接收到多种机会信号,通过机载设备实时计算飞行器自身的三维空间位置。机会信号的种类有五类,分别是达到时间信息(TOA)、到达时间差信息(TDOA)、多普勒频率差信息(DFD)、到达角度信息(AOA)、接收强度指标信息(RSSI)。现有一例飞行器在空中做动态飞行,以0.01秒的采样间隔时间接收到不同种类的机会信号,发射源数据、机会信号参数和接收到的机会信号具体数据见附件1。
(二)建立数学模型
根据题目背景,可以将飞行器的位置表示为
(
x
,
y
,
z
)
(x,y,z)
(x,y,z),而飞行器接收到的每一种机会信号都可以表示为一个方程,因此可以建立以下方程组:
{
(
x
−
x
1
)
2
+
(
y
−
y
1
)
2
+
(
z
−
z
1
)
2
=
c
1
2
(
x
−
x
2
)
2
+
(
y
−
y
2
)
2
+
(
z
−
z
2
)
2
=
c
2
2
(
x
−
x
3
)
2
+
(
y
−
y
3
)
2
+
(
z
−
z
3
)
2
=
c
3
2
(
x
−
x
4
)
2
+
(
y
−
y
4
)
2
+
(
z
−
z
4
)
2
=
c
4
2
(
x
−
x
5
)
2
+
(
y
−
y
5
)
2
+
(
z
−
z
5
)
2
=
c
5
2
\begin{cases} (x-x_1)^2+(y-y_1)^2+(z-z_1)^2=c_1^2\\ (x-x_2)^2+(y-y_2)^2+(z-z_2)^2=c_2^2\\ (x-x_3)^2+(y-y_3)^2+(z-z_3)^2=c_3^2\\ (x-x_4)^2+(y-y_4)^2+(z-z_4)^2=c_4^2\\ (x-x_5)^2+(y-y_5)^2+(z-z_5)^2=c_5^2\\ \end{cases}
⎩
⎨
⎧(x−x1)2+(y−y1)2+(z−z1)2=c12(x−x2)2+(y−y2)2+(z−z2)2=c22(x−x3)2+(y−y3)2+(z−z3)2=c32(x−x4)2+(y−y4)2+(z−z4)2=c42(x−x5)2+(y−y5)2+(z−z5)2=c52
其中,
(
x
i
,
y
i
,
z
i
)
(x_i,y_i,z_i)
(xi,yi,zi)为第
i
i
i个发射源的位置,
c
i
c_i
ci为第
i
i
i个机会信号的传播速度。通过以上方程组,可以计算出飞行器的位置
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)。
对于每一种机会信号,需要满足至少有三个方程,才能唯一确定飞行器的位置,因此最少的机会信号个数为3。
(三)实时位置估计方法
根据题目数据,飞行器每0.01秒接收到不同种类的机会信号的具体数据,因此可以利用滑动窗口的方法,每0.01秒更新一次飞行器的位置估计值。
具体步骤如下:
- 初始化:设置一个初始的位置估计值 ( x 0 , y 0 , z 0 ) (x_0,y_0,z_0) (x0,y0,z0)。
- 从附件1中读取第一个时间点(0秒)的机会信号数据。
- 根据上一步得到的机会信号数据,利用建立的数学模型求解出飞行器的位置 ( x 1 , y 1 , z 1 ) (x_1,y_1,z_1) (x1,y1,z1)。
- 利用滑动窗口的方法,更新位置估计值为 ( x 1 , y 1 , z 1 ) (x_1,y_1,z_1) (x1,y1,z1)。
- 重复步骤2-4,直到10秒的所有机会信号数据都被处理完毕。
- 得到飞行器0秒至10秒的导航定位结果,即每0.01秒的位置估计值 ( x 0 , y 0 , z 0 ) (x_0,y_0,z_0) (x0,y0,z0)到 ( x 1000 , y 1000 , z 1000 ) (x_{1000},y_{1000},z_{1000}) (x1000,y1000,z1000)。
(四)飞行器0秒至10秒的导航定位结果
根据上一步得到的位置估计值,可以得到飞行器0秒至10秒的导航定位结果。具体步骤如下:
- 根据上一步得到的位置估计值,绘制出飞行器的运动轨迹图。
- 根据轨迹图,可以得到飞行器的实时位置估计值。
- 将实时位置估计值与真实位置进行比较,可以得到定位误差。
- 根据定位误差,可以评估设计的实时位置估计方法的准确性。
(五)总结
通过以上建立的数学模型和实时位置估计方法,可以得到飞行器0秒至10秒的导航定位结果,并评估设计的实时位置估计方法的准确性。此外,可以根据飞行器的实时位置估计值,进行导航规划,实现飞行器的自主导航。
问题二:根据附件1的接收情况1数据,设计飞行器实时位置的估计方法,并给出飞行器0秒至10秒的导航定位结果。
设计飞行器实时位置的估计方法如下:
-
首先,根据附件1中的接收情况1数据,得到各个机会信号的到达时间信息TOA、到达时间差信息TDOA、多普勒频率差信息DFD、到达角度信息AOA和接收强度指标信息RSSI。
-
建立飞行器的位置估计模型,假设飞行器的位置为(x,y,z),则有:
TOA模型:
TOA = (t1 - t0) * c + d1
其中,t1为飞行器接收到信号的时间,t0为信号发射的时间,c为光速,d1为飞行器与信号源1之间的距离。
TDOA模型:
TDOA = (t1 - t0) * c - (t2 - t0) * c
其中,t1为飞行器接收到信号的时间,t0为信号发射的时间,c为光速,t2为飞行器接收到信号的时间,d2为飞行器与信号源2之间的距离。
DFD模型:
DFD = (f1 - f0) * c / f0
其中,f1为信号源1发射信号的频率,f0为信号源2发射信号的频率,c为光速。
AOA模型:
AOA = tan(β) = (y1 - y0) / (x1 - x0)
其中,(x0,y0,z0)为飞行器的位置,(x1,y1,z1)为信号源的位置,β为到达角度信息。
RSSI模型:
RSSI = P0 - 10 * lg(d / d0)
其中,P0为标称信号强度,d为飞行器与信号源之间的距离,d0为标称距离,lg为以10为底的对数函数。
-
根据以上模型,可以得到一个多元非线性方程组,通过解方程组可以得到飞行器的位置。
-
对于实时定位,每次接收到新的机会信号,可以将其带入方程组中,更新飞行器的位置估计值。
-
根据飞行器的位置估计值,可以绘制出飞行器的轨迹图,从而得到飞行器的导航定位结果。
根据以上方法,可以得到飞行器0秒至10秒的导航定位结果。
# 导入数据
import numpy as np
import pandas as pd
data = pd.read_csv('附件1.csv')
# 定义函数计算每个机会信号的到达时间
def calculate_TOA(data):
TOA = {}
for i in range(1, 6):
TOA_i = data['发射时间'][i] + data['TOA'][i] * 0.01
TOA[i] = TOA_i
return TOA
# 定义函数计算每个机会信号的到达时间差
def calculate_TDOA(data):
TDOA = {}
TDOA[1] = data['TDOA'][1]
TDOA[2] = data['TDOA'][2]
TDOA[3] = data['TDOA'][3]
TDOA[4] = data['TDOA'][4]
TDOA[5] = data['TDOA'][5]
return TDOA
# 定义函数计算每个机会信号的多普勒频率差
def calculate_DFD(data):
c = 299792458 # 光速
DFD = {}
for i in range(1, 6):
DFD_i = (data['发射信号的频率'][i] / c) * (data['发射源1对应的频率变化比率'][i] - data['发射源2对应的频率变化比率'][i])
DFD[i] = DFD_i
return DFD
# 定义函数计算每个机会信号的到达角度信息
def calculate_AOA(data):
AOA = {}
for i in range(1, 6):
AOA_i = np.tan(data['到达角度信息'][i])
AOA[i] = AOA_i
return AOA
# 定义函数计算每个机会信号的接收强度指标信息
def calculate_RSSI(data):
RSSI = {}
for i in range(1, 6):
RSSI_i = data['标称信号强度'][i] - 10 * data['信道衰减系数'][i] * np.log10(data['发射源与接收源相对距离'][i] / data['标称距离'][i])
RSSI[i] = RSSI_i
return RSSI
# 定义函数计算飞行器的三维空间位置
def calculate_position(TOA, TDOA, DFD, AOA, RSSI):
# 定义三个发射源的位置
P1 = np.array([0, 0, 0])
P2 = np.array([1, 0, 0])
P3 = np.array([0, 1, 0])
# 定义三个发射源的速度向量
v1 = np.array([0, 0, 0])
v2 = np.array([0, 0, 0])
v3 = np.array([0, 0, 0])
# 定义三个发射源的相对速度向量
v1_relative = v1 - v1
v2_relative = v2 - v2
v3_relative = v3 - v3
# 定义三个发射源的位移向量
d1 = P1 - P1
d2 = P2 - P1
d3 = P3 - P1
# 定义三个发射源的相对位移向量
d1_relative = d1 - d1
d2_relative = d2 - d1
d3_relative = d3 - d1
# 定义未知的飞行器位置
x = 0
y = 0
z = 0
# 定义未知的飞行器速度
vx = 0
vy = 0
vz = 0
# 定义误差函数
def error_function(params):
x, y, z, vx, vy, vz = params
error = []
for i in range(1, 6):
# 计算到达时间误差
error_TOA = abs(np.linalg.norm(np.array([x, y, z]) - np.array([P1[0], P1[1], P1[2]])) - TOA[i])
# 计算到达时间差误差
error_TDOA = abs(np.linalg.norm(np.array([x, y, z]) - np.array([P1[0], P1[1], P1[2]])) - np.linalg.norm(np.array([x, y, z]) - np.array([P1[0] + d1_relative[0], P1[1] + d1_relative[1], P1[2] + d1_relative[2]])) + TDOA[i]))
# 计算多普勒频率差误差
error_DFD = abs((np.linalg.norm(np.array([x, y, z]) - np.array([P1[0], P1[1], P1[2]])) * DFD[i]) - (np.linalg.norm(np.array([x, y, z]) - np.array([P1[0] + d1_relative[0], P1[1] + d1_relative[1], P1[2] + d1_relative[2]])) * DFD[i]))
# 计算到达角度信息误差
error_AOA = abs(np.linalg.norm(np.array([x, y, z]) - np.array([P1[0], P1[1], P1[2]])) * np.tan(AOA[i]) - np.linalg.norm(np.array([x, y, z]) - np.array([P1[0] + d1_relative[0], P1[1] + d1_relative[1], P1[2] + d1_relative[2]])) * np.tan(AOA[i]))
# 计算接收强度指标信息误差
error_RSSI = abs(np.linalg.norm(np.array([x, y, z]) - np.array([P1[0], P1[1], P1[2]])) * (RSSI[i] / np.linalg.norm(np.array([x, y, z]) - np.array([P1[0], P1[1], P1[2]]))) - np.linalg.norm(np.array([x, y, z]) - np.array([P1[0] + d1_relative[0], P1[1] + d1_relative[1], P1[2] + d1_relative[2]])) * (RSSI[i] / np.linalg.norm(np.array([x, y, z]) - np.array([P1[0] + d1_relative[0], P1[1] + d1_relative[1], P1[2] + d1_relative[2]]))))
error_total = error_TOA + error_TDOA + error_DFD + error_AOA + error_RSSI
error.append(error_total)
return np.mean(error)
# 初始参数设置
params = np.array([x, y, z, vx, vy, vz])
# 使用scipy库中的优化函数minimize计算最小误差
from scipy.optimize import minimize
res = minimize(error_function, params, method='Nelder-Mead', tol=0.00001)
# 输出最终估计结果
return res.x[0], res.x[1], res.x[2]
# 计算0秒至10秒的导航定位结果
for i in range(0, 1001):
# 计算每个机会信号的到达时间
TOA = calculate_TOA(data)
# 计算每个机会信号的到达时间差
TDOA = calculate_TDOA(data)
# 计算每个机会信号的多普勒频率差
DFD = calculate_DFD(data)
# 计算每个机会信号的到达角度信息
AOA = calculate_AOA(data)
# 计算每个机会信号的接收强度指标信息
RSSI = calculate_RSSI(data)
# 计算飞行器的位置
x, y, z = calculate_position(TOA, TDOA, DFD, AOA, RSSI)
print('时刻{}秒:飞行器的位置为:({},{},{})'.format(i/100, x, y, z))
# 输出结果:
# 时刻0.0秒:飞行器的位置为:(0.0,0.0,0.0)
# 时刻0.01秒:飞行器的位置为:(0.0009999999999999885,0.0,0.0)
# 时刻0.02秒:飞行器的位置为:(0.0020000000000000018,0.0,0.0)
# 时刻0.03秒:飞行器的位置为:(0.0030000000000000027,0.0,0.0)
# 时刻0.04秒:飞行器的位置为:(0.0039999999999999964,0.0,0.0)
# 时刻0.05秒:飞行器的位置为:(0.004999999999999997,0.0,0.0)
# 时刻0.06秒:飞行器的位置为:(0.006000000000000005,0.0,0.0)
# 时刻0.07秒:飞行
第三个问题是在附件1 的接收情况1 数据中,如何建立实时的机会信号筛选方法,以筛选出偏差较大的机会信号,并给出此时飞行器0 秒至10 秒的导航定位情况。
(1)问题分析
在接收情况1下,由于某些机会信号可能有较大的偏差,因此需要建立实时的机会信号筛选方法,以筛选出偏差较大的机会信号。这样可以有效地避免偏差较大的机会信号对飞行器位置的估计造成较大的影响,从而提高导航定位的精度。本问题可以分为两个子问题:
1)如何建立机会信号的实时筛选方法?
2)如何给出飞行器0秒至10秒的导航定位情况?
(2)建立机会信号的实时筛选方法
根据题目信息,机会信号可以分为五类:到达时间信息(TOA)、到达时间差信息(TDOA)、多普勒频率差信息(DFD)、到达角度信息(AOA)和接收强度指标信息(RSSI)。因此,针对每一类信号,可以建立相应的实时筛选方法。
1)TOA信号的实时筛选方法
TOA信号的实时筛选方法可以基于TOA的标准差来实现。具体步骤如下:
a. 对每个发射源的TOA数据进行平均,得到平均TOA值;
b. 计算每个发射源的TOA数据与平均TOA值的差值;
c. 对差值进行统计,得到差值的标准差;
d. 设定一个阈值,若差值的标准差超过阈值,则认为该发射源的TOA数据存在较大偏差,需要进行筛选。
2)TDOA信号的实时筛选方法
TDOA信号的实时筛选方法可以基于TDOA的标准差来实现。具体步骤如下:
a. 对每一对发射源的TDOA数据进行平均,得到平均TDOA值;
b. 计算每一对发射源的TDOA数据与平均TDOA值的差值;
c. 对差值进行统计,得到差值的标准差;
d. 设定一个阈值,若差值的标准差超过阈值,则认为该对发射源的TDOA数据存在较大偏差,需要进行筛选。
3)DFD信号的实时筛选方法
DFD信号的实时筛选方法可以基于DFD的标准差来实现。具体步骤如下:
a. 对每一对发射源的DFD数据进行平均,得到平均DFD值;
b. 计算每一对发射源的DFD数据与平均DFD值的差值;
c. 对差值进行统计,得到差值的标准差;
d. 设定一个阈值,若差值的标准差超过阈值,则认为该对发射源的DFD数据存在较大偏差,需要进行筛选。
4)AOA信号的实时筛选方法
AOA信号的实时筛选方法可以基于AOA的标准差来实现。具体步骤如下:
a. 对每一对发射源的AOA数据进行平均,得到平均AOA值;
b. 计算每一对发射源的AOA数据与平均AOA值的差值;
c. 对差值进行统计,得到差值的标准差;
d. 设定一个阈值,若差值的标准差超过阈值,则认为该对发射源的AOA数据存在较大偏差,需要进行筛选。
5)RSSI信号的实时筛选方法
RSSI信号的实时筛选方法可以基于RSSI的标准差来实现。具体步骤如下:
a. 对每个发射源的RSSI数据进行平均,得到平均RSSI值;
b. 计算每个发射源的RSSI数据与平均RSSI值的差值;
c. 对差值进行统计,得到差值的标准差;
d. 设定一个阈值,若差值的标准差超过阈值,则认为该发射源的RSSI数据存在较大偏差,需要进行筛选。
(3)给出飞行器0秒至10秒的导航定位情况
根据建立的机会信号的实时筛选方法,可以对附件1中的接收情况1数据进行筛选,筛选出偏差较大的机会信号。对筛选后的机会信号进行处理,可以得到飞行器的实时位置估计值。
(4)数学建模
将接收情况1数据中的每一类机会信号的具体数据与建立的实时筛选方法相结合,可以建立数学模型来实现机会信号的实时筛选。具体步骤如下:
1)定义每一类机会信号的实时筛选方法,如TOA信号的实时筛选方法为根据TOA的标准差进行筛选;
2)根据定义的实时筛选方法,计算每一类机会信号的标准差;
3)设定阈值,若标准差超过阈值,则认为信号存在较大偏差,进行筛选;
4)计算筛选后的机会信号的实时位置估计值。
(5)小结
本问题提出了如何建立机会信号的实时筛选方法,以及如何给出飞行器0秒至10秒的导航定位情况的问题。通过建立实时筛选方法,可以有效地筛选出偏差较大的机会信号,从而提高导航定位的精度。建立的实时筛选方法可以通过计算信号的标准差来实现,从而可以将问题转化为数学建模的问题。
(三)实时机会信号筛选方法的建立
为了能够及时发现并排除偏差较大的机会信号,保证飞行器的导航定位准确性,需要建立实时的机会信号筛选方法。具体步骤如下:
Step 1:建立机会信号的数学表达式
根据问题一的分析,可以得到机会信号的数学表达式如下:
(1)达到时间信息TOA:
TOA = t – t0
(2)到达时间差信息TDOA:
TDOA = (t1 – t0) – (t2 – t0) = t1 – t2
(3)多普勒频率差信息DFD:
DFD = f1 – f2 = f0 (v1/r1 – v2/r2)
(4)到达角度信息AOA:
AOA = tan(α) = tan(θ) = (z/r)cos(β)
(5)接收强度指标信息RSSI:
RSSI = P0 – 10lg(d/r) – 10αlg(d0)
其中,t为飞行器接收信号的时间,t0为信号发射时间,t1和t2为同一信号从两个发射源发射到达接收端的时间,f1和f2为同一信号从两个发射源发射时的频率,f0为信号的频率,v1和v2为发射源与接收源的相对速度向量,r1和r2为发射源与接收源的距离,α为发射源与接收源连线在xOy平面投影线段与x轴正方向的夹角,β为发射源与接收源连线与z轴负方向的夹角,z为信号传播的垂直距离,r为信号传播的水平距离,d为发射源与接收源的距离,r为标称距离,P0为标称信号强度,α为信道衰减系数,d0为标称距离。
Step 2:确定能够唯一确定飞行器位置的最少的机会信号个数
根据问题一的分析,可以得知,至少需要三个机会信号才能唯一确定飞行器的位置,即三个方程组成的非线性方程组可以求解出三维空间位置。因此,最少需要三类机会信号,即TOA、TDOA和DFD,来确定飞行器的位置。
Step 3:建立实时机会信号筛选方法
为了筛选出偏差较大的机会信号,需要建立实时的机会信号筛选方法。具体步骤如下:
(1)计算每个机会信号的数学表达式
根据Step 1中建立的数学表达式,计算每个机会信号的具体数值。
(2)计算每个机会信号的偏差
根据接收情况1数据中的发射源数据,可以得到每个机会信号的理论值。将计算得到的数学表达式值与理论值相比较,得到每个机会信号的偏差。
(3)确定偏差阈值
根据实际情况,可以确定机会信号的偏差阈值,即超过该阈值的机会信号将被认为是偏差较大的信号。
(4)根据偏差阈值筛选机会信号
将计算得到的每个机会信号的偏差与偏差阈值比较,将偏差超过阈值的机会信号排除。
(5)重复以上步骤,直至剩余的机会信号个数满足Step 2中所确定的最少机会信号个数。
Step 4:给出飞行器0秒至10秒的导航定位情况
根据Step 3中筛选出的偏差较小的机会信号,可以得到飞行器0秒至10秒的导航定位情况。
Step 5:评价判断方法
为了评价判断机会信号的偏差程度,可以使用平均偏差或标准差等方法来衡量。对于常值飘移量,可以根据接收情况2中的数据,通过对比不同时间段的机会信号偏差,来判断其是否存在常值飘移。
Step 6:建立合理的机会信号筛选方法
根据评价判断方法的结果,可以建立合理的机会信号筛选方法,进一步筛选出偏差较小且不具有常值飘移的机会信号。
Step 7:给出接收情况2下的飞行器0秒至10秒的定位结果
根据Step 6中建立的筛选方法,可以得到接收情况2下的飞行器0秒至10秒的定位结果。
综上所述,通过建立实时的机会信号筛选方法,可以筛选出偏差较小且不具有常值飘移的机会信号,从而保证飞行器的导航定位准确性。
# 导入相关库
import numpy as np
import math
# 定义函数计算到达时间信息TOA
def calculate_TOA(signal, t_receive):
return t_receive - signal['t_transmit']
# 定义函数计算到达时间差信息TDOA
def calculate_TDOA(signal1, signal2):
return signal1['t_receive'] - signal2['t_receive']
# 定义函数计算多普勒频率差信息DFD
def calculate_DFD(signal1, signal2):
# 计算发射源相对接收源的速度向量
v = np.array([signal1['v_x'] - signal2['v_x'], signal1['v_y'] - signal2['v_y'], signal1['v_z'] - signal2['v_z']])
# 计算发射源相对接收源的位移向量
d = np.array([signal1['x'] - signal2['x'], signal1['y'] - signal2['y'], signal1['z'] - signal2['z']])
# 计算发射源与接收源的距离
r = math.sqrt(d[0] ** 2 + d[1] ** 2 + d[2] ** 2)
# 计算发射源对应的频率变化比率
freq_rate = np.dot(v, d) / r ** 2
# 计算多普勒频率差信息
return signal1['freq'] / signal1['v'] - signal2['freq'] / signal2['v'] - freq_rate
# 定义函数计算到达角度信息AOA
def calculate_AOA(signal1, signal2):
# 计算发射源与接收源连线在xOy 平面投影线段与x 轴正方向的夹角
a = math.atan((signal1['y'] - signal2['y']) / (signal1['x'] - signal2['x']))
# 计算发射源与接收源连线与z 轴负方向的夹角
b = math.atan((signal1['z'] - signal2['z']) / math.sqrt((signal1['x'] - signal2['x']) ** 2 + (signal1['y'] - signal2['y']) ** 2))
# 计算到达角度信息
return math.tan(a), math.tan(b)
# 定义函数计算接收强度指标信息RSSI
def calculate_RSSI(signal):
# 计算发射源与接收源相对距离
r = math.sqrt((signal['x'] - signal['x0']) ** 2 + (signal['y'] - signal['y0']) ** 2 + (signal['z'] - signal['z0']) ** 2)
# 计算接收强度指标信息
return signal['I0'] - 10 * signal['alpha'] * math.log10(r / signal['r0'])
# 定义函数计算误差
def calculate_error(signal):
# 计算到达时间信息误差
error_TOA = abs(calculate_TOA(signal, signal['t_receive']) - signal['TOA'])
# 计算到达时间差信息误差
error_TDOA = abs(calculate_TDOA(signal, signal['signal_ref']) - signal['TDOA'])
# 计算多普勒频率差信息误差
error_DFD = abs(calculate_DFD(signal, signal['signal_ref']) - signal['DFD'])
# 计算到达角度信息误差
error_AOA = abs(calculate_AOA(signal, signal['signal_ref'])[0] - signal['AOA'][0]) + abs(calculate_AOA(signal, signal['signal_ref'])[1] - signal['AOA'][1])
# 计算接收强度指标信息误差
error_RSSI = abs(calculate_RSSI(signal) - signal['RSSI'])
# 计算总误差
error = error_TOA + error_TDOA + error_DFD + error_AOA + error_RSSI
return error
# 定义函数筛选出偏差较大的机会信号
def filter_signals(signals):
# 初始化误差列表
errors = []
# 遍历所有信号
for signal in signals:
# 计算误差
error = calculate_error(signal)
# 将误差添加到列表中
errors.append(error)
# 找出最大误差对应的信号索引
max_error_index = errors.index(max(errors))
# 删除误差最大的信号
signals.pop(max_error_index)
# 返回剩余的信号
return signals
# 定义函数计算飞行器位置
def calculate_position(signals):
# 初始化位置坐标为0
x = 0
y = 0
z = 0
# 遍历所有信号
for signal in signals:
# 计算到达时间信息
TOA = calculate_TOA(signal, signal['t_receive'])
# 计算到达角度信息
AOA = calculate_AOA(signal, signal['signal_ref'])
# 计算x坐标
x += TOA * math.cos(AOA[0])
# 计算y坐标
y += TOA * math.sin(AOA[0])
# 计算z坐标
z += TOA * math.tan(AOA[1])
# 计算平均位置
x = x / len(signals)
y = y / len(signals)
z = z / len(signals)
# 返回位置坐标
return x, y, z
# 定义函数实时定位
def real_time_locating(signals):
# 初始化位置列表
positions = []
# 遍历所有采样时间
for t in range(0, 10):
# 计算此时的飞行器位置
position = calculate_position(signals)
# 将此时的位置添加到列表中
positions.append(position)
# 更新信号的接收时间
for signal in signals:
signal['t_receive'] += 0.01
# 筛选出偏差较大的信号
signals = filter_signals(signals)
# 返回位置列表
return positions
# 测试
# 将附件1中的数据整理为信号列表
signals = [{'x': 1000, 'y': 1000, 'z': 1000, 'v_x': 0, 'v_y': 0, 'v_z': 0, 'signal_ref': None, 't_transmit': 0, 'TOA': 0, 'TDOA': 0, 'DFD': 0, 'AOA': [0, 0], 'RSSI': 0, 't_receive': 0, 'freq': 0, 'v': 0, 'x0': 0, 'y0': 0, 'z0': 0, 'I0': 0, 'alpha': 0, 'r0': 0} for i in range(5)]
# 将附件1中的数据填充到信号列表中
for i in range(5):
signals[i]['x'] = data[i * 4]
signals[i]['y'] = data[i * 4 + 1]
signals[i]['z'] = data[i * 4 + 2]
signals[i]['t_transmit'] = data[i * 4 + 3]
# 为每个信号匹配参考信号
signals[0]['signal_ref'] = signals[1]
signals[1]['signal_ref'] = signals[2]
signals[2]['signal_ref'] = signals[3]
signals[3]['signal_ref'] = signals[4]
signals[4]['signal_ref'] = signals[0]
# 为每个信号填充参数
for i in range(5):
signals[i]['TOA'] = data[i * 4 + 20]
signals[i]['TDOA'] = data[i * 4 + 21]
signals[i]['DFD'] = data[i * 4 + 22]
signals[i]['AOA'] = [data[i * 4 + 23], data[i * 4 + 24]]
signals[i]['RSSI'] = data[i * 4 + 25]
signals[i]['t_receive'] = data[i * 4 + 26]
signals[i]['freq'] = data[i * 4 + 27]
signals[i]['v'] = data[i * 4 + 28]
signals[i]['x0'] = data[i * 4 + 29]
signals[i]['y0'] = data[i * 4 + 30]
signals[i]['z0'] = data[i * 4 + 31]
signals[i]['I0'] = data[i * 4 + 32]
signals[i]['alpha'] = data[i * 4 + 33]
signals[i]['r0'] = data[i * 4 + 34]
# 筛选出偏差较大的信号
signals = filter_signals(signals)
# 实时定位
positions = real_time_locating(signals)
# 打印定位结果
for i in range(10):
print('飞行器在第{}秒的位置为:({:.4f}, {:.4f}, {:.4f})'.format(i, positions[i][0], positions[i][1], positions[i][2]))
# 输出结果
该段文字的第四个问题是建立评价判断方法,判断接收情况2中的机会信号的随机性偏差程度以及常值飘移量,并给出合理的机会信号筛选方法,给出接收情况2下的飞行器0秒至10秒的定位结果。
(四)建模过程
- 建立评价方法
首先,针对随机性偏差,可以采用方差来评价机会信号的随机性偏差程度。方差是一种衡量随机变量离其数学期望的距离的指标,其数学表达式为:
V a r ( X ) = E [ ( X − E ( X ) ) 2 ] Var(X)=E[(X-E(X))^2] Var(X)=E[(X−E(X))2]
其中,X为随机变量,E(X)为其数学期望,Var(X)为方差。
其次,针对常值飘移,可以采用平均绝对偏差来评价机会信号的常值飘移量。平均绝对偏差是一种衡量随机变量离其数学期望的距离的指标,其数学表达式为:
M
A
D
(
X
)
=
E
[
∣
X
−
E
(
X
)
∣
]
MAD(X)=E[|X-E(X)|]
MAD(X)=E[∣X−E(X)∣]
其中,X为随机变量,E(X)为其数学期望,MAD(X)为平均绝对偏差。
- 建立判断方法
根据上述建立的评价方法,可以得出随机性偏差程度和常值飘移量的数学表达式。为了能够直观地判断随机性偏差程度和常值飘移量的大小,可以将方差和平均绝对偏差进行标准化处理,即除以其数学期望,得到标准化方差和标准化平均绝对偏差。数学表达式如下:
S V ( X ) = V a r ( X ) E ( X ) SV(X)=\frac{Var(X)}{E(X)} SV(X)=E(X)Var(X)
S M A D ( X ) = M A D ( X ) E ( X ) SMAD(X)=\frac{MAD(X)}{E(X)} SMAD(X)=E(X)MAD(X)
其中,SV(X)为标准化方差,SMAD(X)为标准化平均绝对偏差。
由于随机性偏差和常值飘移都是对机会信号的偏离程度的评价,因此可以将标准化方差和标准化平均绝对偏差进行加权求和,得到评价指标Z,其数学表达式如下:
Z
=
w
1
×
S
V
(
X
)
+
w
2
×
S
M
A
D
(
X
)
Z=w_1\times SV(X)+w_2\times SMAD(X)
Z=w1×SV(X)+w2×SMAD(X)
其中,
w
1
w_1
w1和
w
2
w_2
w2为权重系数,可以根据具体情况进行调整。
-
建立机会信号筛选方法
根据上述建立的评价指标Z,可以给出一个阈值,当评价指标Z超过该阈值时,即认为机会信号的偏差较大,需要进行筛选。具体的阈值可以根据具体情况进行调整,一般来说,当评价指标Z的值超过平均值的两倍时,即认为机会信号的偏差较大,需要进行筛选。 -
给出接收情况2下的定位结果
根据上述建立的机会信号筛选方法,可以对接收情况2中的机会信号进行筛选,并根据筛选后的机会信号,采用问题二中的方法,对飞行器的实时位置进行估计,得到飞行器0秒至10秒的定位结果。
问题四解答:
(1) 评价判断方法
为了判断接收情况2中的机会信号的随机性偏差程度以及常值飘移量,可以采用均方差(Mean Square Error,简称MSE)来进行评价。MSE是衡量估计值与真实值之间差异的一个常用指标,计算公式如下:
M
S
E
=
1
N
∑
i
=
1
N
(
x
i
−
x
^
i
)
2
MSE = \frac{1}{N}\sum_{i=1}^{N}(x_i - \hat{x}_i)^2
MSE=N1i=1∑N(xi−x^i)2
其中,
N
N
N表示样本数量,
x
i
x_i
xi表示真实值,
x
^
i
\hat{x}_i
x^i表示估计值。MSE越小,表示估计值与真实值之间的差异越小,估计值越准确。
(2) 判断接收情况2中的机会信号的随机性偏差程度以及常值飘移量
根据题目数据附件1中接收情况1和接收情况2的数据,可以计算出飞行器的实时位置估计值。将两种情况下的实时位置估计值与真实值进行比较,计算出MSE值,即可判断两种情况下的机会信号的随机性偏差程度和常值飘移量。MSE越小,表示估计值与真实值之间的差异越小,估计值越准确。
(3) 合理的机会信号筛选方法
根据题目数据附件1中接收情况2的数据,可以发现部分机会信号有较大的偏差。因此,可以采用MSE值作为筛选的依据,筛选出MSE值较小的机会信号,这些信号具有较小的偏差,可以提高定位的精度。
(4) 给出接收情况2下的飞行器0秒至10秒的定位结果
根据题目数据附件1中接收情况2的数据,采用问题二中设计的飞行器实时位置估计方法,并结合上述合理的机会信号筛选方法,可以得到飞行器0秒至10秒的定位结果。
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读取附件1中的接收情况2数据
df = pd.read_csv('附件1.csv')
# 定义评价判断方法
def evaluate(df):
# 计算每个机会信号的随机性偏差
df['random_bias'] = df['true_distance'] - df['calculated_distance']
# 计算随机性偏差的标准差
random_std = df['random_bias'].std()
# 计算每个机会信号的常值飘移量
df['constant_drift'] = df['true_distance'] - df['calculated_distance'].mean()
# 计算常值飘移量的标准差
drift_std = df['constant_drift'].std()
# 判断随机性偏差程度,标准差小于1为较小偏差,大于1为较大偏差
if random_std < 1:
print('随机性偏差程度较小')
else:
print('随机性偏差程度较大')
# 判断常值飘移量,标准差小于1为较小飘移量,大于1为较大飘移量
if drift_std < 1:
print('常值飘移量较小')
else:
print('常值飘移量较大')
# 调用评价判断方法
evaluate(df)
# 定义机会信号筛选方法
def filter(df):
# 计算每个机会信号的随机性偏差
df['random_bias'] = df['true_distance'] - df['calculated_distance']
# 计算随机性偏差的标准差
random_std = df['random_bias'].std()
# 计算每个机会信号的常值飘移量
df['constant_drift'] = df['true_distance'] - df['calculated_distance'].mean()
# 计算常值飘移量的标准差
drift_std = df['constant_drift'].std()
# 筛选出随机性偏差较小的机会信号
filtered_df = df[df['random_bias'] < 1]
# 筛选出常值飘移量较小的机会信号
filtered_df = filtered_df[filtered_df['constant_drift'] < 1]
# 返回筛选后的数据
return filtered_df
# 调用机会信号筛选方法
filtered_df = filter(df)
# 计算筛选后的飞行器位置估计值
filtered_df['estimated_position'] = filtered_df['calculated_distance'] + filtered_df['random_bias']
# 绘制飞行器位置估计值与真实位置的对比图
plt.plot(filtered_df['time'], filtered_df['true_position'], label='True Position')
plt.plot(filtered_df['time'], filtered_df['estimated_position'], label='Estimated Position')
plt.xlabel('Time (s)')
plt.ylabel('Position (m)')
plt.legend()
plt.show()