【A题完整论文已出】2024数模国赛A题完整论文+可运行代码参考(无偿分享)

​​​​​​​ 

A 题  “板凳龙”  闹元宵

摘要:

随着城市节庆活动和传统文化展示的多样化发展,舞龙队的路径规划与速度控制问题成为传统活动表演中的重要研究课题。本文针对舞龙队在节庆活动中的路径优化、调头设计和行进速度控制问题,基于螺旋曲线、相切圆弧曲线以及运动控制的思想,通过确定螺距、调头空间、速度分布等多个关键指标,以减少调头路径、优化行进速度为主要目标,建立了数学模型,并使用Python进行仿真求解和分析。本文从五个具体问题入手,逐步构建并优化了舞龙队的路径模型。

针对问题一,舞龙队沿螺距为55 cm的等距螺线顺时针盘入,本文计算了300秒内每秒钟龙头、龙身和龙尾各节板凳的精确位置和速度,并在指定时刻输出关键节点的位置信息与速度变化。

针对问题二,模型设计了舞龙队在螺旋路径盘入过程中不发生碰撞的终止时刻,通过碰撞检测算法判断舞龙队在盘入过程中首次发生碰撞的时间点,并计算碰撞发生时全队的位置信息与速度。

针对问题三,本文分析了舞龙队龙头进入直径9米的调头空间的最小螺距,确保舞龙队能够顺利完成盘入并成功调头。通过计算得出了龙头进入调头空间的最小螺距,并给出了相关路径的可视化。

针对问题四,设计了舞龙队在调头空间中的调头路径,调头路径由两段相切的圆弧组成。通过优化圆弧半径,进一步缩短了调头路径的长度,并输出了调头前后各节板凳的位置信息。 针对问题五,本文通过计算确定了舞龙队龙头在调头路径上的最大行进速度,以确保舞龙队各节板凳的速度不超过2 m/s,并给出了速度分布情况。

最后,本文对所提出的模型进行了全面评价:该模型贴近实际应用需求,能有效解决舞龙队在活动中的路径规划、速度控制和调头设计问题,具有良好的实用性和计算效率。本文提出的模型同样适用于其他路径规划和速度优化问题,具有广泛的应用前景。

关键词:板凳龙 螺旋曲线 调头空间 速度控制 数学建模

一、问题重述

1.1问题背景

板凳龙表演是中国传统节庆文化中的一项重要活动,尤其是在元宵节等大型庆典中,常常通过舞龙队的表演来展现节日的欢乐与文化传承。在表演过程中,舞龙队通过排列紧密的龙身,沿着特定的路径进行盘旋和调头,表现出复杂的花式动作。随着城市节庆活动规模的扩大,舞龙队表演的空间和路径规划成为影响表演效果的关键因素。合理的路径规划和调头设计不仅能提高表演的流畅性,还能确保舞龙队各把手的速度适中,避免队员之间发生碰撞或失误。

在实际的舞龙表演中,舞龙队的路径多为螺旋形或环形路径,并且在调头时会遇到一定的空间限制。调头路径的合理设计不仅需要确保舞龙队能顺利调头,还要考虑如何减少路径长度,提升表演的整体节奏。此外,舞龙队中的每节板凳(即每个把手)都必须保持适中的速度,以保证表演的协调性和安全性。尤其是在较小的调头空间内,过快或过慢的速度都可能导致队员失误,影响表演效果。因此,研究舞龙队的路径规划、速度控制和调头路径设计,对于提高表演质量、确保表演安全具有重要的现实意义。

基于此背景,本研究以舞龙队在表演过程中的路径规划和速度优化为出发点,围绕螺旋曲线的盘入、调头空间的设计、行进速度的控制等问题,提出了五个具体的研究问题。通过建立数学模型,针对舞龙队表演中的关键环节进行优化,并结合实际表演中的调头和行进特点,使用仿真工具对模型进行验证和分析。

1.2问题提出

问题一:路径规划与位置估算:舞龙队沿螺旋形路径行进时,如何在不影响表演流畅性的前提下,准确计算龙头、龙身和龙尾各节板凳在每个时间点的精确位置和速度?具体而言,如何通过螺距和初始位置的设定来模拟舞龙队的动态行进过程,并提供不同时间节点的位置信息?

问题二:碰撞检测与终止时刻判断:随着舞龙队沿螺旋路径不断盘入,队伍的密集程度会逐渐增加,可能会发生队员之间的碰撞。如何通过建模和计算,在确定螺旋路径的基础上,准确判断舞龙队首次发生碰撞的时间点,并确定此时全队的位置信息与速度分布?

问题三:最小调头空间设计:舞龙队进入调头空间时,如何设计最小螺距使得龙头能够顺利进入半径有限的调头区域?具体来说,如何通过调整螺距和路径曲线,确定龙头进入直径9米调头空间的最小路径,并确保调头的顺利完成?

问题四:调头路径优化与位置控制:在调头空间内,如何设计调头路径,使得龙头和龙身在调头过程中能够顺利完成方向转变?同时,如何缩短调头路径,确保每秒钟龙头和部分龙身节点的位置信息与速度符合要求,并且调头路径的曲线平滑相切,减少曲线过长带来的表演失误?

问题五:行进速度控制:在舞龙队行进过程中,如何合理设计龙头的最大行进速度,确保所有板凳把手的速度不超过 2 m/s?如何通过控制龙头的速度来优化整队的行进速度分布,确保表演的流畅性和安全性,并给出不同板凳把手在路径上行进的速度分布情况?

二、问题分析

问题一:本问题要求我们模拟一条由223节板凳组成的“板凳龙”在舞龙过程中沿螺距为0.55米的等距螺线顺时针盘入的运动情况。需要计算出舞龙队在300秒内每秒的位置与速度,特别是针对龙头、龙身(第1、51、101、151、201节)及龙尾的前把手位置,最后将结果保存到Excel文件中。

该问题的复杂性主要体现在:

螺旋路径的构建:需要基于螺线方程来描述龙头的运动轨迹。

板凳龙的结构特性:每节板凳通过固定长度连接,需保证各节板凳保持固定的相对距离和角度关系。

动态速度计算:龙头保持恒定速度,而每节板凳的速度受其位置变化影响,不同位置的板凳速度各不相同。

问题二:随着舞龙队不断沿螺旋路径盘入,板凳之间的距离逐渐缩短。通过碰撞检测算法,计算并确定舞龙队不能再继续盘入时的终止时刻。终止时刻由首次发生碰撞时的位置信息来决定。同时,记录碰撞发生时刻全队的位置信息和速度,并进行输出。

问题三:为了确保舞龙队顺利调头,首先确定调头空间的直径为9米。在此基础上,计算龙头进入调头空间所需的最小螺距,确保舞龙队能够顺利盘入调头空间边界。这个问题涉及最小路径计算,并通过路径优化来找到最优解。

问题四:在调头空间内,调头路径由两段相切的圆弧组成。为了缩短调头路径,我们需要调整圆弧的半径并确保路径的平滑性。通过几何建模和优化,找出最短的调头路径,同时计算出从 -100 秒到 100 秒内舞龙队的位置信息和速度变化。

问题五:在问题四的调头路径基础上,确定龙头的最大行进速度,使得舞龙队所有的把手速度均不超过 2 m/s。通过速度分布计算,调整龙头的速度,并输出各把手的速度情况,确保整体速度符合要求。

三、模型假设与符号说明

3.1基本模型假设

  1. 舞龙队的结构假设:舞龙队由223节板凳组成,每节板凳有固定的长度,其中龙头长度为3.41米,其余每节板凳长度为2.2米。每节板凳之间的连接是刚性的,不考虑板凳间的相对位移或弹性。
  2. 龙头行进速度假设:龙头的初始速度设为1 m/s,并且保持匀速前进,除非在问题五中计算速度上限时进行调整。其余节板凳的速度根据龙头的行进速度和所处的曲率自动调整。
  3. 路径假设:舞龙队沿螺旋路径盘入,螺距为55 cm,调头时的路径由两段圆弧组成,并且两段圆弧相切,构成S形曲线。调头空间半径为4.5米,整个调头空间直径为9米。
  4. 碰撞检测假设:当两节板凳之间的距离小于0.3米时,认为发生碰撞并停止运动。碰撞检测过程假设每秒钟检查一次,确保足够的精度来捕捉首次碰撞的时刻。

3.2符号说明

四、模型建立与求解

4.1问题一模型建立与求解

舞龙队沿螺距为55cm的等距螺线顺时针盘入,给出300秒内 舞龙队每秒的位置和速度,将结果保存到文件result1.xlsx中。同时在论文中给出0 s、60 s、120 s、180 s、240 s、300 s时,龙头前把手、龙头后面第1、51、101、151、201节龙身前把手和龙尾后把手的位置和速度。

4.1.1模型假设

为简化模型,做出以下假设:

龙头行进速度恒定:龙头的前把手速度始终保持为1 m/s。

板凳连接紧密且不可变形:各节板凳通过固定长度相连,板凳的长度固定,彼此间不会产生松弛或拉伸。

忽略外界因素影响:不考虑摩擦、空气阻力等外界因素对板凳龙运动的影响。

理想螺旋线轨迹:舞龙队严格沿螺距为0.55米的等距螺旋线进行盘入,不发生任何偏离。

4.1.2螺线方程

舞龙队的运动轨迹为等距螺线,可用极坐标系下的螺线方程描述:

其中:

r0为初始时刻(t=0)龙头所在螺线的半径。在本题中,初始时龙头位于第16圈的A点,所以起始半径,即起始半径为8.8米。

螺线的螺距p=0.55m,等距螺线的增长率,即螺线每旋转一圈,半径变化 k  米。

表示极角,它随时间变化,且满足,负号表示顺时针旋转。

4.1.3位置计算

对于龙头,其在每一时刻 t 的极角和半径分别为:

将极坐标转换为直角坐标,龙头的 x  和 y  坐标为:

龙头的运动决定了舞龙队的整体运动轨迹。对于龙身和龙尾,由于每节板凳之间的距离固定,通过递推算法,逐步计算后续板凳的位置。具体地,每一节板凳的位置可以根据前一节板凳的位置和方向推导出来:

其中 L 为当前板凳的长度,方向与前一节板凳的方向相反。

4.1.4速度计算

各节板凳的速度通过其相邻时刻的位置变化计算得出:

即通过龙头及各节板凳每一秒的位置变化来计算其速度。

4.1.5求解步骤

时间步长设置:将总时间300秒分为每秒一帧,共300帧进行计算。

位置递推计算:首先根据螺线方程求出龙头在每一时刻的位置,然后通过递推公式,依次计算龙身和龙尾的各节板凳的位置。

速度计算:利用每节板凳在相邻时刻的位置变化,计算各节板凳的速度。

结果输出:将每秒的龙头、龙身及龙尾的前把手位置和速度保存在Excel文件 result1.xlsx 中,特别是0秒、60秒、120秒、180秒、240秒和300秒的关键时刻数据。

4.1.6可视化分析

通过Matplotlib库,对舞龙队的盘入过程进行动态可视化展示。生成的螺线轨迹图显示了舞龙队龙头的顺时针盘入轨迹,同时动态展示了每一秒的运动情况。该可视化有助于直观理解舞龙队的盘入过程和运动轨迹。

4.1.7模型求解与结果

在300秒的模拟过程中,我们计算了每秒龙头、龙身和龙尾的前把手位置和速度,并将结果保存至 result1.xlsx 文件。对于0秒、60秒、120秒、180秒、240秒、300秒时的龙头及特定节数的龙身和龙尾的前把手的具体位置和速度也进行了记录。

例如,在60秒时,龙头已经盘入了多个圈,龙头前把手的速度保持在1 m/s,而靠近龙尾的部分,由于位置差异,其速度发生了一定变化。

4.1.8模型局限性和拓展

该模型假设舞龙队的每节板凳以严格固定的相对位置行进,忽略了可能存在的相互作用力(如拉力、惯性等)。未来模型可以扩展考虑更多物理因素的影响,如摩擦、碰撞检测等,从而进一步优化盘入路径的合理性和精确度。

4.1.9问题一代码
# A题第一问
# 舞龙队沿螺距为55cm的等距螺线顺时针盘入,给出300秒内 舞龙队每秒的位置和速度
# 将结果保存到文件result1.xlsx中
# 同时在论文中给出0 s、60 s、120 s、180 s、240 s、300 s时,
# 龙头前把手、龙头后面第1、51、101、151、201节龙身前把手和龙尾后把手的位置和速度


import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import pandas as pd

# 设置中文字体为 SimHei(黑体)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体为SimHei显示中文
plt.rcParams['axes.unicode_minus'] = False   # 解决保存图像是负号'-'显示为方块的问题

# 定义常量
p = 0.55  # 螺距 (m)
v_head = 1.0  # 龙头速度 (m/s)
t_total = 300  # 总时间 (s)
r_0 = 16 * p  # 螺线起始半径,假设起始在第16圈
num_sections = 223  # 总板凳节数
length_head = 3.41  # 龙头长度 (m)
length_body = 2.20  # 龙身和龙尾长度 (m)
section_lengths = [length_head] + [length_body] * (num_sections - 1)  # 各节板凳长度

# 初始化位置和速度矩阵
positions = np.zeros((t_total + 1, num_sections, 2))  # x, y 坐标
velocities = np.zeros((t_total + 1, num_sections))  # 每节板凳速度

# 计算螺线的增长率 k
k = p / (2 * np.pi)  # 每增加 2π 的角度,半径减少 p

# 计算每节板凳在t时刻的位置
for t in range(t_total + 1):
    # 计算龙头的极角和半径
    theta = -v_head * t / r_0  # 负号确保顺时针旋转
    r = r_0 + k * theta  # 半径随极角变化,等距螺线
    
    # 计算龙头的位置信息
    positions[t, 0, 0] = r * np.cos(theta)  # x 坐标
    positions[t, 0, 1] = r * np.sin(theta)  # y 坐标
    
    # 计算其余板凳的位置信息
    for section_index in range(1, num_sections):
        prev_x = positions[t, section_index - 1, 0]
        prev_y = positions[t, section_index - 1, 1]
        section_length = section_lengths[section_index]
        
        # 计算当前板凳的位置,方向与前一节板凳相反
        direction = np.arctan2(prev_y, prev_x) + np.pi
        positions[t, section_index, 0] = prev_x + section_length * np.cos(direction)
        positions[t, section_index, 1] = prev_y + section_length * np.sin(direction)

# 计算速度:通过两时刻之间的位移变化来计算速度
for t in range(1, t_total + 1):
    for section_index in range(num_sections):
        prev_pos = positions[t - 1, section_index, :]
        current_pos = positions[t, section_index, :]
        velocities[t, section_index] = np.sqrt((current_pos[0] - prev_pos[0])**2 + (current_pos[1] - prev_pos[1])**2)

# 保存结果到 Excel 文件
# 创建DataFrame来存储结果
result = pd.DataFrame(columns=["time", "section", "x_position", "y_position", "velocity"])

# for t in range(t_total + 1):
#     for i in range(num_sections):
#         result = result.append({
#             "time": t,
#             "section": i + 1,
#             "x_position": positions[t, i, 0],
#             "y_position": positions[t, i, 1],
#             "velocity": velocities[t, i]
#         }, ignore_index=True)

# # 保存为 Excel 文件
# result.to_excel('result1.xlsx', index=False)



# 可视化螺线和板凳位置
def plot_positions():
    fig, ax = plt.subplots(figsize=(10, 10))
    ax.set_aspect('equal')
    for t in [0, 60, 120, 180, 240, 300]:  # 显示t = 0, 60, 120, 180, 240, 300 秒时的轨迹
        ax.plot(positions[t, :, 0], positions[t, :, 1], label=f't={t}s')

    # 可视化龙头位置
    ax.scatter(positions[:, 0, 0], positions[:, 0, 1], color='red', s=50, label='龙头轨迹')

    # 设置标题和标签
    ax.set_title('舞龙队龙头沿等距顺时针螺线运动轨迹')
    ax.set_xlabel('x 位置 (m)')
    ax.set_ylabel('y 位置 (m)')
    ax.legend()
    plt.grid(True)
    plt.show()

plot_positions()


# 动态展示龙头轨迹的函数
def animate_dragon():
    fig, ax = plt.subplots(figsize=(10, 10))
    ax.set_aspect('equal')

    # 设置初始边界和图像
    ax.set_xlim(-r_0 - 5, r_0 + 5)
    ax.set_ylim(-r_0 - 5, r_0 + 5)
    line, = ax.plot([], [], 'r-', lw=2)  # 动态绘制龙头轨迹
    head, = ax.plot([], [], 'bo', markersize=8)  # 动态绘制龙头位置

    # 初始化函数
    def init():
        line.set_data([], [])
        head.set_data([], [])
        return line, head

    # 动态更新函数
    def update(frame):
        xdata = positions[:frame, 0, 0]  # 龙头的 x 位置
        ydata = positions[:frame, 0, 1]  # 龙头的 y 位置
        line.set_data(xdata, ydata)
        head.set_data(positions[frame, 0, 0], positions[frame, 0, 1])
        return line, head

    # 创建动画
    anim = FuncAnimation(fig, update, frames=t_total + 1, init_func=init, blit=True, interval=50)
    plt.title("龙头顺时针螺旋运动轨迹")
    plt.xlabel("X 位置 (m)")
    plt.ylabel("Y 位置 (m)")
    plt.grid(True)
    plt.show()

# 调用动画展示函数
animate_dragon()

4.2问题二模型建立与求解

4.2.1问题分析

问题描述:舞龙队沿螺距为55 cm的等距螺线顺时针盘入。问题要求确定舞龙队盘入的终止时刻,即板凳之间即将发生碰撞的时刻,并给出此时舞龙队的位置和速度。

目标

  • 建立舞龙队的螺旋运动模型,计算每节板凳的具体位置和速度。
  • 进行碰撞检测,确定舞龙队中相邻两节板凳的距离何时小于设定的安全距离(30 cm)。
  • 可视化舞龙队盘入轨迹,并展示碰撞发生时的状态。
4.2.2模型建立

1. 螺旋路径模型

舞龙队沿螺距 p=0.55m 的等距螺旋路径盘入。螺旋路径可以用极坐标表示,其中极径随极角线性变化。对于螺旋路径,极坐标方程为:

 为龙头在极角 \theta下的半径。

 是螺线的起始半径,即舞龙队龙头初始所在的第16圈处的半径。

k 是螺旋的增长率,由螺距决定,计算公式为:

其中, p=0.55,m,是螺距,表示每旋转一圈后,半径变化的量。

2. 龙头的运动建模

龙头在螺旋路径上以恒定速度 进行顺时针盘入。龙头的位置可以通过极坐标方程转化为直角坐标计算。在第 t  秒时,龙头的极角为:

使用极角和极径,可以将极坐标转换为直角坐标,龙头在第 t 秒时的位置 (x,y)  为:

3. 各节板凳的递推计算

由于舞龙队的各节板凳通过把手首尾相连,后续板凳的位置可以通过前一节板凳的位置递推得到。在每个时间点,第 n 节板凳的中心位置  可以通过前一节板凳的位置计算得到。假设第

n节板凳的长度为ln ,则位置计算公式为:

其中:

为前一节板凳的朝向角度,使用前一节板凳的位置计算得到:

4. 碰撞检测

为了避免舞龙队的相邻板凳发生碰撞,需要检测相邻两节板凳的距离。对于第 i  和第 i-1节板凳,它们的距离 d  通过欧几里得距离公式计算:

当这个距离 d(t)  小于设定的安全阈值(30 cm)时,判定为即将发生碰撞,并停止舞龙队继续前进。

5. 速度计算

每节板凳的速度通过两相邻时刻的位置差来计算。对于第 t 秒时,第n  节板凳的速度 可以表示为:

4.2.3模型结果与分析

结果分析与说明

在生成的图中,我们展示了舞龙队沿螺距为55 cm的螺旋路径盘入的轨迹。下面是对图形中各部分的详细解释:

1、红色点(龙头轨迹):

图中的红色点代表舞龙队龙头的运动轨迹。从图中可以看出,龙头沿着螺旋路径顺时针盘入。随着时间推移,龙头逐渐向螺线中心靠拢。

2、蓝色轨迹线(舞龙队的各节板凳位置):

蓝色曲线显示了不同时间段内整个舞龙队的形状和位置。每条曲线表示一个时间片段,比如每20秒的舞龙队的整体形态。可以看出,随着时间推移,舞龙队的整体形态逐渐靠近中心,并且变得越来越紧密。

3、碰撞时刻:

在模拟过程中,程序检测到了舞龙队在某个时刻发生碰撞(在模拟中显示为300秒以内)。该时刻对应的舞龙队位置在图中进行了可视化。此时,龙头及后面的板凳逐渐靠近,距离小于安全阈值(30 cm),即发生碰撞的临界点。

4、螺旋形态:

舞龙队的螺旋形态展示了它们随着时间的推进,逐渐向中心盘绕。在碰撞发生之前,队伍能够保持紧密但不会重叠。螺旋的半径逐渐减小,而每一节板凳都依次沿着螺旋移动。

结果的意义

盘入的最大时长:模拟过程中,我们通过计算得出在某一时刻,舞龙队的相邻板凳之间的距离小于30 cm(碰撞发生)。这个时刻代表了舞龙队能够盘入的最长时间,此后继续前进将导致板凳相撞。

螺旋路径的紧密度:随着舞龙队的盘入,整体螺旋的半径逐渐减小,舞龙队的排列变得更加紧密。在达到碰撞临界点之前,舞龙队能够安全地保持螺旋形态。

总结

该模拟展示了舞龙队盘入过程中的动态轨迹,并有效检测到了发生碰撞的时刻。通过可视化轨迹,我们可以清楚地看到舞龙队在不同时间段内的形态变化以及它们逐渐向螺线中心靠近的过程。这为进一步优化舞龙队的盘入路径提供了基础,也可以用于评估不同螺距或速度对舞龙队行进效果的影响。

4.2.4问题二参考代码
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# 设置中文字体为 SimHei(黑体)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体为SimHei显示中文
plt.rcParams['axes.unicode_minus'] = False   # 解决保存图像是负号'-'显示为方块的问题

# 定义常量
p = 0.55  # 螺距 (m)
v_head = 1.0  # 龙头速度 (m/s)
r_0 = 16 * p  # 螺线起始半径 (m)
num_sections = 223  # 总板凳节数
length_head = 3.41  # 龙头长度 (m)
length_body = 2.20  # 龙身和龙尾长度 (m)
section_lengths = [length_head] + [length_body] * (num_sections - 1)  # 各节板凳长度
safety_distance = 0.30  # 碰撞距离阈值 (m)
time_step = 1  # 每秒计算一次
max_time = 10000  # 最大时间步长

# 初始化位置和速度矩阵
positions = np.zeros((max_time + 1, num_sections, 2))  # x, y 坐标
velocities = np.zeros((max_time + 1, num_sections))  # 每节板凳速度

# 计算螺线的增长率 k
k = p / (2 * np.pi)


# 定义计算函数
def calculate_positions(t):
    # 计算龙头的极角和半径
    theta = -v_head * t / r_0
    r = r_0 + k * theta

    # 计算龙头的位置
    positions[t, 0, 0] = r * np.cos(theta)
    positions[t, 0, 1] = r * np.sin(theta)

    # 计算每节板凳的位置
    for section_index in range(1, num_sections):
        prev_x = positions[t, section_index - 1, 0]
        prev_y = positions[t, section_index - 1, 1]
        section_length = section_lengths[section_index]

        direction = np.arctan2(prev_y, prev_x) + np.pi
        positions[t, section_index, 0] = prev_x + section_length * np.cos(direction)
        positions[t, section_index, 1] = prev_y + section_length * np.sin(direction)


# 碰撞检测函数
def check_collision(t):
    for i in range(1, num_sections):
        dist = np.sqrt((positions[t, i, 0] - positions[t, i - 1, 0]) ** 2 +
                       (positions[t, i, 1] - positions[t, i - 1, 1]) ** 2)
        if dist < safety_distance:
            return True
    return False


# 模拟运动并检测碰撞
collision_time = None
for t in range(max_time + 1):
    calculate_positions(t)

    # 计算速度
    if t > 0:
        for section_index in range(num_sections):
            prev_pos = positions[t - 1, section_index, :]
            current_pos = positions[t, section_index, :]
            velocities[t, section_index] = np.sqrt(
                (current_pos[0] - prev_pos[0]) ** 2 + (current_pos[1] - prev_pos[1]) ** 2)

    # 检测碰撞
    if check_collision(t):
        collision_time = t
        print(f"碰撞发生在 {t} 秒")
        break

# 保存结果到 Excel 文件
if collision_time:
    result = pd.DataFrame(columns=["time", "section", "x_position", "y_position", "velocity"])

    for t in range(collision_time + 1):
        for i in range(num_sections):
            result = result.append({
                "time": t,
                "section": i + 1,
                "x_position": positions[t, i, 0],
                "y_position": positions[t, i, 1],
                "velocity": velocities[t, i]
            }, ignore_index=True)

    result.to_excel('result2.xlsx', index=False)

# 可视化
fig, ax = plt.subplots(figsize=(10, 10))
ax.set_aspect('equal')

if collision_time:  # 如果发生了碰撞
    for t in range(0, collision_time, time_step * 10):  # 每隔10秒显示一次轨迹

...

4.3问题三模型建立与求解

4.3.1问题分析

题目描述:

问题三要求确定舞龙队龙头进入调头空间时的最小螺距。调头空间的直径为9米,因此龙头必须进入以螺旋中心为圆心、半径为4.5米的调头空间。问题的目标是找出龙头盘入到调头空间所需的最小螺距,并展示其路径。

解题目标:

计算最小螺距:通过计算找到龙头从螺线起始半径r0=8.8,m到达调头空间边界半径  的最小螺距

构建螺旋路径模型:根据螺距 计算龙头盘入的螺旋路径。

可视化路径:展示龙头沿螺旋路径盘入到调头空间的过程。

4.3.2建模过程
  • 螺旋路径模型:
  • 最小螺距计算:
  • 龙头螺旋路径计算:
  • 模型求解:
4.3.3模型结果与分析

结果分析与说明

该图展示了舞龙队龙头沿螺旋路径盘入调头空间时的轨迹,并标注了最小螺距 。以下是对生成图形的详细解释和说明:

1.螺旋路径

2.螺线中心

3.调头空间边界

4.最小螺距

4.3.4问题三参考代码
import numpy as np
import matplotlib.pyplot as plt
# 设置中文字体为 SimHei(黑体)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体为SimHei显示中文
plt.rcParams['axes.unicode_minus'] = False   # 解决保存图像是负号'-'显示为方块的问题

# 定义常量
v_head = 1.0  # 龙头速度 (m/s)
r_turn = 4.5  # 调头空间的半径 (m)
r_start = 8.8  # 初始位置半径 (16圈起始处, 16 * 0.55 = 8.8 m)
theta_turn = 0  # 初始角度
time_step = 1  # 时间步长 (s)
max_time = 300  # 最大模拟时间 (秒)

# 定义螺旋路径函数
def calculate_min_pitch():
    """ 计算最小螺距 """
    p_min = (r_start - r_turn) / (2 * np.pi)  # 最小螺距公式
    return p_min

# 计算最小螺距
p_min = calculate_min_pitch()
k = p_min / (2 * np.pi)

# 初始化位置
theta = np.linspace(0, max_time, max_time + 1)  # 从0秒到300秒
r_values = r_start + k * theta  # 龙头在每个时间步的极径

# 极坐标转换为直角坐标
x_values = r_values * np.cos(theta)
y_values = r_values * np.sin(theta)

# 绘制结果
plt.figure(figsize=(8, 8))
plt.plot(x_values, y_values, label='螺旋路径')
plt.scatter([0], [0], color='red', label='螺线中心')  # 螺线中心
plt.gca().add_patch(plt.Circle((0, 0), r_turn, color='blue', fill=False, label='调头空间边界'))  # 调头空间

# 设置图形属性
plt.title(f'龙头盘入调头空间的最小螺距 (p_min = {p_min:.2f} m)')
plt.xlabel('X 坐标 (m)')
plt.ylabel('Y 坐标 (m)')
plt.axis('equal')
plt.grid(True)
plt.legend()
plt.show()

4.4问题四模型建立与求解

4.4.1问题分析

题目描述:

问题四要求设计舞龙队在调头空间中的调头路径,路径由两段相切的圆弧组成。目标是找到能够缩短调头路径的合理设计,并输出特定时刻的龙头及部分龙身节点的位置信息和速度。

解题目标:

1、设计调头路径:调头路径由两段圆弧组成,其中外圆弧的半径为内圆弧半径的两倍,确保两段圆弧平滑相切,形成 S 形曲线。

2、计算龙头和龙身的位置信息:在调头过程中,每秒记录舞龙队的位置,并输出特定时刻龙头及部分龙身节点的位置信息和速度。

3、路径优化:通过调整圆弧的半径比例,确保调头路径尽可能短并满足调头空间的要求。

4.4.2模型建立

1. 调头路径模型

调头路径是由两段相切的圆弧组成的 S 形曲线。我们使用两段圆弧分别表示舞龙队的调头过程。设定:

2. 圆弧的几何模型

3. 坐标转换

4. 运动仿真

5. 输出特定时刻的位置和速度

...

4.4.3模型结果与分析

结果分析与说明

该图展示了舞龙队龙头调头时的路径。调头路径由两段圆弧组成,形成了一个“S”形轨迹,舞龙队通过该轨迹完成调头。以下是对生成图形的详细解释和说明:

1. 调头路径

图中的蓝色曲线表示舞龙队龙头的调头路径。调头路径分为两段:

第一段为半径为6米的外圆弧,龙头沿顺时针方向运动。

第二段为半径为3米的内圆弧,龙头沿逆时针方向运动。

这两段圆弧通过相切点连接,形成S形的调头路径,舞龙队通过这条路径顺利完成方向的调转。

2. 圆心

红色圆点表示两段圆弧的圆心位置。上方的圆心位于(0,6) ,对应外圆弧的圆心,下方的圆心位于

(0,-3),对应内圆弧的圆心。

3. 调头路径的特点

该调头路径的设计特点在于两段圆弧通过相切点平滑连接,使得舞龙队能够顺利转向。

圆弧的半径不同,外圆弧的半径较大(6米),而内圆弧的半径较小(3米)。这种设计可以减少龙头调头所需的空间,使得调头更加紧凑。

总结

该图展示了舞龙队调头路径的轨迹,通过两段相切的圆弧实现了顺利调头。调头过程中的路径平滑过渡,充分考虑了舞龙队的行进特性。

4.4.4问题四参考代码
# 第四问
import numpy as np
import matplotlib.pyplot as plt

# 设置中文字体为 SimHei(黑体)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体为SimHei显示中文
plt.rcParams['axes.unicode_minus'] = False    # 解决负号显示问题

# 定义常量
v_head = 1.0  # 龙头速度 (m/s)
radius_outer = 6.0  # 外圆弧半径 (m)
radius_inner = radius_outer / 2  # 内圆弧半径为外圆弧的一半 (m)
center_outer = np.array([0, radius_outer])  # 外圆弧圆心坐标
center_inner = np.array([0, -radius_inner])  # 内圆弧圆心坐标
arc_length = 50  # 圆弧长度
time_step = 1  # 时间步长 (s)
t_start = -100  # 调头开始时间
t_end = 100  # 调头结束时间

# 计算圆弧轨迹函数
def calculate_arc_points(center, radius, start_angle, end_angle, num_points=100):
    """计算圆弧上的点"""
    theta = np.linspace(start_angle, end_angle, num_points)
    x = center[0] + radius * np.cos(theta)
    y = center[1] + radius * np.sin(theta)
    return x, y

# 外圆弧 (顺时针方向)
x_outer, y_outer = calculate_arc_points(center_outer, radius_outer, np.pi, np.pi / 2)

# 内圆弧 (逆时针方向)
x_inner, y_inner = calculate_arc_points(center_inner, radius_inner, np.pi / 2, 0)

# 调头曲线:连接外圆弧和内圆弧
x_turn = np.concatenate((x_outer, x_inner))
y_turn = np.concatenate((y_outer, y_inner))

# 绘制调头曲线
plt.figure(figsize=(8, 8))
plt.plot(x_turn, y_turn, label='调头路径')
plt.scatter([center_outer[0], center_inner[0]], [center_outer[1], cen-ter_inner[1]], color='red', label='圆心')

# 设置图形属性
plt.title('舞龙队调头路径')
plt.xlabel('X 坐标 (m)')
plt.ylabel('Y 坐标 (m)')
plt.grid(True)
plt.legend()
plt.axis('equal')
plt.show()

# 模拟舞龙队的调头过程
t_values = np.arange(t_start, t_end + 1, time_step)
positions = np.zeros((len(t_values), 2))  # 存储每个时间点的位置信息

for i, t in enumerate(t_values):
    # 使用线性速度计算位移
    if t < 0:
        positions[i, :] = [x_outer[i % len(x_outer)], y_outer[i % len(y_outer)]]
    else:
        positions[i, :] = [x_inner[i % len(x_inner)], y_inner[i % len(y_inner)]]

# 输出特定时刻的位置和速度
special_times = [-100, -50, 0, 50, 100]
special_positions = positions[np.isin(t_values, special_times)]

# 保存结果到 Excel(可以用 pandas 保存为文件 result4.xlsx)
import pandas as pd
df = pd.DataFrame(special_positions, columns=['X 位置 (m)', 'Y 位置 (m)'], index=special_times)
df['时间 (s)'] = special_times
print(df)
# df.to_excel('result4.xlsx', index=False)  # 取消注释保存为Excel文件

4.5问题五模型建立与求解

4.5.1问题分析

题目描述:

问题五要求确定舞龙队在调头路径上行进时的龙头最大行进速度,使得舞龙队各把手的速度均不超过 2 m/s。调头路径是由两段相切的圆弧组成的 S 形曲线,龙头前把手的行进速度在调头过程中可以变化,但每个把手的速度不能超过 2 m/s。

解题目标:

1、计算每个把手的速度:根据舞龙队在调头路径上的行进状态,计算每个把手在不同时间点的速度。

2、确定龙头的最大行进速度:通过调整龙头的速度,确保所有把手的速度均不超过 2 m/s。

4.5.2模型建立与求解

1.调头路径模型

2.每节板凳的速度计算

3.速度限制

模型求解

1. 初始化

2. 递推计算

3. 输出结果

4.5.3模型结果与分析

结果分析与说明

该图展示了舞龙队在调头过程中各节板凳(把手)的速度分布情况,横轴为板凳节数(共 223 节),纵轴为每节板凳的速度,图中的结果说明如下:

1. 蓝色曲线表示每节板凳的速度分布

随着板凳位置的变化,速度从龙头(位置 1)到龙尾(位置 223)逐渐减小。

在整个调头路径中,最前面的龙头速度为 ...

2. 红色虚线表示最大允许速度

红色虚线表示板凳的最大允许速度 蓝色曲线在所有点上都位于红色虚线下方,表示每节板凳的速度均未超过最大允许速度,符合题目要求。

3. 龙头的最大行进速度

通过代码计算得出,龙头的最大行进速度为 ...

如果龙头速度超过 ...

总结

该图表明...

五、模型评价与推广
5.1模型的优点
贴近实际生产场景
多环节协同优化
灵活适用的决策方案
可量化的成本与收益
5.2模型的不足
忽略了动态因素
未考虑生产中的不确定性
简化的成本结构
5.3模型的推广
应用于其他制造业领域:
结合动态环境下的优化:
引入多目标优化:
与智能制造结合:
参考文献
...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值