你是否在寻找数学建模比赛的突破点?数学建模进阶思路!
作为经验丰富的数学建模团队,我们将为你带来2024国赛数学建模竞赛(A题)的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析,帮助你全面理解并掌握如何解决类似问题。
完整内容在文章末尾阅读全文获取!
【2024国赛A题】高教杯全国大学生数学建模国赛建模过程+完整代码论文全解全析已经完成
问题 1是给定舞龙队初始时刻和位置,在规定时间内计算舞龙队各把手的位置和速度,以及指定时间点各部分把手的位置和速度。
问题 1重述: 根据给定的舞龙队初始时刻和位置,计算舞龙队在规定时间内每秒的位置和速度,以及指定时间点各部分把手的位置和速度。
建模思路:
-
确定舞龙队模型:舞龙队由龙头、龙身和龙尾组成,每节板凳上均有两个孔,相邻两条板凳通过把手连接。将舞龙队抽象为一条线段,每个把手为线段上的一个点,通过把手连接线段,即可构成舞龙队模型。
-
确定参数:给定舞龙队的板长、板宽、孔径、孔的中心距离以及龙头前把手的行进速度,确定舞龙队的初始时刻和位置。
-
建立数学模型:根据舞龙队模型和给定的参数,建立运动方程,计算每秒舞龙队各把手的位置和速度。
-
利用求解器计算各把手在指定时间点的位置和速度。
-
将结果保存到文件中。
建模假设:
-
假设舞龙队的把手连接线段均为直线,忽略把手的形状和长度对模型的影响。
-
假设舞龙队运动过程中不发生变形,即每节板凳的位置不发生变化。
-
忽略重力和风阻对舞龙队的影响。
数学模型:
-
假设龙头前把手的初始位置为坐标原点,建立直角坐标系。
-
以龙头前把手为起点,确定舞龙队的运动方程。考虑到舞龙队每个把手的运动路径均为螺旋线,设龙头前把手的运动路径为:
#导入所需库
import math
import numpy as np
import pandas as pd
#定义常量
N = 223 #板凳总数
L_head = 341 #龙头板长
L_body = 220 #龙身板长
W = 30 #板宽
d = 5.5 #孔径
l = 27.5 #孔中心距板头
S = 55 #螺距
v_head = 1 #龙头前把手速度
r = 16 #初始位置所在圈数
theta = 0 #初始位置所在角度
t = 300 #计算的总时间
dt = 1 #时间步长
#定义函数,计算每个板凳的位置
def position(N,L_head,L_body,W,d,l,S,r,theta):
#计算每个板凳的位置
pos = np.zeros((N,2)) #存放每个板凳的位置,第一列为x坐标,第二列为y坐标
pos[0,:] = [0,0] #龙头位置
for i in range(1,N):
pos[i,:] = [pos[i-1,0] - 2*math.pi*r*S*math.sin(theta)/360, pos[i-1,1] + 2*math.pi*r*S*math.cos(theta)/360] #计算每个板凳的位置
theta += 360/N #计算每个板凳的角度
return pos
#计算龙头前把手的位置和速度
pos = position(N,L_head,L_body,W,d,l,S,r,theta)
v_head_pos = np.zeros((t,2)) #存放龙头前把手的位置,第一列为x坐标,第二列为y坐标
v_head_vel = np.zeros((t,2)) #存放龙头前把手的速度,第一列为x方向速度,第二列为y方向速度
v_head_pos[0,:] = pos[0,:] #初始位置为龙头位置
v_head_vel[0,:] = [0,v_head] #初始速度为1m/s向y方向
for i in range(1,t):
v_head_pos[i,:] = [v_head_pos[i-1,0] + v_head_vel[i-1,0]*dt, v_head_pos[i-1,1] + v_head_vel[i-1,1]*dt] #计算龙头前把手的位置
v_head_vel[i,:] = [pos[0,0] - v_head_pos[i,0], pos[0,1] - v_head_pos[i,1]] #计算龙头前把手的速度
#计算龙头后面第1、51、101、151、201节龙身前把手和龙尾后把手的位置和速度
body_pos = np.zeros((t,10)) #存放龙身和龙尾前把手和后把手的位置,每一列分别为x坐标和y坐标
body_vel = np.zeros((t,10)) #存放龙身和龙尾前把手和后把手的速度,每一列分别为x方向速度和y方向速度
body_pos[0,:] = pos[1:6,:].reshape(10) #初始位置为龙身和龙尾前把手和后把手的位置
body_vel[0,:] = [0,0,0,0,0,0,0,0,0,0] #初始速度为0
for i in range(1,t):
body_pos[i,:] = pos[(i+1):(i+6),:].reshape(10) #计算龙身和龙尾前把手和后把手的位置
body_vel[i,:] = [body_pos[i-1,0] - body_pos[i,0], body_pos[i-1,1] - body_pos[i,1], body_pos[i-1,2] - body_pos[i,2], body_pos[i-1,3] - body_pos[i,3], body_pos[i-1,4] - body_pos[i,4], body_pos[i-1,5] - body_pos[i,5], body_pos[i-1,6] - body_pos[i,6], body_pos[i-1,7] - body_pos[i,7], body_pos[i-1,8] - body_pos[i,8], body_pos[i-1,9] - body_pos[i,9]] #计算龙身和龙尾前把手和后把手的速度
#保存结果到result1.xlsx
data = pd.DataFrame(np.hstack((np.array(range(t)).reshape(t,1),v_head_pos,v_head_vel,body_pos,body_vel)), columns=['time','v_head_x','v_head_y','v_head_vel_x','v_head_vel_y','body1_x','body1_y','body2_x','body2_y','body3_x','body3_y','body4_x','body4_y','body5_x','body5_y','body6_x','body6_y','body7_x','body7_y','body8_x','body8_y','body9_x','body9_y','body10_x','body10_y','body1_vel_x','body1_vel_y','body2_vel_x','body2_vel_y','body3_vel_x','body3_vel_y','body4_vel_x','body4_vel_y','body5_vel_x','body5_vel_y','body6_vel_x','body6_vel_y','body7_vel_x','body7_vel_y','body8_vel_x','body8_vel_y','body9_vel_x','body9_vel_y','body10_vel_x','body10_vel_y']))
data.to_excel('result1.xlsx', index=False)
内容具体可以看看我的主页!
和 《小天数模》 团队,同名公众号 一起拿奖!里面包含本次竞赛全部思路与分析!
包含本次比赛全部题目和单题思路与代码,代码和文章会不断更新
关注小天数模,你们的支持是我更新的动力!