2024年国赛高教杯数学建模A题板凳龙闹元宵解题全过程文档及程序

server/2025/3/4 21:38:54/

2024年国赛高教杯数学建模

A题 板凳龙闹元宵

原题再现

  “板凳龙”,又称“盘龙”,是浙闽地区的传统地方民俗文化活动。人们将少则几十条,多则上百条的板凳首尾相连,形成蜿蜒曲折的板凳龙。盘龙时,龙头在前领头,龙身和龙尾相随盘旋,整体呈圆盘状。一般来说,在舞龙队能够自如地盘入和盘出的前提下,盘龙所需要的面积越小、行进速度越快,则观赏性越好。
  某板凳龙由223节板凳组成,其中第1节为龙头,后面221节为龙身,最后1节为龙尾。龙头的板长为341 cm,龙身和龙尾的板长均为220 cm,所有板凳的板宽均为30 cm。每节板凳上均有两个孔,孔径(孔的直径)为5.5 cm,孔的中心距离最近的板头27.5 cm(见图1和图2)。相邻两条板凳通过把手连接(见图3)。
在这里插入图片描述
  请建立数学模型,解决以下问题:
  问题1 舞龙队沿螺距为55 cm的等距螺线顺时针盘入,各把手中心均位于螺线上。龙头前把手的行进速度始终保持1 m/s。初始时,龙头位于螺线第16圈A点处(见图4)。请给出从初始时刻到300 s为止,每秒整个舞龙队的位置和速度(指龙头、龙身和龙尾各前把手及龙尾后把手中心的位置和速度,下同),将结果保存到文件result1.xlsx中(模板文件见附件,其中“龙尾(后)”表示龙尾后把手,其余的均是前把手,结果保留6位小数,下同)。同时在论文中给出0 s、60 s、120 s、180 s、240 s、300 s时,龙头前把手、龙头后面第1、51、101、151、201节龙身前把手和龙尾后把手的位置和速度(格式见表1和表2)。
在这里插入图片描述
在这里插入图片描述
  问题2 舞龙队沿问题1设定的螺线盘入,请确定舞龙队盘入的终止时刻,使得板凳之间不发生碰撞(即舞龙队不能再继续盘入的时间),并给出此时舞龙队的位置和速度,将结果存放到文件result2.xlsx中(模板文件见附件)。同时在论文中给出此时龙头前把手、龙头后面第1、51、101、151、201条龙身前把手和龙尾后把手的位置和速度。
  问题3 从盘入到盘出,舞龙队将由顺时针盘入调头切换为逆时针盘出,这需要一定的调头空间。若调头空间是以螺线中心为圆心、直径为9 m的圆形区域(见图5),请确定最小螺距,使得龙头前把手能够沿着相应的螺线盘入到调头空间的边界。
在这里插入图片描述
  问题4 盘入螺线的螺距为1.7 m,盘出螺线与盘入螺线关于螺线中心呈中心对称,舞龙队在问题3设定的调头空间内完成调头,调头路径是由两段圆弧相切连接而成的S形曲线,前一段圆弧的半径是后一段的2倍,它与盘入、盘出螺线均相切。能否调整圆弧,仍保持各部分相切,使得调头曲线变短? 龙头前把手的行进速度始终保持1 m/s。以调头开始时间为零时刻,给出从−100 s开始到100 s为止,每秒舞龙队的位置和速度,将结果存放到文件result4.xlsx中(模板文件见附件)。同时在论文中给出−100 s、−50 s、0 s、50 s、100 s时,龙头前把手、龙头后面第1、51、101、151、201节龙身前把手和龙尾后把手的位置和速度。
  问题5 舞龙队沿问题4设定的路径行进,龙头行进速度保持不变,请确定龙头的最大行进速度,使得舞龙队各把手的速度均不超过2 m/s。

整体求解过程概述(摘要)

  本文以中国传统舞龙表演中的“板凳龙”为研究对象,分析并优化了舞龙队在复杂路径下的运动过程,旨在确定板凳龙的运动轨迹和速度限制。研究重点在于确保板凳龙各个部分在特定几何约束下能够顺利运行。
  针对问题一,利用极坐标下的阿基米德螺旋线方程,设定龙头速度为1 m/s,建立舞龙队沿等距螺线行进的数学模型。通过螺旋线模型,计算出从初始时刻至300秒时龙头及各板凳的位置信息与速度分布,并通过微分方法求解速度,确保各把手间的距离保持一致。模型得出了各时间点下龙身与龙尾的运动轨迹,并对关键节点进行了速度分析。
  针对问题二,本文通过建立碰撞检测模型,计算舞龙队在螺旋线盘入时的终止时刻。在此过程中,实时监测相邻板凳间的距离变化,确定在螺距设定条件下,约440秒时板凳将发生碰撞,达到无法继续盘入的终止时刻。
  针对问题三,本文分析了舞龙队在9米直径的圆形调头空间内的最小螺距问题。通过优化螺旋线螺距,确保舞龙队顺利从顺时针盘入到逆时针盘出,并避免碰撞。结果显示,最小螺距为0.179米。
  针对问题四,本文设计并优化了板凳龙在调头空间内的S形调头路径。路径由两段圆弧组成,最小化路径长度,并确保调头过程中位置、速度、加速度的连续性。通过数值求解,得出了从-100秒至100秒期间各板凳的运动轨迹,并对调头路径进行了可视化。仿真结果显示,优化后的S形曲线有效缩短了调头路径,保证了调头过程的平滑性与连续性。
  针对问题五,本文构建了动态速度约束优化模型,确定了在不超过2 m/s速度限制下龙头的最大行进速度。利用二分搜索法,最终确定龙头的最大允许速度约为1.6 m/s,在此速度下,舞龙队各板凳的速度均不超过2 m/s,符合题目要求。

模型假设:

  1.假设舞龙队在运动过程中不受除自身运动外的其他外力作用。
  2.假设忽略板凳和连接部件的弹性变形,在整个运动过程中保持形状不变。
  3.假设舞龙队的运动简化为二维平面上的运动,忽略垂直方向上的运动。

问题分析:

  问题一的分析
  针对问题一,舞龙队沿等距螺旋线运动的问题涉及到计算龙头、龙身和龙尾在300秒内的位置和速度。龙头以1米/秒的速度沿螺旋线前进,龙身和龙尾的位置则根据它们与龙头的相对角度确定。通过数学建模,我们可以计算出每个时间点舞龙队各部分的具体位置和速度。
  问题二的分析
  针对问题2,舞龙队沿问题一设定的螺线盘入的过程中,确定一个终止时刻,该时刻标志着舞龙队无法再继续盘入而板凳之间不发生碰撞。意味着舞龙队盘入到某个程度时,其占用的空间或形状达到了螺线所能容纳的极限。 为了找到这个终止时刻,考虑舞龙队的整体长度、螺线的螺距以及每节板凳之间的连接方式和空间需求。由于板凳龙由多节板凳首尾相连组成,随着盘入过程的进行,板凳之间的相对位置会不断变化,直至达到一个临界点,此时再进一步盘入就会导致板凳间的碰撞。
  问题三的分析
  针对问题3,从顺时针盘入到逆时针盘出的过程中,为确保龙头前把手能够沿着螺线顺利盘入到指定的调头空间边界,需确定一个最小的螺距,该调头空间是以螺线中心为圆心、直径为9米的圆形区域。考虑螺距对螺线形状和间距的影响,螺距决定了螺线每旋转一周时径向增加的距离,从而影响到螺线的紧密程度和所占用的空间范围。在舞龙队盘入的过程中,如果螺距过大,会导致调头空间的浪费;如果螺距过小,则可能使得舞龙队内部发生碰撞。通过计算和优化来确定一个最小的螺距值,使得龙头前把手在盘入过程中能够恰好达到或接近调头空间的边界,同时保证舞龙队内部不会发生碰撞。
  问题四的分析
  针对问题4,在给定螺距和调头空间内,舞龙队通过调整S形调头曲线的圆弧来缩短路径长度,同时保持与两段螺线的相切关系。模拟舞龙队从-100秒到100秒内的运动,包括螺线盘入、S形调头及盘出过程,保持龙头前把手速度恒定。计算每秒舞龙队各关键部分的位置和速度,并将其记录。
  问题五的分析
  针对问题5,沿问题4中,龙头的最大行进速度保持不变。将龙头的行进速度将作为控制变量,目标是确保舞龙队中每一个把手在运动过程中的速度都不超过2 m/s。 龙头速度变化时,龙身各部分如何随之移动,监测所有把手的速度是否保持在安全限制以内。通过逐步调整龙头速度并观察结果,可以确定一个最大的龙头行进速度,使得舞龙队在运动过程中所有把手的速度均不超过2 m/s。

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可

部分程序代码:(代码和文档not free)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.colors import ListedColormap# 设置中文字体为SimHei(黑体)
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决负号 '-' 显示为方块的问题# 参数设定
a = 55 / (2 * np.pi)  # 螺距与圆周率的比例
v = 1  # m/s 龙头速度
time_end = 300  # s 终止时间
dt = 1  # 时间步长
n_segments = 221  # 龙身节数
dragon_head_length = 3.41  # 龙头长度(米)
segment_length = 2.2  # 每节龙身长度(米)
colors = plt.cm.cool(np.linspace(0, 1, n_segments + 3))  # 颜色渐变# 初始角度和半径
theta_0 = 16 * 2 * np.pi# 时间序列
times = np.arange(0, time_end + dt, dt)# 计算龙头位置
theta = theta_0 + (v / a) * times
r = a * theta
x_head = r * np.cos(theta)
y_head = r * np.sin(theta)# 初始化位置和速度存储
positions = np.zeros((2 * (n_segments + 3), len(times)))  # 位置
speeds = np.zeros((n_segments + 3, len(times)))  # 速度# 计算龙头位置和速度
positions[0, :] = x_head
positions[1, :] = y_head
speeds[0, :] = v# 计算龙身和龙尾位置及速度,考虑龙头与龙身长度不同
for i in range(1, n_segments + 3):if i == 1:  # 龙头与第一节龙身之间长度不同theta_i = theta - (dragon_head_length / a)else:theta_i = theta - (segment_length * i / a)r_i = a * theta_ix_i = r_i * np.cos(theta_i)y_i = r_i * np.sin(theta_i)positions[2 * i, :] = x_ipositions[2 * i + 1, :] = y_ispeeds[i, 1:] = np.sqrt((x_i[1:] - x_i[:-1]) ** 2 + (y_i[1:] - y_i[:-1]) ** 2) / dt# 创建螺线
theta_spiral = np.linspace(0, theta_0, 1000)
r_spiral = a * theta_spiral
x_spiral = r_spiral * np.cos(theta_spiral)
y_spiral = r_spiral * np.sin(theta_spiral)# 可视化图像
fig, ax = plt.subplots(figsize=(14, 10))
cmap = ListedColormap(plt.cm.cool(np.linspace(0.1, 0.9, n_segments + 3)))# 绘制螺旋线
ax.plot(x_spiral, y_spiral, 'k--', lw=1, label='初始螺线')# 绘制龙身轨迹
for i in range(n_segments + 3):ax.plot(positions[2 * i], positions[2 * i + 1], color=cmap(i), lw=2,label=f'第{i}节' if i > 0 else '龙头')# 龙头和龙尾用特殊标记表示
ax.plot(positions[0], positions[1], 'o', color='red', markersize=6, label='龙头')
ax.plot(positions[-2], positions[-1], 'o', color='blue', markersize=6, label='龙尾')# 中文标注
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), fontsize=10, ncol=5)
ax.set_title('板凳龙盘旋轨迹', fontsize=18)
ax.set_xlabel('X 位置 (米)', fontsize=14)
ax.set_ylabel('Y 位置 (米)', fontsize=14)
ax.grid(True)# 高分辨率保存图像
plt.savefig('dragon_trajectory_with_spiral_cn.png', dpi=300, bbox_inches='tight')
plt.show()# 保存位置和速度数据到Excel文件
df_positions = pd.DataFrame(positions, columns=[f"{t}秒" for t in times])
df_speeds = pd.DataFrame(speeds, columns=[f"{t}秒" for t in times])with pd.ExcelWriter('result1_optimized_cn.xlsx') as writer:df_positions.to_excel(writer, sheet_name='位置')df_speeds.to_excel(writer, sheet_name='速度')
clc; clear all; close all;% 参数设定
pitch = 55;  % 螺距
v = 1;  % m/s
time_end = 300;  % s
dt = 1;  % 时间步长
n_segments = 221;  % 龙身节数
dragon_head_length = 3.41;  % 龙头长度(米)
segment_length = 2.2;  % 每节龙身长度(米)% 初始参数
theta_0 = 16 * 2 * pi;
a = pitch / (2 * pi);  % 螺距/2pitimes = 0:dt:time_end;  % 时间序列% 计算龙头位置
theta = theta_0 + (v / a) * times;
r = a * theta;
x_head = r .* cos(theta);
y_head = r .* sin(theta);% 初始化位置与速度数组
positions = zeros(2 * (n_segments + 3), length(times));
speeds = zeros(n_segments + 3, length(times) - 1);% 计算每一节的龙身与龙尾位置(x和y)
positions(1, :) = x_head;  % x 位置
positions(2, :) = y_head;  % y 位置for i = 1:n_segments+2theta_i = theta - (segment_length * i / a);r_i = a * theta_i;positions(2 * i + 1, :) = r_i .* cos(theta_i);  % xpositions(2 * i + 2, :) = r_i .* sin(theta_i);  % y
end% 计算速度
for i = 1:n_segments+3dx = diff(positions(2*i-1, :));dy = diff(positions(2*i, :));speeds(i, :) = sqrt(dx.^2 + dy.^2) / dt;
end% 数据平滑处理(使用移动平均)
smooth_window = 5;
smooth_speeds = movmean(speeds, smooth_window, 2);% 绘制速度随时间的变化图
figure;
hold on;% 龙头速度
plot(times(1:end-1), smooth_speeds(1, :), 'r-', 'LineWidth', 2, 'DisplayName', '龙头');
plot(times(1:end-1), smooth_speeds(ceil(n_segments/2), :), 'g--', 'LineWidth', 2, 'DisplayName', '中间龙身');
plot(times(1:end-1), smooth_speeds(end, :), 'b-.', 'LineWidth', 2, 'DisplayName', '龙尾');% 标记点
plot(times(1:end-1), smooth_speeds(1, :), 'ro', 'MarkerFaceColor', 'r');
plot(times(1:end-1), smooth_speeds(ceil(n_segments/2), :), 'go', 'MarkerFaceColor', 'g');
plot(times(1:end-1), smooth_speeds(end, :), 'bo', 'MarkerFaceColor', 'b');% 添加中文标签和标题
xlabel('时间 (秒)', 'FontSize', 14);
ylabel('速度 (m/s)', 'FontSize', 14);
title('龙头、龙身和龙尾的速度随时间变化', 'FontSize', 16);% 设置网格和图例
grid on;
legend('show', 'Location', 'northeast');% 调整图像显示范围
xlim([0 time_end]);
ylim([0 max(smooth_speeds(:)) * 1.2]);  % 适当扩大y轴范围% 保存为高分辨率图片
saveas(gcf, 'speed_vs_time_optimized.png');
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可

http://www.ppmy.cn/server/172434.html

相关文章

C++初阶—list类

第一章:list的介绍及使用 1.1 list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指…

常见的正则匹配规则

目录 1,匹配数字2,匹配字母3,匹配字母和数字4,匹配邮箱地址5,匹配URL6,匹配身份证号7,匹配手机号8,匹配日期9,匹配IP地址10,匹配密码强度11,匹配空…

bc命令学习9 获取bc命令的源码并编译

本文介绍如何获取bc命令的源码并编译,这个对于初学linux还是有点难的,主要坑比较多。下面主要介绍windows下使用wsl环境进行编译 1 初始化工作 创建一个文件夹,我选择创建一个C:\run\linux,这个可以自己选择.然后启动在该文件夹下面启动wsl ,首先获取bc文件的相关信息,可以看…

Lua | 每日一练 (5)

💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Lua | 每日一练 (5)题目参考答案浅拷贝深拷贝使用场景…

蓝桥与力扣刷题(蓝桥 k倍区间)

题目:给定一个长度为 N 的数列,A1,A2,⋯AN​,如果其中一段连续的子序列 Ai,Ai1,⋯Aj( i≤j ) 之和是 K 的倍数,我们就称这个区间[i,j] 是 K 倍区间。 你能求出数列中总共有多少个 K 倍区间吗? 输入描述 第一行包含两…

【Elasticsearch】集群配置性能优化

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探…

网络原理 初识[Java EE]

目录 网络发展史 独立模式 网络互联 局域网 LAN 1. 基于网络直连 2. 基于集线器(Hub)组建 3. 基于交换机(Switch)组建 4. 基于交换机和路由器(Router)组建 广域网 WAN 网络通信基础 IP 地址 1. 概念 2. 格式 端口号 1. 概念 2.格式 认识协议 1. 概念 2. 作用…

redis八股个人总结

1.MySQL和Redis的区别? 1. 基本特性 MySQL 类型:关系型数据库(RDBMS)存储方式:基于表的结构化数据存储,数据以行和列的形式存储。数据一致性:遵循ACID(原子性、一致性、隔离性、持…