第九届“数维杯”大学生数学建模挑战赛(A题)深度剖析|建模完整过程+详细思路+代码全解析

问题1

根据题目信息,可以将机会信号分为五类,分别是达到时间信息(TOA)、到达时间差信息(TDOA)、多普勒频率差信息(DFD)、到达角度信息(AOA)和接收强度指标信息(RSSI)。每一类机会信号都可以用数学表达式来表示,通过建立数学模型,可以推导出每一类信号所需的最少信号个数。

(1)达到时间信息 TOA:
根据题目信息,信号传输时间可以表示为: T = T O A = T 0 + L c T=TOA=T_{0}+\frac{L}{c} T=TOA=T0+cL,其中 T 0 T_{0} T0 为信号发射时间,L为信号传播距离,c为信号传播速度。
设飞行器位置为 ( x 0 , y 0 , z 0 ) (x_{0},y_{0},z_{0}) (x0,y0,z0),发射源位置为 ( x 1 , y 1 , z 1 ) (x_{1},y_{1},z_{1}) (x1,y1,z1),接收时间为 t 0 t_{0} t0,则有:

T 0 = t 0 − ( x 0 − x 1 ) 2 + ( y 0 − y 1 ) 2 + ( z 0 − z 1 ) 2 T_{0}=t_{0}-\sqrt{(x_{0}-x_{1})^{2}+(y_{0}-y_{1})^{2}+(z_{0}-z_{1})^{2}} T0=t0(x0x1)2+(y0y1)2+(z0z1)2

信号传播距离L为:

L = ( x 0 − x 1 ) 2 + ( y 0 − y 1 ) 2 + ( z 0 − z 1 ) 2 L=\sqrt{(x_{0}-x_{1})^{2}+(y_{0}-y_{1})^{2}+(z_{0}-z_{1})^{2}} L=(x0x1)2+(y0y1)2+(z0z1)2

因此,达到时间信息TOA可以表示为:

T O A = t 0 − 1 c ( x 0 − x 1 ) 2 + ( y 0 − y 1 ) 2 + ( z 0 − z 1 ) 2 TOA=t_{0}-\frac{1}{c}\sqrt{(x_{0}-x_{1})^{2}+(y_{0}-y_{1})^{2}+(z_{0}-z_{1})^{2}} TOA=t0c1(x0x1)2+(y0y1)2+(z0z1)2

(2)到达时间差信息 TDOA:
同一信号从两个发射源(同时发射)到达接收端的时间差可以表示为:

t 1 − t 2 = L 1 − L 2 c t_{1}-t_{2}=\frac{L_{1}-L_{2}}{c} t1t2=cL1L2

其中, t 1 t_{1} t1 t 2 t_{2} t2分别为信号到达两个发射源的时间, L 1 L_{1} L1 L 2 L_{2} L2分别为信号从发射源到接收端的距离。

设发射源1位置为 ( x 1 , y 1 , z 1 ) (x_{1},y_{1},z_{1}) (x1,y1,z1),发射源2位置为 ( x 2 , y 2 , z 2 ) (x_{2},y_{2},z_{2}) (x2,y2,z2),接收时间为 t 0 t_{0} t0,则有:

t 1 = t 0 − ( x 0 − x 1 ) 2 + ( y 0 − y 1 ) 2 + ( z 0 − z 1 ) 2 t_{1}=t_{0}-\sqrt{(x_{0}-x_{1})^{2}+(y_{0}-y_{1})^{2}+(z_{0}-z_{1})^{2}} t1=t0(x0x1)2+(y0y1)2+(z0z1)2

t 2 = t 0 − ( x 0 − x 2 ) 2 + ( y 0 − y 2 ) 2 + ( z 0 − z 2 ) 2 t_{2}=t_{0}-\sqrt{(x_{0}-x_{2})^{2}+(y_{0}-y_{2})^{2}+(z_{0}-z_{2})^{2}} t2=t0(x0x2)2+(y0y2)2+(z0z2)2

因此,到达时间差信息TDOA可以表示为:

T D O A = ( x 0 − x 1 ) 2 + ( y 0 − y 1 ) 2 + ( z 0 − z 1 ) 2 − ( x 0 − x 2 ) 2 + ( y 0 − y 2 ) 2 + ( z 0 − z 2 ) 2 c TDOA=\frac{\sqrt{(x_{0}-x_{1})^{2}+(y_{0}-y_{1})^{2}+(z_{0}-z_{1})^{2}}-\sqrt{(x_{0}-x_{2})^{2}+(y_{0}-y_{2})^{2}+(z_{0}-z_{2})^{2}}}{c} TDOA=c(x0x1)2+(y0y1)2+(z0z1)2 (x0x2)2+(y0y2)2+(z0z2)2

(3)多普勒频率差信息 DFD:
同一信号从两个发射源发射,由于飞行器与信号源具有相对速度,接收信号会产生频率变化,进而产生信号频率差。根据多普勒效应,有:

Δ f = f 0 c v r \Delta f=\frac{f_{0}}{c}v_{r} Δf=cf0vr

其中, Δ f \Delta f Δf为信号频率差, f 0 f_{0} f0为信号发射频率, c c c为信号传播速度, v r v_{r} vr为飞行器与信号源的相对速度。

设发射源1位置为 ( x 1 , y 1 , z 1 ) (x_{1},y_{1},z_{1}) (x1,y1,z1),发射源2位置为 ( x 2 , y 2 , z 2 ) (x_{2},y_{2},z_{2}) (x2,y2,z2),接收时间为 t 0 t_{0} t0,则有:

f 1 = f 0 + v r 1 c f 0 f_{1}=f_{0}+\frac{v_{r1}}{c}f_{0} f1=f0+cvr1f0

f 2 = f 0 + v r 2 c f 0 f_{2}=f_{0}+\frac{v_{r2}}{c}f_{0} f2=f0+cvr2f0

其中, f 1 f_{1} f1为信号从发射源1发射后的频率, f 2 f_{2} f2为信号从发射源2发射后的频率, v r 1 v_{r1} vr1为飞行器与发射源1的相对速度, v r 2 v_{r2} vr2为飞行器与发射源2的相对速度。

因此,多普勒频率差信息DFD可以表示为:

D F D = f 1 − f 2 f 0 = v r 1 − v r 2 c DFD=\frac{f_{1}-f_{2}}{f_{0}}=\frac{v_{r1}-v_{r2}}{c} DFD=f0f1f2=cvr1vr2

(4)到达角度信息 AOA:
接收源可得到发射源信号的相对角度信息,如图 1 所示(发射源与接收源连线在 xOy 平面投影线段与x 轴正方向的夹角,发射源与接收源连线与 z 轴负方向的夹角β)。为了简化处理,图 1 中的坐标系为地面惯性系,到达角度信息为角度的正切值。
设飞行器位置为 ( x 0 , y 0 , z 0 ) (x_{0},y_{0},z_{0}) (x0,y0,z0),发射源位置为 ( x 1 , y 1 , z 1 ) (x_{1},y_{1},z_{1}) (x1,y1,z1),接收角度为 θ \theta θ,则有:

tan ⁡ θ = z 1 − z 0 ( x 0 − x 1 ) 2 + ( y 0 − y 1 ) 2 \tan \theta=\frac{z_{1}-z_{0}}{\sqrt{(x_{0}-x_{1})^{2}+(y_{0}-y_{1})^{2}}} tanθ=(x0x1)2+(y0y1)2 z1z0

因此,到达角度信息AOA可以表示为:

A O A = z 1 − z 0 ( x 0 − x 1 ) 2 + ( y 0 − y 1 ) 2 AOA=\frac{z_{1}-z_{0}}{\sqrt{(x_{0}-x_{1})^{2}+(y_{0}-y_{1})^{2}}} AOA=(x0x1)2+(y0y1)2 z1z0

(5)接收强度指标信息RSSI:
设信号源发射功率为 P t P_{t} Pt,接收端的接收功率为 P r P_{r} Pr,则接收强度指标信息RSSI可以表示为:

R S S I = 10 log ⁡ 10 P t P r RSSI=10\log_{10}\frac{P_{t}}{P_{r}} RSSI=10log10PrPt

根据机会信号的数学表达式,可以发现,TOA和RSSI信息无法唯一确定飞行器的位置,因为它们都只提供了一维信息(时间和强度)。而TDOA、DFD和AOA信息可以提供二维信息(时间差、频率差和角度差),因此最少需要两个信号来确定飞行器的位置。但是考虑到实际情况中可能存在的偏差,为了保证定位的精确性,使用至少三个信号来确定飞行器位置。

Python示例代码实现:

import numpy as np
import pandas as pd
import math

# 读取附件1中的数据
data = pd.read_csv("附件1.csv")

# 定义机会信号的数学表达式
def TOA(t_r, t_s):
    return t_r - t_s

def TDOA(t_r1, t_s1, t_r2, t_s2):
    return (t_r1 - t_s1) - (t_r2 - t_s2)

def DFD(f_r, f_s):
    return f_r - f_s

def AOA(x, y, x_s, y_s):
    return math.atan((x - x_s) / (y - y_s))

def RSSI(P_s, P_r):
    return P_s / P_r

# 计算飞行器的位置
def calculate_position(data):
    # 初始化位置坐标
    x = 0
    y = 0

    # 计算TDOA,由于需要三个信号,所以从第三个数据开始计算
    for i in range(2, len(data)):
        # 计算TOA
        toa1 = TOA(data.iloc[i,1], data.iloc[i,3])
        toa2 = TOA(data.iloc[i,2], data.iloc[i,4])
        toa3 = TOA(data.iloc[i,3], data.iloc[i,5])

        # 计算TDOA
        tdoa1 = TDOA(data.iloc[i,1], data.iloc[i,3], data.iloc[i,2], data.iloc[i,4])
        tdoa2 = TDOA(data.iloc[i,1], data.iloc[i,3], data.iloc[i,3], data.iloc[i,5])
        tdoa3 = TDOA(data.iloc[i,2], data.iloc[i,4], data.iloc[i,3], data.iloc[i,5])

        # 根据三个TDOA计算位置坐标
        x = (tdoa1 * toa2 * toa3) / (tdoa1 + tdoa2 + tdoa3)
        y = (tdoa2 * toa1 * toa3) / (tdoa1 + tdoa2 + tdoa3)

    return [x, y]

# 调用函数计算位置坐标
position = calculate_position(data)

# 打印结果
print("飞行器位置坐标为:[%.2f, %.2f]" % (position[0], position[1]))

问题2

问题2的模型建立过程:

飞行器实时位置估计模型:
根据题目信息,可以将飞行器的位置估计问题转化为时间序列分析的问题。设飞行器在时刻 t t t的位置为 ( x ( t ) , y ( t ) , z ( t ) ) (x(t),y(t),z(t)) (x(t),y(t),z(t)),则根据题目信息,可以建立如下的时间序列模型:
x ( t ) = f x ( t ) + e x ( t ) x(t) = f_x(t) + e_x(t) x(t)=fx(t)+ex(t)
y ( t ) = f y ( t ) + e y ( t ) y(t) = f_y(t) + e_y(t) y(t)=fy(t)+ey(t)
z ( t ) = f z ( t ) + e z ( t ) z(t) = f_z(t) + e_z(t) z(t)=fz(t)+ez(t)
其中, f x ( t ) , f y ( t ) , f z ( t ) f_x(t),f_y(t),f_z(t) fx(t),fy(t),fz(t)为飞行器的位置函数, e x ( t ) , e y ( t ) , e z ( t ) e_x(t),e_y(t),e_z(t) ex(t),ey(t),ez(t)为误差项。根据题目信息,误差项可以分为随机性偏差和常值飘移两种。因此,可以将误差项表示为:
e x ( t ) = σ x ( t ) + μ x ( t ) e_x(t) = \sigma_x(t) + \mu_x(t) ex(t)=σx(t)+μx(t)
e y ( t ) = σ y ( t ) + μ y ( t ) e_y(t) = \sigma_y(t) + \mu_y(t) ey(t)=σy(t)+μy(t)
e z ( t ) = σ z ( t ) + μ z ( t ) e_z(t) = \sigma_z(t) + \mu_z(t) ez(t)=σz(t)+μz(t)
其中, σ x ( t ) , σ y ( t ) , σ z ( t ) \sigma_x(t),\sigma_y(t),\sigma_z(t) σx(t),σy(t),σz(t)为随机性偏差, μ x ( t ) , μ y ( t ) , μ z ( t ) \mu_x(t),\mu_y(t),\mu_z(t) μx(t),μy(t),μz(t)为常值飘移。根据题目要求,需要建立飞行器实时位置的估计方法,因此可以利用滤波器的方法来对飞行器位置进行估计。

根据题目要求,需要建立飞行器的三维空间位置估计模型,可以使用三角定位法来估计飞行器的位置。假设飞行器位置为 ( x , y , z ) (x,y,z) (x,y,z),发射源 E i E_i Ei的位置为 ( x i , y i , z i ) (x_i,y_i,z_i) (xi,yi,zi),接收源 R R R的位置为 ( x r , y r , z r ) (x_r,y_r,z_r) (xr,yr,zr),则可得到如下方程:
{ ( x − x i ) 2 + ( y − y i ) 2 + ( z − z i ) 2 = ( v T O A i ) 2 ( x − x j ) 2 + ( y − y j ) 2 + ( z − z j ) 2 = ( v T O A j ) 2 \begin{cases} (x-x_i)^2+(y-y_i)^2+(z-z_i)^2 = (vTOA_i)^2\\ (x-x_j)^2+(y-y_j)^2+(z-z_j)^2 = (vTOA_j)^2 \end{cases} {(xxi)2+(yyi)2+(zzi)2=(vTOAi)2(xxj)2+(yyj)2+(zzj)2=(vTOAj)2

求解该方程即可得到飞行器的实时位置。

python示例代码如下:

import numpy as np
import matplotlib.pyplot as plt

# 数据导入
data = np.loadtxt('附件1接收情况1数据.txt')
# 飞行器坐标
x = data[:, 1]
y = data[:, 2]
z = data[:, 3]
# 发射源坐标
xs = data[:, 4]
ys = data[:, 5]
zs = data[:, 6]
# 接收时间
receive_time = data[:, 7]
# 发射时间
transmit_time = data[:, 8]

# 计算信号传输时间
transmission_time = receive_time - transmit_time

# 计算到达角度信息
# 定义角度信息计算函数
def cal_angle(x, y, z, xs, ys, zs):
    dx = x - xs
    dy = y - ys
    dz = z - zs
    angle = np.arctan2(dy, dx)
    return angle

# 计算到达角度信息
angle = cal_angle(x, y, z, xs, ys, zs)

# 定义飞行器位置估计函数
def estimate_position(transmission_time, angle):
    # 速度光速
    c = 3 * 10**8
    # 发射源编号
    n = len(transmission_time)
    # 构建A矩阵
    A = np.zeros((n-1, 4))
    for i in range(n-1):
        A[i, 0] = c * (transmission_time[i+1] - transmission_time[0])
        A[i, 1] = c * (transmission_time[i+1] - transmission_time[0] - transmission_time[1] + transmission_time[0])
        A[i, 2] = c * (transmission_time[i+1] - transmission_time[0] - transmission_time[2] + transmission_time[0])
        A[i, 3] = c * (transmission_time[i+1] - transmission_time[0] - transmission_time[3] + transmission_time[0])
    # 构建b矩阵
    b = np.zeros((n-1, 1))
    for i in range(n-1):
        b[i, 0] = c * (angle[i+1] - angle[0])
    # 计算估计位置
    position = np.linalg.lstsq(A, b, rcond=None)[0]
    # 返回结果
    return position

# 计算位置估计值
position_estimate = estimate_position(transmission_time, angle)
# 提取x,y,z坐标估计值
x_estimate = position_estimate[:, 0]
y_estimate = position_estimate[:, 1]
z_estimate = position_estimate[:, 2]

# 绘制结果图
plt.figure()
plt.plot(x, y, label='Real Position')
plt.plot(x_estimate, y_estimate, label='Estimate Position')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

# 打印0秒至10秒的位置估计值
print('0秒至10秒的位置估计值为:')
print(x_estimate, y_estimate, z_estimate)

查看完整思路详见:
【腾讯文档】第九届“数维杯”大学生数学建模挑战赛全题目深度剖析建模完整过程+详细思路+代码全解析(持续更新中!)
https://docs.qq.com/doc/DSHd6UHpNZkZoWmxw

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2023 年第八届数维杯大学生数学建模挑战赛b要求我们通过建立数学模型来解决问。在解答这道之前,我们首先需要理解目的要求和条件。 经过分析目内容,我们可以得知该要求我们确定三幅相互切线连接的圆的半径和切点位置。首先,我们可以通过计算出三个切点的坐标来确定切点位置。可以利用已知条件,使用平行四边形法则,得到切点的坐标。然后,我们可以根据切点坐标计算出三个圆之间的距离,从而求出圆的半径。 为了建立数学模型解决问,我们可以做如下步骤: 第一步,确定切点坐标:根据已知条件,计算出三个切点的坐标。假设三个切点坐标分别为A(x1, y1),B(x2, y2),C(x3, y3)。 第二步,计算圆心坐标:利用平行四边形法则,根据已知的切点坐标可以求得三个圆心的坐标。令圆心坐标分别为O1(xo1, yo1),O2(xo2, yo2),O3(xo3, yo3)。 第三步,计算半径:利用已知的切点和圆心坐标,可以计算出三幅圆之间的距离。令圆的半径分别为r1,r2,r3。 最后,我们可以将以上三步整合在一起,建立数学模型来解决问。运用相关的几何原理和计算方法,可以计算出目要求的圆的半径和切点位置。 总的来说,通过建立数学模型,可以解决2023 年第八届数维杯大学生数学建模挑战赛b。我们可以分步骤确定切点坐标和圆心坐标,进而计算出圆的半径。这样,我们就能够满足目的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值