【数学建模】国赛真题分析 2014A题 嫦娥三号软着陆轨道设计与控制策略

2014A题 嫦娥三号软着陆轨道设计与控制策略

优秀论文合集:
链接:https://pan.baidu.com/s/1NtSBfE-jCXXpwhLOX1InXQ?pwd=uon1
提取码:uon1
–来自百度网盘超级会员V6的分享

题目下载地址
http://www.mcm.edu.cn/html_cn/node/93b5f5d9986693c2ebd67962cdc7d9df.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SF7BrdpX-1688196030588)(2023-07-01-10-32-34.png)]](image-1.png)
嫦娥三号于2013年12月2日1时30分成功发射,12月6日抵达月球轨道。嫦娥三号在着陆准备轨道上的运行质量为2.4t,其安装在下部的主减速发动机能够产生1500N到7500N的可调节推力,其比冲(即单位质量的推进剂产生的推力)为2940m/s,可以满足调整速度的控制要求。在四周安装有姿态调整发动机,在给定主减速发动机的推力方向后,能够自动通过多个发动机的脉冲组合实现各种姿态的调整控制。嫦娥三号的预定着陆点为19.51W,44.12N,海拔为-2641m(见附件1)。

嫦娥三号在高速飞行的情况下,要保证准确地在月球预定区域内实现软着陆,关键问题是着陆轨道与控制策略的设计。其着陆轨道设计的基本要求:着陆准备轨道为近月点15km,远月点100km的椭圆形轨道;着陆轨道为从近月点至着陆点,其软着陆过程共分为6个阶段(见附件2),要求满足每个阶段在关键点所处的状态;尽量减少软着陆过程的燃料消耗。

根据上述的基本要求,请你们建立数学模型解决下面的问题:
(1)确定着陆准备轨道近月点和远月点的位置,以及嫦娥三号相应速度的大小与方向。
(2)确定嫦娥三号的着陆轨道和在6个阶段的最优控制策略。
(3)对于你们设计的着陆轨道和控制策略做相应的误差分析和敏感性分析。

附件1: 问题的背景与参考资料;
附件2: 嫦娥三号着陆过程的六个阶段及其状态要求;
附件3:距月面2400m处的数字高程图;
附件4:距月面100m处的数字高程图。

基本概念解释

惯性系和非惯性系

惯性系和非惯性系是物理学中用来描述物体运动状态的两个基本概念。

  1. 惯性系(Inertial Frame of Reference):惯性系是指一个参考系,在该参考系中,物体若受到力的作用,则会产生加速度。在惯性系中,牛顿定律成立,即物体没有受到外力时保持静止或匀速直线运动。

  2. 非惯性系(Non-Inertial Frame of Reference):非惯性系是指一个以变速运动的参考系。在非惯性系中,由于观察者所处的系统自身有加速度,所以物体可能出现表面上没有力的情况下产生加速度的现象。这是因为在非惯性系中,存在一个惯性力,这个力与观察者的加速度成正比,且方向相反。

在非惯性系中,为了使牛顿定律仍然成立,我们需要引入惯性力来解释观察到的现象。常见的非惯性系包括旋转参考系、加速度参考系等。

例如,当我们在车辆上突然刹车或加速时,乘坐车辆的人会感到向前或向后摆动。这个摆动的原因是人体本身具有惯性,当车辆加速或减速时,人体受到一个向后或向前的惯性力,产生摆动的现象。

总结起来,惯性系是指一个参考系,在其中牛顿定律成立,物体若受到力的作用则会产生加速度;非惯性系是指一个变速运动的参考系,物体可能在表面上没有力的情况下产生加速度,此时需要引入惯性力来解释观察到的现象。

椭圆

椭圆是一个经典的几何学概念,它是平面上一组点构成的集合,这组点到两个给定的焦点的距离之和是一个常数。椭圆可以看作是一个拉伸的圆形,具有一些独特的性质。

以下是一些关于椭圆的基本特征:

  1. 焦点:椭圆有两个焦点,分别记作 F1 和 F2。每个点都是焦点-直线距离之和等于常数的定义点。

  2. 长轴和短轴:通过两个焦点绘制的直线称为长轴,它的长度为2a;与长轴垂直并通过椭圆中心的直线称为短轴,它的长度为2b。a 和 b 之间的关系是 a > b。

  3. 半长轴和半短轴:长轴长度的一半称为半长轴(a),短轴长度的一半称为半短轴(b)。

  4. 离心率:离心率(e)定义为焦点与椭圆中心之间的距离与半长轴的比值。它是椭圆的形状特征之一,范围介于0和1之间。当离心率为0时,椭圆退化为一个圆;当离心率接近1时,椭圆趋近于变成一个细长的形状(称为扁平椭圆)。

  5. 焦距:焦距是两个焦点之间的距离,等于2ae,其中e是离心率。

  6. 焦半径:焦半径是从椭圆上任意一点到两个焦点的距离之和。

  7. 方程式:椭圆的标准方程是(x/a)^2 + (y/b)^2 = 1,其中a和b是半长轴和半短轴的长度。

椭圆在数学、物理、工程以及其他许多领域中都有广泛的应用。它们具有对称性和良好的几何特性,因此在设计曲线、天体力学、光学系统等方面起着重要作用。同时,椭圆还是椭圆积分、焦散等概念的基础。

牛顿定律

牛顿定律,也称为牛顿运动定律,是经典力学的基础之一,由英国物理学家艾萨克·牛顿在17世纪提出。它描述了物体运动状态与作用在物体上的力之间的关系。

牛顿定律包括三个定律:

  1. 牛顿第一定律(惯性定律):如果一个物体受到合力为零的作用,它将保持静止或以恒定速度直线运动(即匀速直线运动)。这意味着物体在没有外力作用时具有惯性,不会改变其状态。

  2. 牛顿第二定律(运动定律):当作用于一个物体上的合力不为零时,物体将产生加速度,其大小与合力成正比,与物体的质量成反比。用数学公式表示为 F = ma,其中 F 是合力,m 是物体的质量,a 是物体的加速度。

  3. 牛顿第三定律(作用-反作用定律):任何两个物体之间的相互作用力都是相等且方向相反的。换句话说,如果物体 A 对物体 B 施加一个力,那么物体 B 对物体 A 也会施加一个力,且这两个力大小相等、方向相反。

牛顿定律是经典力学的基础,描述了物体运动以及力的性质和行为。它被广泛应用于工程、天体力学、运动学、静力学等领域,并为后续科学理论的发展奠定了基础。但需要注意的是,牛顿定律对宏观物体运动的描述,在微观粒子、相对论和量子力学等领域可能不适用,需要采用更加精确的理论模型。

开普勒定律

开普勒定律是描述行星运动的定律,由德国天文学家约翰内斯·开普勒在17世纪提出。这些定律揭示了行星绕太阳旋转的规律,为日心说提供了重要的支持。

开普勒定律包括以下三个定律:

  1. 第一定律(椭圆轨道定律):行星绕太阳运动的轨道是一个椭圆,太阳位于椭圆的一个焦点上。

  2. 第二定律(面积速度定律):在相等时间内,行星与太阳连线所扫过的面积是相等的。这意味着当行星离太阳较近时,它的速度会增加;当行星离太阳较远时,它的速度会减小。

  3. 第三定律(调和定律):行星绕太阳的轨道周期的平方与它的平均距离的立方成正比。用数学公式表示为 T^2 = k * R^3,其中 T 是轨道周期,R 是平均距离,k 是一个常数。

这些定律揭示了行星运动的规律,帮助我们理解了行星在太阳系中的运动方式。开普勒的发现为后来牛顿引力定律的建立提供了重要依据,对天体力学和宇航科学的发展起到了重要作用。

需要注意的是,开普勒定律适用于太阳系中的行星运动,对于其他恒星系统或者宇宙其他部分的天体运动可能存在差异。同时,开普勒定律是经验性的,牛顿引力定律提供了更为深入的解释和基础。

曲率半径

曲率半径是描述曲线曲率大小的物理量,通常用符号 R 表示。它是指某一点上曲线的切线与曲线在该点附近的凸侧(或凹侧)相切的圆的半径。

对于平面曲线而言,曲率半径可以通过以下公式计算:
R = (1 + (dy/dx)2)(3/2) / |d2y/dx2|

其中,dy/dx 是曲线在该点处的斜率,d2y/dx2 是曲线的二阶导数。|d2y/dx2| 表示取二阶导数的绝对值。

曲率半径越小,表示曲线的曲率越大,弯曲程度更强。当曲率半径为无穷大时,即为一条直线。

曲率半径在物理学和工程学中有广泛应用。例如,在光学中,曲率半径被用来描述透镜的形状和光线的折射;在道路设计中,曲率半径用来评估道路的转弯半径和行驶安全性等。

天体运动常用公式

天体运动常用的公式包括牛顿引力定律和开普勒定律。下面是这两个定律的常用公式:

  1. 牛顿引力定律:
    F = G * (m1 * m2) / r^2

    其中,F 是两个天体之间的引力大小,G 是万有引力常数,m1 和 m2 是两个天体的质量,r 是它们之间的距离。

  2. 开普勒第三定律:
    T^2 = (4π^2 / G * (m1 + m2)) * a^3

    其中,T 是行星绕恒星一周所需的时间(轨道周期),G 是万有引力常数,m1 和 m2 分别是恒星和行星的质量,a 是行星轨道的半长轴。

当涉及到天体运动时,还有一些其他常用的公式和方程,包括但不限于以下几个:

  1. 圆周运动的速度:
    v = 2πr / T

    其中,v 是物体在圆周轨道上的线速度,r 是轨道半径,T 是轨道周期。

  2. 圆周运动的加速度:
    a = v^2 / r = 4π^2r / T^2

    其中,a 是物体在圆周轨道上的向心加速度。

  3. 开普勒第二定律的面积速度定律(针对椭圆轨道):
    dA / dt = 0.5 * r^2 * dθ / dt

    其中,dA / dt 是行星与太阳连线所扫过的面积的变化率,r 是行星到太阳的距离,dθ / dt 是行星在轨道上的角速度。

  4. 行星轨道的离心率计算:
    e = (r_max - r_min) / (r_max + r_min)

    其中,r_max 和 r_min 分别是椭圆轨道的最大半径和最小半径。

数学模型的误差分析和灵敏度分析

数学模型的误差分析和灵敏度分析是对模型进行评估和改进的重要工具。它们帮助我们了解模型的稳定性、可靠性以及对输入参数的响应程度。

误差分析(Error Analysis)关注的是模型的输出与实际观测值或真实情况之间的差异。它帮助我们评估模型的精确性和准确性,并确定模型中存在的误差来源。常见的误差类型包括:随机误差、系统误差、模型结构误差等。通过误差分析,我们可以定量评估模型的预测能力,并识别需要改进的方面。常用的误差度量指标包括平均绝对误差(MAE)、均方误差(MSE)和均方根误差(RMSE)等。

灵敏度分析(Sensitivity Analysis)旨在研究模型输出对输入参数变动的响应程度。它帮助我们了解模型对不同参数值的敏感程度,从而评估模型的稳定性和可靠性。灵敏度分析可以采用不同的方法,包括一次性变动一个参数、一次性变动多个参数、逐步变动参数等。常见的灵敏度分析方法包括参数敏感度分析、全局灵敏度分析、局部灵敏度分析等。通过灵敏度分析,我们可以确定哪些参数对模型的输出影响最大,有助于优化模型设计和参数选择。

误差分析和灵敏度分析是数学模型评估与改进的重要手段,它们帮助我们了解模型的准确性、稳定性和可靠性,并指导模型的改进和优化。同时,它们也有助于提高数学模型的可解释性和应用范围,从而更好地支持决策和问题求解。

imread

https://ww2.mathworks.cn/help/matlab/ref/imread.html

根据您提供的信息,imread 是一个常用的函数,用于从图像文件中读取图像数据。它是图像处理库中的一个函数,可以用于加载图像文件到内存中以供后续处理和分析。
在Python中,可以使用OpenCV库中的imread函数来读取图像文件。以下是一个示例代码:

import cv2
# 读取图像文件
image = cv2.imread('image.jpg')
# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,image.jpg 是待读取的图像文件的路径。imread 函数将图像文件加载到image 变量中,然后可以对图像进行进一步的处理和分析。imshow 函数用于显示图像,waitKey(0) 等待用户按下键盘上的任意键,destroyAllWindows 用于关闭图像显示窗口。
需要注意的是,imread 函数的参数可以是图像文件的路径,也可以是一个URL地址。此外,imread 函数还可以选择不同的参数来解析和处理图像,例如指定图像的通道数、颜色空间等。具体的参数设置可以根据需要进行调整。

关于比冲

比冲或比冲量是对一个推进系统的燃烧效率的描述。比冲的定义为:火箭发动机单位质量推进剂产生的冲量,或单位流量的推进剂产生的推力。比冲的单位为米/秒(m/s),并满足下列关系式:
,其中是发动机的推力,单位是牛顿;是以米/秒为单位的比冲;是单位时间燃料消耗的公斤数。

关于月球参数

月球平均半径、赤道平均半径和极区半径分别为1737.013km、1737.646km和1735.843km,月球的形状扁率为1/963.7256,月球质量是7.3477×1022kg。月球与地球距离最远(远地点):406610km,最近(近地点):356330km,平均距离为384400km。

NASA月球勘测轨道飞行器使用的月面海拔零点,是月球的平均半径所在的高度。所以,嫦娥三号着陆点的海拔为-2640m,即该点到月球中心的距离要比月球的平均半径少2640m。

题目分析

根据所提供的信息,我们可以根据以下步骤进行数学建模和解决问题:
(1) 确定着陆准备轨道的位置和速度:

  • 近月点的位置:根据要求,近月点距离月球中心的距离为15km。由于未提供月球的半径信息,我们无法确定近月点相对于月球表面的位置。
  • 远月点的位置:根据要求,远月点距离月球中心的距离为100km。同样地,由于未提供月球的半径信息,我们无法确定远月点相对于月球表面的位置。
    在给定位置的情况下,可以通过计算来确定嫦娥三号相应的速度大小和方向。

(2) 确定嫦娥三号的着陆轨道和最优控制策略:

  • 着陆轨道:根据要求,着陆轨道是从近月点至着陆点的轨道段。根据附件2所提供的信息,软着陆过程共分为6个阶段。我们可以通过数学模型求解着陆轨道,使得满足每个阶段在关键点的状态要求。
  • 最优控制策略:为了减少软着陆过程中的燃料消耗,我们可以采用最优控制策略。这需要考虑到多个因素,包括燃料消耗、推进剂的质量变化、推力方向的调整等。最优控制策略可以通过数学优化方法来求解,以实现在给定约束条件下最小化燃料消耗的目标。
    (3) 误差分析和敏感性分析:
    对于设计的着陆轨道和控制策略,我们可以进行误差分析和敏感性分析。这可以包括考虑不同的初始条件和参数误差,以评估系统的稳定性和可靠性。我们可以通过数值模拟和系统仿真来进行误差分析和敏感性分析,以评估设计的轨道和控制策略对于不确定性的鲁棒性和适应性。

对于问题的详细分析,我们将按照步骤(1)、(2)和(3)依次进行。
(1)确定着陆准备轨道近月点和远月点的位置,以及嫦娥三号相应速度的大小与方向。
由于未提供月球的半径信息,我们无法确定近月点和远月点相对于月球表面的位置。但是我们可以假设月球的半径为R,那么近月点的位置就是R+15km,远月点的位置就是R+100km。
要确定嫦娥三号相应速度的大小与方向,我们可以使用开普勒定律和牛顿运动定律来计算。
根据开普勒定律,我们可以计算嫦娥三号在近月点和远月点的速度大小。速度大小由以下公式给出:
v = sqrt(GM / r)
其中,G是引力常数,M是月球的质量,r是嫦娥三号与月球中心的距离。
根据牛顿运动定律,我们可以计算嫦娥三号在近月点和远月点的速度方向。速度方向与加速度方向相同,加速度由以下公式给出:
a = F / m
其中,F是嫦娥三号所受的合力,m是嫦娥三号的质量。
(2)确定嫦娥三号的着陆轨道和在6个阶段的最优控制策略。
为了确定嫦娥三号的着陆轨道和最优控制策略,我们可以采用数学建模和优化方法。以下是一个可能的方法:

  • 首先,建立嫦娥三号的运动方程和约束条件。这可以通过牛顿运动定律和航天器运动学原理来建立。
  • 其次,将问题转化为一个最优控制问题。我们可以采用动态规划或者最优控制理论中的方法,将问题转化为一个优化过程,以最小化燃料消耗为目标。
  • 接下来,可以采用数值优化方法,如线性规划、非线性规划或动态规划等方法,来求解最优控制问题。这将涉及到计算的迭代过程,以逐步优化控制策略。
  • 最后,通过仿真和实验验证,评估设计的着陆轨道和控制策略的性能和可行性。
    (3)对于设计的着陆轨道和控制策略做相应的误差分析和敏感性分析。
    误差分析和敏感性分析可以用于评估着陆轨道和控制策略的鲁棒性和可靠性。以下是一些可能的分析方法:
  • 误差分析:可以考虑不同的初始条件和参数误差,以评估系统的稳定性和预测性能。
  • 敏感性分析:可以通过改变关键参数的值,来评估系统对参数变化的敏感程度,以确定系统的鲁棒性和适应性。

这些分析可以通过数值模拟和系统仿真来进行,以评估设计的轨道和控制策略在不确定性条件下的表现。
需要指出的是,由于缺乏具体的数学模型和数据,我们无法给出问题的详细解答。上述的分析方法只是一个指导,具体的数学模型和计算方法需要根据更详细的要求和数据进行进一步的研究和分析。因此,为了解决问题,我们建议您进行进一步的研究,并根据具体情况来设计数学模型和计算方法。

摘要

根据给定的排版要求,下面是重新排版过的内容:

摘要:
本题以嫦娥三号登月为背景,分析了登月轨道参数,并重点讨论了着陆轨道设计优化。同时对所使用的优化方案进行了误差分析与灵敏度分析。

第一问中,由于正面求解条件有限,难以直接得到近月点和远月点的位置以及准备轨道参数。因此,利用逆推思路,通过已知条件求解主减速阶段运动过程,并通过水平位移量反推近月点位置。通过物理知识和工程经验,建立了微分方程模型,并将其离散化为差分方程组。通过计算机模拟行为,拟合出最接近解的轨迹,得到近月点位置为19.51°W,31.50°N,距月面15km,速度为1692.46m/s,方向指向预期落点;远月点位置为160.49°E,31.50°S,距月面100km,速度为1612.15m/s,方向与近日点反向平行。

第二问中,按照题意将其分为五个阶段。前两个阶段利用二体模型和力学方程组进行分析,并对约束条件进行归一化处理。为了进行优化,列出全部归一化约束条件,并建立了非线性规划模型。然后使用序列化遗传算法对其进行筛选,逼近全局最优解,得到此阶段的燃耗为1055.39kg。第二阶段也是复杂的多变量优化问题,采用遗传算法求解该阶段的全局最优解,最终燃耗为26.71kg。第三和第四阶段主要涉及图像处理和统计分析。通过对高程图进行K均值聚类分析,得到安全点和危险点的像素分布情况,进而对地图进行栅格化,并对方格内点类型进行统计。通过扩大寻找最大安全半径,并综合考虑水平偏移量,建立合理的落点评价体系,找出最优点坐标(1275,1000),燃耗为86.97kg。第四阶段类似地进行聚类分析,根据嫦娥三号实际体积选取合适的栅格大小,并使用最小二乘法对空间进行线性统计回归,求得平均坡面和平均坡度。结合最大安全半径建立最优落点评价体系,最终获得最优落点坐标为(88,56),燃耗为20.68kg。第五阶段的最优燃耗为8.09kg。最后,对简化运动模型进行了讨论,简化了后几个阶段的运动学分析和计算。综合各段最优解,得到最优着陆轨道与控制策略。

对于第三问,总结了优化模型中引入的一些误差因素,并对主要因素进行了数值上的相对误差分析,证明误差对优化方案影响较小。同时分析了初始变量和约束条件的波动对结果的影响,发现角度控制向量的灵敏性较高,而其他因素的灵敏性较低,说明优化方案不敏感于初值,并且可以逼近全局最优解。

**关键词:**非线性规划模型、序列化遗传算法、K均值聚类、空间线性回归、二体模型

一.问题的提出

1.1 背景介绍

根据计划,嫦娥三号将在北京时间12月14号在月球表面实施软着陆。嫦娥三号如何实现软着陆以及能否成功成为外界关注焦点。目前,全球仅有美国、前苏联成功实施了13次无人月球表面软着陆。

北京时间12月10日晚,嫦娥三号已经成功降轨进入预定的月面着陆准备轨道,这是嫦娥三号“落月”前最后一次轨道调整。在实施软着陆之前,嫦娥三号还将在椭圆轨道上继续飞行,做最后准备。

嫦娥三号着陆地点选在较为平坦的虹湾区。但由于月球地形的不确定性,最终“落月”地点的选择仍存在一定难度。在整个“落月”过程中,“动力下降”被业内形容为最惊心动魄的环节。在这个阶段,嫦娥三号要完全依靠自主导航控制,完成降低高度、确定着陆点、实施软着陆等一系列关键动作,人工干预的可能性几乎为零。在距月面100米处时,嫦娥三号要进行短暂的悬停,扫描月面地形,避开障碍物,寻找着陆点。

1.2 问题重述

嫦娥三号在着陆准备轨道上的运行质量为2.4t,其安装在下部的主减速发动机能够产生的推力可调节,变化范围为1500N到7500N,其比冲为2940m/s,可以满足调整速度的控制要求。在四周安装有姿态调整发动机,能够自动通过多个发动机的脉冲组合实现各种姿态的调整控制。嫦娥三号的预定着陆点为19.51W,44.12N,海拔为-2641m。

嫦娥三号在高速飞行的情况下,要保证准确地在月球预定区域内实现软着陆,关键问题是着陆轨道与控制策略的设计。其着陆轨道设计的基本要求:着陆准备轨道为近月点15km,远月点100km的椭圆形轨道;着陆轨道为从近月点至着陆点,其软着陆过程共分为6个阶段,要求满足每个阶段在关键点所处的状态,尽量减少软着陆过程的燃料消耗。

根据上述的基本要求,建立数学模型解决下面的问题:
(1)确定着陆准备轨道近月点和远月点的位置,以及嫦娥三号相应速度的大小与方向。
(2)确定嫦娥三号的着陆轨道和在6个阶段的最优控制策略。
(3)对设计的着陆轨道和控制策略做相应的误差分析和敏感性分析。

二.问题的分析

2.1 问题一

题目已经给出准备轨道的形状参数,根据已有的物理知识和几何关系,可以计算近月点和远月点处的速度大小和月面相对速度的方向。然而,由于无法确定近月点和远月点的位置,需要其他条件来推测。在现有条件下,可以通过逆推近月点,并结合地月轨道制动的实际情况来综合考虑。根据相关报道和NASA在1976年提出的线性正切制导率,主减速阶段通常采用恒定推力作用在轨道切线上进行制导。因此,我们可以建立二体模型,利用已知条件和微分方程组进行计算机模拟,以求得降落弧线距离,从而反推近月点,并对称地得出远月点。

2.2 问题二

根据问题一得到的近月点和每个阶段的状态,可以大致确定降落轨道的范围,但精确路径需要通过策略优化来控制。在每个阶段中,燃料消耗与推力在时间上的积累量成正比,即减小推力的冲量可以优化燃料消耗。

针对第一个阶段,由于推力较大且历时较长,燃料消耗主要发生在这个阶段。因此,优化策略应该重点考虑这个阶段。由于有二体模型,可以建立微分方程模型,并根据初值条件和阶段限定条件构建非线性约束条件。将问题转化为轨道优化的非线性规划问题,一般可通过成熟的 SQP 算法可以得到全局最优解,但本题采用了更为常见也相对传统的遗传算法,逼近全局最优解,得出最优方案。

对于第二阶段,目标是使水平速度为零,并且推力迅速减小。根据上一阶段的优化结果,可以得到末速度的水平分量。由于冲量是可分解的,因此可以将这个阶段分解为水平和竖直方向上的两个变速直线运动模型。这简化了优化模型,并可以通过求解这两个局部最优解来得到整个阶段的全局最优解。

第三阶段的水平速度初始为零。通过对月面进行成像分析,并制定平坦度评价体系,可以选择距离中心点最近且满足平坦度要求的区域中心作为粗调整的目标降落点。由于在这个阶段结束时水平速度减为零,可以对推力进行优化,以获得局部燃料最优解。

第四阶段是悬停阶段,进行精细成像和分析。同样,制定平坦度评价体系并选择距离中心点最近且满足平坦度要求的区域中心作为最终目标降落点,修正轨道。在结束时水平速度仍为零,因此同样需要进行优化过程。

第五和第六阶段是减速至零然后自由下落的过程。可以考虑对减速阶段进行优化,可以通过简单讨论得出结果。最终根据每个阶段的最优方案,可以模拟出嫦娥三号的着陆轨道。

2.3 问题三

为了分析设计轨道和控制策略的误差和敏感性,有必要制定误差指标,并考虑各部分误差对结果的最大影响。敏感性分析也需要采用类似的思路,衡量各个阶段微小变化对结果产生的影响。另外,也许还需要寻找参考物以评估该方案的优劣。

三.模型假设

  1. 由于月球自转速度为27.3d,十分缓慢,而着陆过程仅有十几分钟,因此在本题中月球不考虑自转;
  2. 由于月球扁率很小,可认为月球为球体,半径以平均半径为准,并且引力场分布均匀;
  3. 由于侧面姿态调整喷射装置对燃料影响很小,为简化模型,认为飞行器变换姿态的过程不消耗燃料;
  4. 认为飞行器变换姿态是瞬间完成的;
  5. 由于着陆时间较短,所以诸如月球引力非球项、日月引力摄动等影响因素均可忽略不计;
  6. 推力大小可瞬间改变;
  7. 燃料除供给推力外,无任何其他耗散方式;
  8. 月球空气稀薄,不考虑任何摩擦力;
  9. 由于预定着陆点海拔为-2641m,因此在着陆过程中所使用的高度均不应是海拔高度,而是相对于着陆点海拔的高度。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LHUCSBKx-1688196030589)(image-3.png)]

五.模型建立与求解

### 5.1 问题一

5.1.1 模型建立

为了确定近月点和远月点,正常的思路是求出椭圆轨道所在平面以及椭圆长轴在空间中的位置,但本题仅给出了轨道两点的高度信息以及平均半径,还有根据常识推断出的预定着陆点在椭圆平面内,除此之外并无其他信息,因此从现有条件准确判断两点的位置是不可能的。因此,本题应采用逆推思路,由着陆轨道的第一个阶段反推近月点。

先对轨道参数进行分析,已知近月点高度 Hc=15km,远月点高度 Hf=100km,月球平均半径为 R=1737.013km,轨道为椭圆。如图 5.1.1.1.

图 5.1.1.1 近月轨道示意图(为了方便示意,本图不符合比例)

由开普勒定律,任何椭圆天体轨道的中心天体一定在椭圆的一个焦点上。则由椭圆几何性质,可以近似得出方程:

a+c=Hf+R
a-c=Hc+R

联系万有引力定律与牛顿第二定律,可以列出嫦娥三号在近月点和远月点的运动学方程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BVWtzvhk-1688196030589)(image-4.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WZ7giMey-1688196030590)(image-5.png)]

问题2

5.2 问题二

本题是一个多因素优化问题,目标是减少燃料消耗并选择最平坦的着陆区域。燃料消耗与推力直接相关,即 F = η * m,其中 η = 2940 / m/s 为比冲,表示单位质量的燃料产生的推力。这个公式左边表示推力在时间上的积累量,右边表示燃料消耗在时间上的积累量。由于比冲是常数,推力的冲量与燃料消耗成正比,所以优化目标与力学量直接相关,便于分析。

另外,根据动量定理,近似处理下,我们也可以将燃料消耗与速度变化联系起来。

5.2.1 模型建立与求解过程一

根据5.1的计算过程可知,主减速阶段是着陆过程中用时最长、燃料消耗最大的阶段。该阶段的主要任务是消除初始的水平速度,因此优化主减速阶段的推进剂消耗是最重要的设计目标,也是整个着陆轨道燃料消耗优化的关键。

嫦娥三号的主减速阶段是从近月点降落到预定地点3的过程,在这个过程中时间非常短,只有几百秒,所以可以不考虑月球的引力摄动。由于月球自转速度较小,也可以忽略不计。因此,我们可以将问题简化为一个二体模型,如图5.2.1.1所示。以月球质心为原点建立平面直角坐标系,设嫦娥三号距离月球质心的距离为r,极角为θ,角速度为ω,质量为m;同时设嫦娥三号在r方向上的速度为v,主减速发动机的推力为F(在本题中为固定值)。发动机推力与当地水平线的夹角即为推力的方向θ,比冲为ISP;同时设月球的引力常数为μ。

首先,从运动学的角度进行分析。根据动力学基本方程可以得到:

dr/dt = v (①)

同理,可以得到角度变化的关系式为:

dθ/dt = ω (②)

燃料消耗可以表示为:

∫(Fdt/m) = ∫(ISPdv/v) (③)

其中,ISP为比冲,单位为米/秒,F为总推力,m为质量,v为速度。

在主减速阶段,嫦娥三号质量是变化的,会随着燃料消耗而减少。所以在计算燃料消耗时需要考虑嫦娥三号的质量变化。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NYDV8rux-1688196030590)(image-6.png)]

问题3

5.3 问题三

5.3.1 误差分析
本模型包含许多近似处理和理想化模型,以及一些拟合优化算法和近似计算方法。这些因素都会引入各种大小不等的误差。主要的误差来源包括忽略了月球扁率与地球引力摄动的理想化假设、姿态调整燃耗的忽略、调整姿势和推力大小改变所需时间的忽略、月球自转的忽略、快速调整阶段水平位移对计算近月点的影响的忽略、将二体问题的微分方程转化为差分方程产生的误差、遗传算法对全局最优解逼近的误差、在分析优化条件和计算时忽略质量变化,以及忽略悬空时间、栅格化网络划分格线时的考虑不足、使用最小二乘法计算格内平均坡度时的统计误差等。下面重点考察几个主要会引入较大误差的因素。

(1) 月球自转速度为27.3d,整个下落过程大约500s,月球转过的角度为0.0763°,即近月点实际经度约为19.43°,用1°来衡量相对误差为0.39%。但实际上这个度数对应的弧长有2313.14m,可以说误差数值本身还是很大的。

(2) 快速调整阶段水平位移大约600m,对应月面弧度为0.0198°,因此实际近月点纬度约为31.47°,相对误差为0.06%。这个误差并不算大,也证实了快速调整阶段水平位移对于主减速阶段可忽略。

(3) 关于推力大小突变的假设,若按照实际情况来讲,燃料提供的推力一定伴随着一个渐变的过程。设推力均匀减小,假如推力由7500N变为1500N需要1s过渡时间,若质量为2000kg的飞行器,质量不变,直线运动,则可求出末速度为2.25m/s。若改为前0.5s中推力为7500N,后0.5s中推力为1500N,则可算出末速度为2m/s。对比可知,忽略变化时间会导致的最大相对误差为11%,这个误差确实不小。然而,所幸的是,在整个过程中,推力基本都在小范围内波动,即使在快速调整阶段,推力变化不超过4000N,因此,相对误差可以控制在较低水平(5%左右)。

(4) 栅格单元格内部由于采用了过半取整的方法,会造成对全体考虑信息不全的情况。例如,当两个方格交界处数值较高,而其余部分均较低时,这时,两个格都会被认定为安全格,但实际上存在一小部分凸起,若将两方格位置同步左移半格,会发现有一个危险格。这类误差会定量影响到一些安全格的最大安全半径,导致综合评价指标倍放大,但由于格点数量众多,在统计角度上可以忽略这个问题。

(5) 微分方程离散化所引入的误差,由于时间微元取得非常小(小于0.1s),因此基本符合微分思想。再加上拉格朗日中值估算法的存在,可以证明引入的误差远小于1%,可以忽略不计。

(6) 忽略质量变化产生的影响,可以使用简单的运动过程来解释。假设质量为1000kg的飞行器向下匀速运动10s,则可知加速度为0,重力与推力相同。忽略质量变化,得到这一段燃耗为5.51kg;若考虑质量变化,则:

其中F和m都是t的函数,解得燃耗为5.49kg。可知,实际燃耗比忽略质量的燃耗小,相对误差为0.36%,十分小。由于忽略质量变化主要用于后续阶段的分析,而这些阶段都很快,因此误差不会超过5%以上,是可以接受的。

5.3.2 敏感性分析
由于本题初始条件较少,并且有许多常数被认为是定值,不会引起敏感性波动。因此,敏感性分析限制在个别初始条件上:
如果最大推力增减1N,仿真结果几乎没有变化,曲线基本保持一致。事实上,即使变化10N甚至100N,落点位置或速度也没有明显变化。可以看出,最大推力对轨道的影响非常不敏感,允许波动范围至少1.3%。
对于角度方案的7个多项式系数,监视遗传算法中间个体发现,即使这些参数的波动范围不到1%,结果也可能有较大变化。特别是高次项系数,简单的波动会被高次幂放大,导致飞船偏离轨道。因此,对于本优化模型的角度规划方案,任何甚至1%的偏差都是不允许的,因为会产生严重后果,敏感性非常强。
至于近月点的位置,由于遗传算法对初始值不敏感,即使初始位置发生较大变化,它仍然能从众多代中逐渐筛选出优良个体,满足终止条件。可以说,遗传算法本身的自适应性保证了优化策略对近月点选取的不敏感性。

六. 模型优缺点

6.1 问题一的模型评价:

该模型采用了逆推的思路,并使用基本微分方程模型进行拟合,通过航天学经验计算出近月点。微分方程模型本身是无误差的,尽管难以求解,但在离散化后,采用拟合曲线的方式逼近,误差仍然很小。然而,这个模型并不是正常的设计过程,如果条件允许,应该建立一个航空力学模型,结合地球出发、制动、变轨等一系列因素,综合考虑当天月球位置和月面方向,模拟登月过程,并解出近月点。然而,此模型过于复杂,条件要求非常高,实际可操作性较低。

6.2 问题二的模型评价:

此问题主要由两类模型组成。第一类是二体模型,属于经典天体模型,没有误差,但求解困难,只能采用遗传算法进行筛选,逼近全局最优解。第二类是地形分析模型,制定了平坦度、偏移量、平均坡度等相关评估参数,综合使用各类统计算法进行图像分析。可以发现,这两类模型均没有理论最优解,只能通过筛选或统计等方法逼近最优解,但由于模型数量庞大,合理选择参数和权重可以无限逼近全局最优解。然而,在本题中,模型分解为六个小段,每个分段具有不同的约束条件,虽然存在一定的联系,但通常应该将六个状态联立起来,获得完整的全局模型,并进行全局优化,得到的结果才能被认为是全局最优解。而本题将问题分解,每个阶段采用不同的优化方案,从而获得六个局部最优解。因此,该模型无法证明该最优策略一定是全局最优策略。

%calc_proc.m 计算第一问
%——————————————————————————————————————
——
T = 0.1;
t = 0;
x = 0; y = 0;
x2 = 0; y2 = 0;
Q = 6.5044; 
sita = 0 + Q/180*pi;
vx = 1692;
vy = 0;
m0 = 2400;
m = 2400;
N = 7500 / m0;
G = 3844.6 / m0;
r = 1749372;
H = 15000;
ax = N - vy*vx/r;
ay = G - vx^2/r;
hold on
xlabel '切向距离/m'
ylabel '高度/m'
history = [];
i = 0;
while (y>-12000 && m>1000)
 x2 = x + vx*T - 0.5*ax*T;
 y2 = y - vy*T - 0.5*ay*T;
 vx = vx - ax*T; 
 vy = vy + ay*T;
 r2 = 1749372 + y2;
 G = 3844.6/m0/(r^2)*(r2^2);
 m = m - 2.55*T;
 t = t + T;
 N = 7500 / m;
 if (vx == 0)
 if vy <= 0
 sita = pi/2;
 else
 sita = - pi / 2;
 end
23
 else
 sita = atan(vy/vx);
 end
 if (sita) <= 0
 sita = Q/180*pi;
 else
 if (sita + Q/180*pi) < pi/2
 sita = sita + Q/180*pi;
 else
 sita = pi / 2;
 end
 end
 ax = N * cos(sita) - vy*vx/r2;
 ay = G - N * sin(sita) - vx^2/r2;
 plot([x,x2],[H+y,H+y2],'black','LineWidth',2);
 x = x2; y = y2; r = r2;
 history = [history; (i-1)*T y vx vy sita];
 i = i + 1;
end
%——————————————————————————————————————
——
%calc_proc2.m 模拟第二问最优解情况
%——————————————————————————————————————
——
fit = [1.40416918137980e-15 -1.60164160878453e-12 6.03243487525863e-10 -
8.11660304591008e-08 4.29538060831470e-06 7.00969042524411e-05 
T = 0.1;
t = 0;
x = 0; y = 0;
x2 = 0; y2 = 0;
Q = 6.4;
sita = fit(7);
vx = 1692;
vy = 0;
m0 = 2400;
m = 2400;
N = 7500 / m0;
G = 3844.6 / m0;
r = 1749372;
H = 15000;
ax = N - vy*vx/r;
ay = G - vx^2/r;
hold on
24
xlabel '切向距离/m'
ylabel '高度/m'
history = [];
i = 0;
while (y>-12000 && m>1000)
 x2 = x + vx*T - 0.5*ax*T;
 y2 = y - vy*T - 0.5*ay*T;
 vx = vx - ax*T; 
 vy = vy + ay*T;
 r2 = 1749372 + y2;
 G = 3844.6/m0/(r^2)*(r2^2);
 m = m - 2.55*T;
 t = t + T;
 N = 7500 / m;
 sita = fit(1)*t.^6+fit(2)*t.^5+fit(3)*t.^4+fit(4)*t.^3+fit(5)*t.^2+fit(6)*t+fit(7);
 ax = N * cos(sita) - vy*vx/r2;
 ay = G - N * sin(sita) - vx^2/r2;
 plot([x,x2],[H + y,H + y2],'black', 'LineWidth',2);
 x = x2; y = y2; r = r2;
 history = [history; (i-1)*T y vx vy sita];
 i = i + 1;
end
if (m<=500)
 differ = 200000;
else
 differ = t;
end
if (abs(vx) > 10)
 differ = 200000;
end
if (abs(vy - 57) > 1)
 differ = 300000;
end
%——————————————————————————————————————
——
%calc1.m 函数,用以使用遗传算法求解
%——————————————————————————————————————
——
function [ differ ] = calc1( Q )
T = 0.1;
t = 0;
x = 0; y = 0;
x2 = 0; y2 = 0;
25
sita = Q*t;
vx = 1692;
vy = 0;
m0 = 2400;
m = 2400;
N = 7500 / m0;
G = 3844.6 / m0;
r = 1749372;
H = 15000;
ax = N - vy*vx/r;
ay = G - vx^2/r;
i = 0;
while (y>-12000 && m>1000)
 x2 = x + vx*T - 0.5*ax*T;
 y2 = y - vy*T - 0.5*ay*T;
 vx = vx - ax*T; 
 vy = vy + ay*T;
 r2 = 1749372 + y2;
 G = 3844.6/m0/(r^2)*(r2^2);
 m = m - 2.55*T;
 t = t + T;
 N = 7500 / m;
 if (vx == 0)
 if vy <= 0
 sita = pi/2;
 else
 sita = - pi / 2;
 end
 else
 sita = atan(vy/vx);
 end
 if (sita) <= 0
 sita = Q/180*pi;
 else
 if (sita + Q/180*pi) < pi/2
 sita = sita + Q/180*pi;
 else
 sita = pi / 2;
 end
 end
 sita = Q*t;
 ax = N * cos(sita) - vy*vx/r2;
 ay = G - N * sin(sita) - vx^2/r2;
 x = x2; y = y2; r = r2;
26
 i = i + 1;
end
if (m<=500)
 differ = 200000;
end
differ = abs(sqrt(vy^2+vx^2) - 57);
%——————————————————————————————————————
——
%calc2.m 函数,用以使用遗传算法求解
%——————————————————————————————————————
——
function differ = calc2(fit)
T = 0.1;
t = 0;
x = 0; y = 0;
x2 = 0; y2 = 0;
Q = 6.4;
sita = fit(7);
vx = 1692;
vy = 0;
m0 = 2400;
m = 2400;
N_altered = 7500;
N = N_altered / m0;
G = 3844.6 / m0;
r = 1749372;
H = 15000;
ax = N - vy*vx/r;
ay = G - vx^2/r;
i = 0;
while (y>-12000 && m>1000)
 x2 = x + vx*T - 0.5*ax*T;
 y2 = y - vy*T - 0.5*ay*T;
 vx = vx - ax*T; 
 vy = vy + ay*T;
 r2 = 1749372 + y2;
 G = 3844.6/m0/(r^2)*(r2^2);
 m = m - 2.55/7500*N_altered*T;
 t = t + T;
 N = N_altered / m;
 sita = fit(1)*t.^6+fit(2)*t.^5+fit(3)*t.^4+fit(4)*t.^3+fit(5)*t.^2+fit(6)*t+fit(7);
 ax = N * cos(sita) - vy*vx/r2;
27
 ay = G - N * sin(sita) - vx^2/r2;
 x = x2; y = y2; r = r2;
 i = i + 1;
end
if (m<=500)
 differ = 200000;
else
 differ = m0 - m;
end
if (abs(sqrt(vx^2+vy^2) - 57) > 1)
 differ = 300000;
end
%——————————————————————————————————————
——
%deal1.m 函数,用以处理 2400m 处的俯拍相片
%——————————————————————————————————————
——
cd('./');
A = imread('附件3 距2400m处的数字高程图.tif');
N = 460;
n = 2300 / N;
data = zeros(N,N);
[height, length] = size(data);
for i = 1:1:height
 for j = 1:1:length
 data(i,j) = sum(sum(A(round(n*(i-1)+1):round(n*i)-(round(n*i)>2300), round(n*(j-
1)+1):round(n*j)-(round(n*j)>2300))))/ round(n*n);
 end
end
data = uint8(round(data));
%imshow(data);
%第二个阶段,聚落分析平面
data3 = [];
for i = 1:1: N
 for j = 1:1:N
 data3 = [data3; data(i,j)];
 end
end
[Idx,C,sumD,D]=kmeans(double(data3),5);
C(1,3) = sum(C(:,1) < C(1,1)); C(1,2) = sum(Idx == 1);
C(2,3) = sum(C(:,1) < C(2,1)); C(2,2) = sum(Idx == 2);
C(3,3) = sum(C(:,1) < C(3,1)); C(3,2) = sum(Idx == 3);
C(4,3) = sum(C(:,1) < C(4,1)); C(4,2) = sum(Idx == 4);
28
C(5,3) = sum(C(:,1) < C(5,1)); C(5,2) = sum(Idx == 5);
GND = sum(C(:,3) .* (C(:,2) == max(C(:,2))));
data4 = zeros(N, N);
for i = 1:1:N
 for j = 1:1:N
 data4(i,j) = C(Idx((i-1)*N + j), 3);
 end
end
%surface(data4,'EdgeColor','none');
%第三个阶段选择合适区域
data2 = 1- (data4 == GND);
score = zeros(N, N);
for i = 1:1:height
 for j = 1:1:length
 if (data2(i,j) == 0)
 tmp = 1;
 while (tmp<=i && tmp<=N-i+1 && tmp<=j && tmp<= N-j+1 && 
sum(sum(data2(i-tmp+1:i+tmp-1, j-tmp+1:j+tmp-1))) == 0)
 tmp = tmp + 1;
 end
 tmp = tmp - 1;
 score(i,j) = tmp + 50 - exp(0.0027*sqrt((i-N/2)^2 + (j-N/2)^2)*n);
 end
 end
end
%surface(score,'EdgeColor','none');
%——————————————————————————————————————
——
%deal2.m 函数,用以处理 100m 处的俯拍相片
%——————————————————————————————————————
——
cd('./');
A = imread('附件4 距月面100m处的数字高程图.tif');
N = 100;
n = 1000 / N;
data = zeros(N,N);
[height, length] = size(data);
for i = 1:1:height
 for j = 1:1:length
 data(i,j) = sum(sum(A(round(n*(i-1)+1):round(n*i)-(round(n*i)>2300), round(n*(j-
1)+1):round(n*j)-(round(n*j)>2300))))/ round(n*n);
 end
end
29
data = uint8(round(data));
%imshow(data);
%第二阶段
%分析斜度
yuzumi = double(zeros(N,N));
N2 = 50;
n2 = 1000/N2;
ana_width = n2+10;
for i = 1:1:N2
 for j = 1:1:N2
 X = [];
 z = [];
 for x = max((i-1)*n2+1-(ana_width-n2), 1):1:min(i*n2+(ana_width-n2), 1000)
 for y = max((j-1)*n2+1-(ana_width-n2), 1):1:min(j*n2+(ana_width-n2), 1000)
 X = [X; 1, x, y];
 z = [z; double(A(x,y))];
 end
 end
 b = regress(z,X);
 arc = [b(2), b(3), 1];
 sita = acos(dot(arc,[0 0 1])/sqrt(dot(arc,arc)));
 yuzumi((i-1)*(N/N2)+1:i*(N/N2), (j-1)*(N/N2)+1:j*(N/N2)) = sita;
 end
end
heion = (max(max(yuzumi)) - yuzumi)/max(max(yuzumi));
%surface(heion,'EdgeColor','none');
%聚类分析
data3 = [];
for i = 1:1:N
 for j = 1:1:N
 data3 = [data3; data(i,j)];
 end
end
[Idx,C,sumD,D]=kmeans(double(data3),4);
C(1,3) = sum(C(:,1) < C(1,1)); C(1,2) = sum(Idx == 1);
C(2,3) = sum(C(:,1) < C(2,1)); C(2,2) = sum(Idx == 2);
C(3,3) = sum(C(:,1) < C(3,1)); C(3,2) = sum(Idx == 3);
C(4,3) = sum(C(:,1) < C(4,1)); C(4,2) = sum(Idx == 4);
GND = sum(C(:,3) .* (C(:,2) == max(C(:,2))));
data4 = zeros(N, N);
for i = 1:1:N
 for j = 1:1:N
 data4(i,j) = C(Idx((i-1)*N + j), 3);
 end
30
end
%surface(data4,'EdgeColor','none');
%第三个阶段选择合适区域
data2 = 1- (data4 == GND);
score = zeros(N, N);
for i = 1:1:height
 for j = 1:1:length
 if (data2(i,j) == 0)
 tmp = 1;
 while (tmp<=i && tmp<=N-i+1 && tmp<=j && tmp<= N-j+1 &&
sum(sum(data2(i-tmp+1:i+tmp-1, j-tmp+1:j+tmp-1))) == 0)
 tmp = tmp + 1;
 end
 tmp = tmp - 1;
 score(i,j) = tmp; %.* heion(i,j);
 end
 end
end
%surface(score,'EdgeColor','none');
%——————————————————————————————————————
——
% genpics.m 各种画图指令的汇总
%——————————————————————————————————————
——
cd('./');
clear;
load('2400m处分析数据.mat');
%聚落分析
figure;
cla;
surface(data4,'EdgeColor','none');
colorbar;
saveas(gcf,'2400m处聚落分析.png');
%合适区域
cla;
surf(score,'EdgeColor','none');
colorbar;
saveas(gcf,'2400m处落点评价.png');
clear;
load('100m处分析数据.mat');
%聚落分析
cla;
31
surface(data4,'EdgeColor','none');
colorbar;
saveas(gcf,'100m处聚落分析.png');
%合适区域
cla;
surf(score,'EdgeColor','none');
colorbar;
saveas(gcf,'100m处落点评价.png');
clear;
cla;
calc_proc2;
saveas(gcf,'第一阶段降落y-x轨迹.png');
cla;
hold on;
plot(history(:,1), history(:,3), 'b', 'LineWidth',2);
plot(history(:,1), history(:,4), 'red', 'LineWidth',2);
legend ('\fontsize {17}Vx', '\fontsize {17}Vy');
xlabel 't/s';
ylabel 'V/(m/s)';
saveas(gcf,'第一阶段降落Vx、Vy-t轨迹.png');
cla;
hold on;
plot(history(:,1), history(:,5), 'black', 'LineWidth',2);
axis([0, 450, 0, 0.45]);
xlabel 't/s';
ylabel 'θ/rad';
saveas(gcf,'第一阶段降落sita-t轨迹.png');
clear;
cla;
calc_proc;
saveas(gcf,'问题一降落y-x轨迹.png');
cla;
hold on;
plot(history(:,1), history(:,3), 'b', 'LineWidth',2);
plot(history(:,1), history(:,4), 'red', 'LineWidth',2);
legend ('\fontsize {17}Vx', '\fontsize {17}Vy');
xlabel 't/s';
ylabel 'V/(m/s)';
saveas(gcf,'问题一降落Vx、Vy-t轨迹.png');
32
cla;
hold on;
plot(history(:,1), history(:,5), 'black', 'LineWidth',2);
axis([0, 450, 0, 0.8]);
xlabel 't/s';
ylabel 'θ/rad';
saveas(gcf,'问题一降落sita-t轨迹.png');
%杂类
clear;
load('2400m处分析数据.mat');
plotdata = [];
for i = 1:1:255
 plotdata = [plotdata; i, sum(sum(A == i))];
end
max0=0; max1=0; max2=0; max3=0;
for i = 1:1:460
 for j = 1:1:460
 if(data4(i,j)==0)
 if(data(i,j) > max0)
 max0 = data(i,j);
 end
 end
 if(data4(i,j)==1)
 if(data(i,j) > max1)
 max1 = data(i,j);
 end
 end
 if(data4(i,j)==2)
 if(data(i,j) > max2)
 max2 = data(i,j);
 end
 end
 if(data4(i,j)==3)
 if(data(i,j) > max3)
 max3 = data(i,j);
 end
 end
 end
end
hold on
plot(plotdata(:,1), plotdata(:,2), 'black', 'LineWidth',1.5);
plot([max3+0.5 max3+0.5], [0, 3.5e5], 'red', 'LineWidth',2,'linestyle',':');
33
plot([max2+0.5 max2+0.5], [0, 3.5e5], 'red', 'LineWidth',2,'linestyle',':');
plot([max1+0.5 max1+0.5], [0, 3.5e5], 'red', 'LineWidth',2,'linestyle',':');
plot([max0+0.5 max0+0.5], [0, 3.5e5], 'red', 'LineWidth',2,'linestyle',':');
axis([0 255 0 400000])
saveas(gcf,'灰阶分布.png')

附件1:问题A的背景与参考资料

1.中新网12月12日电(记者 姚培硕)

根据计划,嫦娥三号将在北京时间12月14号在月球表面实施软着陆。嫦娥三号如何实现软着陆以及能否成功成为外界关注焦点。目前,全球仅有美国、前苏联成功实施了13次无人月球表面软着陆。
  北京时间12月10日晚,嫦娥三号已经成功降轨进入预定的月面着陆准备轨道,这是嫦娥三号“落月”前最后一次轨道调整。在实施软着陆之前,嫦娥三号还将在这条近月点高度约15公里、远月点高度约100公里的椭圆轨道上继续飞行。期间,将稳定飞行姿态,对着陆敏感器、着陆数据等再次确认,并对软着陆的起始高度、速度、时间点做最后准备。
  “发射、近月制动、变轨和月面降落比较起来,后者更为关键。这对我们来说是一个全新的,也是一个最 重要的考验。”中国探月工程总设计师吴伟仁表示。
  嫦娥三号着陆地点选在较为平坦的虹湾区。但由于月球地形的不确定性,最终“落月”地点的选择仍存在一定难度。据悉,嫦娥三号将在近月点15公里处以抛物线下降,相对速度从每秒1.7公里逐渐降为零。整个过程大概需要十几分钟的时间。探测器系统副总指挥谭梅将其称为“黑色750秒”。
  由于月球上没有大气,嫦娥三号无法依靠降落伞着陆,只能靠变推力发动机,才能完成中途修正、近月制动、动力下降、悬停段等软着陆任务。据了解,嫦娥三号主发动机是目前中国航天器上最大推力的发动机,能够产生从1500牛到7500牛的可调节推力,进而对嫦娥三号实现精准控制。
  在整个“落月”过程中,“动力下降”被业内形容为最惊心动魄的环节。在这个阶段,嫦娥三号要完全依靠自主导航控制,完成降低高度、确定着陆点、实施软着陆等一系列关键动作,人工干预的可能性几乎为零。“在这个时间段内测控都跟不上了,判断然后上去执行根本来不及,只能事先把程序都设定好。”谭梅表示。
  在距月面100米处时,嫦娥三号要进行短暂的悬停,扫描月面地形,避开障碍物,寻找着陆点。“如果下面有个大坑,需要挪个地方,它就会自己平移,等照相机告诉它地面平了,才会降落”。中国绕月探测工程首任首席科学家、中国科学院院士欧阳自远介绍。
  之后,嫦娥三号在反推火箭的作用下继续慢慢下降,直到离月面4米高时再度悬停。此时,关掉反冲发动机,探测器自由下落。由于探测器具备着陆缓冲机构,几个腿都有弹性,落地时不至于摔坏。
安全降落以后,嫦娥三号将打开太阳能电池板接收能量,携带的仪器经过测试、调试后开始工作。随后,“玉兔号”月球车将驶离着陆器,在月面进行3个月的科学勘测,着陆器则在着陆地点进行原地探测。这将是中国航天器首次在地外天体的软着陆和巡视勘探,同时也是1976年后人类探测器首次的落月探测。
(http://www.chinanews.com/mil/2013/12-12/5608941.shtml)

2.嫦娥三号近月轨道示意图(曲振东 编制)

附图1:嫦娥三号近月轨道示意图
(http://news.xinhuanet.com/photo/2013-12/02/c_125789895.htm)

3. 嫦娥三号着陆区域和着陆点示意图

附图2:嫦娥三号着陆区域和着陆点示意图
(http://blog.guandian.cn/?p=83491)
4.主发动机和姿态调整发动机的分布图
嫦娥三号安装有大推力主减速发动机一台,位于正下方。小型姿态调整发动机16台,分布在相对前、后、左、右四个侧面,如附图3是一个侧面的分布情况。

附图3:嫦娥三号主发减速动机与姿态调整发动机的分布图

5.关于比冲
比冲或比冲量是对一个推进系统的燃烧效率的描述。比冲的定义为:火箭发动机单位质量推进剂产生的冲量,或单位流量的推进剂产生的推力。比冲的单位为米/秒(m/s),并满足下列关系式:

其中
是发动机的推力,单位是牛顿;
是以米/秒为单位的比冲;
是单位时间燃料消耗的公斤数。
6.关于月球参数
月球平均半径、赤道平均半径和极区半径分别为1737.013km、1737.646km和1735.843km,月球的形状扁率为1/963.7256,月球质量是7.3477×1022kg。月球与地球距离最远(远地点):406610km,最近(近地点):356330km,平均距离为384400km。
NASA月球勘测轨道飞行器使用的月面海拔零点,是月球的平均半径所在的高度。所以,嫦娥三号着陆点的海拔为-2640m,即该点到月球中心的距离要比月球的平均半径少2640m。
参考文献
[1]维基百科,轨道根数.http://en.wikipedia.org/wiki/Orbital_elements. 2014.1.17
[2]维基百科,比冲. http://en.wikipedia.org/wiki/Specific_impulse. 2014.1.17

附件2

嫦娥三号软着陆过程分为6个阶段的要求

(1)着陆准备轨道:着陆准备轨道的近月点是15KM,远月点是100KM。近月点在月心坐标系的位置和软着陆轨道形态共同决定了着陆点的位置。

(2)主减速段:主减速段的区间是距离月面15km到3km。该阶段的主要是减速,实现到距离月面3公里处嫦娥三号的速度降到57m/s。

(3)快速调整段:快速调整段的主要是调整探测器姿态,需要从距离月面3km到 2.4km处将水平速度减为0m/s,即使主减速发动机的推力竖直向下,之后进入粗避障阶段。

(4)粗避障段:粗避障段的范围是距离月面2.4km到100m区间,其主要是要求避开大的陨石坑,实现在设计着陆点上方100m处悬停,并初步确定落月地点。
嫦娥三号在距离月面2.4km处对正下方月面2300×2300m的范围进行拍照,获得数字高程如附图5所示(相关数据文件见附件3),并嫦娥三号在月面的垂直投影位于预定着陆区域的中心位置。

附图5: 距月面2400m处的数字高程图

该高程图的水平分辨率是1m/像素,其数值的单位是1m。例如数字高程图中第1行第1列的数值是102,则表示着陆区域最左上角的高程是102米。

(5)精避障段:精细避障段的区间是距离月面100m到30m。要求嫦娥三号悬停在距离月面100m处,对着陆点附近区域100m范围内拍摄图像,并获得三维数字高程图。分析三维数字高程图,避开较大的陨石坑,确定最佳着陆地点,实现在着陆点上方30m处水平方向速度为0m/s。附图6是在距离月面100m处悬停拍摄到的数字高程图(相关数据文件见附件4)。

附图6: 距离月面100m处的数字高程图
该数字高程的水平分辨率为0.1m/像素,高度数值的单位是0.1m。

(6)缓速下降阶段:缓速下降阶段的区间是距离月面30m到4m。该阶段的主要任务控制着陆器在距离月面4m处的速度为0m/s,即实现在距离月面4m处相对月面静止,之后关闭发动机,使嫦娥三号自由落体到精确有落月点。

注:附件3和附件4中数字高程图对应的*.tif文件可以使用Matlab的“imread”命令打开,“imread”的具体使用方法见Matlab相关帮助

常微分方程

常微分方程(Ordinary Differential Equations,简称ODEs)是描述未知函数和其导数之间关系的方程。常微分方程在科学和工程领域中广泛应用,用于描述动力系统、物理过程、生物学模型等。

一阶常微分方程的一般形式为:
dy/dt = f(t, y)

其中 y 是未知函数,t 是自变量,f 是已知函数,表示 y 和 t 的关系。这个方程表示 y 对 t 的导数等于 f(t, y)。边界条件或初始条件通常也会给定,例如 y(t0) = y0。

对于高阶常微分方程,可以通过引入新的变量来将其转化为一阶方程组。例如,一个二阶常微分方程可以表示为:
d²y/dt² = g(t, y, dy/dt)

通过引入新的变量,如令 v = dy/dt,则可以将上述方程转化为一阶方程组:
dy/dt = v
dv/dt = g(t, y, v)

解常微分方程的过程通常包括以下步骤:

  1. 定义问题:明确常微分方程形式及边界条件。

  2. 分类:根据常微分方程的类型和特点,选择合适的方法进行求解。常见的方法包括欧拉法、龙格-库塔法、改进的欧拉法、四阶龙格-库塔法等。

  3. 数值求解:将常微分方程离散化为差分方程,根据选定的数值方法进行迭代计算。时间步长的选择会影响求解结果的精度和稳定性。

  4. 边界条件处理:对于边界条件或初始条件给定的情况,将其纳入求解过程中。

  5. 结果分析:根据求解得到的数值结果,进行后续的分析和应用。可以进行图形绘制、参数敏感性分析、稳定性分析等。

请注意,解常微分方程可能需要适当的数值方法和计算机编程技巧。Matlab、Python等计算工具都提供了强大的数值计算和求解常微分方程的工具包,可以辅助进行求解。

总结起来,常微分方程是描述未知函数和其导数之间关系的方程。求解常微分方程通常涉及定义问题、分类、数值求解、边界条件处理和结果分析等步骤。通过合适的数值方法和计算工具,我们可以得到常微分方程的数值解,并进行进一步的分析和应用。

当涉及到常微分方程的解析解时,一般针对特定类型的常微分方程有一些经典的解法。以下介绍几种常见的常微分方程解法:

  1. 可分离变量法:适用于形如 dy/dt = g(t)h(y) 的方程。通过将方程两边进行变量分离并积分,可以将方程求解为 y 的函数。

  2. 线性常微分方程的常数变易法:适用于形如 dy/dt + p(t)y = q(t) 的一阶线性常微分方程。通过引入一个积分因子,将方程转化为可直接积分的形式。

  3. 齐次方程法:适用于形如 dy/dt = f(y/t) 的方程。通过引入新的变量,将方程转化为分离的变量形式或者以变量代换的方式求解。

  4. 恰当方程法:对于形如 M(t, y) + N(t, y)dy/dt = 0 的方程,如果存在一个函数 u(t, y),使得 ∂M/∂y = ∂N/∂t,则该方程是恰当方程。求解恰当方程的关键是找到一个 u(t, y),并利用 u(t, y) 的全微分性质进行积分。

需要注意的是,并非所有的常微分方程都存在解析解。对于很多复杂的常微分方程,没有解析解或者很难获得解析解。在这种情况下,数值方法是求解常微分方程的常见选择。数值方法通过离散化微分方程并进行迭代计算,近似地求解微分方程。

常用的数值方法包括:欧拉法、龙格-库塔法、改进的欧拉法、四阶龙格-库塔法等。这些方法通过将微分方程转化为差分方程,并利用适当的迭代格式进行数值计算。

总而言之,解常微分方程可以采用解析解法或数值解法。具体选择哪种方法取决于问题的性质和可行性。对于简单的方程,我们可以尝试使用解析解法;对于更复杂的方程或无解析解的情况,数值方法可以提供有效的求解工具。

当涉及到使用 MATLAB 结合求解常微分方程时,MATLAB 提供了强大的数值计算和求解常微分方程的工具包,如ode45、ode23、ode15s等。

以下是一般步骤:

  1. 定义常微分方程:将常微分方程表示为 MATLAB 函数形式。例如,如果要求解 dy/dt = f(t, y),则可以创建一个函数文件,将右侧的 f(t, y) 实现为 MATLAB 函数。
function dydt = myODE(t, y)
    dydt = f(t, y);  % 根据具体问题实现 f(t, y)
end
  1. 设置初始条件:指定常微分方程的初始条件。例如,如果初始条件为 y(t0) = y0,则可以定义初始时间和初始状态向量。
t0 = 0;   % 初始时间
y0 = 1;   % 初始状态
  1. 设置求解参数:选择合适的求解方法,并设置相应的求解参数。常用的求解方法如 ode45、ode23、ode15s 等,具体选择取决于问题的性质和精度要求。

  2. 调用求解器函数:使用选择的求解方法,调用相应的求解器函数来求解常微分方程。传递相应的输入参数,包括定义的常微分函数、初始时间、初始状态、求解参数等。

[t, y] = ode45(@myODE, [t0, tf], y0, options);

其中,@myODE 是定义的常微分函数的函数句柄,[t0, tf] 是求解时间区间,y0 是初始状态向量,options 是求解参数。

  1. 分析和可视化结果:根据求解得到的结果,进行进一步的分析和可视化。可以绘制时间与状态变量之间的图形,观察系统的动态行为。
plot(t, y);
xlabel('时间');
ylabel('状态变量');
title('常微分方程求解结果');

在 MATLAB 中,除了使用数值方法求解常微分方程外,还可以尝试使用符号计算工具箱来获得常微分方程的解析解。

  1. 符号变量定义:首先,使用符号计算工具箱创建符号变量。假设我们要解决一阶常微分方程 dy/dt = f(t, y),可以定义符号变量 t 和 y。
syms t y
  1. 建立方程:将常微分方程转换为符号表达式。根据具体问题,将 f(t, y) 替换成实际的函数表达式。
dydt = f(t, y);  % 替换为实际的函数表达式
  1. 求解常微分方程:使用 dsolve 函数对常微分方程进行求解。将常微分方程和初始条件作为输入参数传递给 dsolve 函数。
eqn = diff(y, t) == dydt;  % 构建微分方程
cond = y(t0) == y0;        % 设置初始条件
ySol(t) = dsolve(eqn, cond);

其中,eqn 是微分方程,cond 是初始条件,ySol 是求解得到的符号表达式。

  1. 分析和可视化结果:对求解得到的符号表达式进行进一步的分析和可视化。可以使用 subs 函数将符号表达式中的符号变量替换为具体的数值,并绘制结果。
ySol_numeric = subs(ySol, t, t_values);  % 替换 t 为具体的数值
plot(t_values, ySol_numeric);
xlabel('时间');
ylabel('状态变量');
title('常微分方程解析解');

这样,你可以使用 MATLAB 的符号计算工具箱来获得常微分方程的解析解。需要注意,在复杂的情况下,可能无法获得解析解或者结果比较复杂。此时,可以考虑使用数值方法来近似求解常微分方程。

在科学、工程和其他领域中,常微分方程的应用非常广泛。以下是一些常见的应用领域:

  1. 物理学:常微分方程在物理学中的应用非常广泛。例如,牛顿定律可以表示为二阶常微分方程,用于描述物体的运动。电路中的电流和电压也可以通过常微分方程来描述。

  2. 工程学:常微分方程在工程学中扮演重要角色。例如,在控制系统中,可以使用常微分方程来建模和分析系统的动态响应。热传导、质量平衡等过程也可以用常微分方程描述。

  3. 经济学:常微分方程在经济学中有广泛的应用。用于建立经济模型,预测市场变化和分析经济行为。经济增长模型、消费者行为模型等都可以通过常微分方程来描述。

  4. 生物学:生物学中许多生物过程也可以用常微分方程来建模。例如,生物种群动力学、生物反应动力学等。常微分方程在神经科学、生物化学等领域也有应用。

  5. 计算机科学:常微分方程在计算机图形学、物理模拟等方面有应用。例如,在计算机动画中,可以使用常微分方程来模拟物体的运动和变形。

这些只是常微分方程应用的一小部分示例,实际上常微分方程在各个领域都有广泛的应用。通过求解常微分方程,我们可以预测系统的行为、优化设计、解释实验数据等,对问题的理解和解决提供了重要工具。

蚁群算法

一、蚁群算法蚁群算法(ant colony optimization, ACO),又称蚂蚁算法,是一种用来寻找最优解决方案的机率型技术。它由Marco Dorigo于1992年在他的博士论文中引入,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。

蚂蚁在路径上前进时会根据前边走过的蚂蚁所留下的分泌物选择其要走的路径。其选择一条路径的概率与该路径上分泌物的强度成正比。因此,由大量蚂蚁组成的群体的集体行为实际上构成一种学习信息的正反馈现象:某一条路径走过的蚂蚁越多,后面的蚂蚁选择该路径的可能性就越大。蚂蚁的个体间通过这种信息的交流寻求通向食物的最短路径。

蚁群算法就是根据这一特点,通过模仿蚂蚁的行为,从而实现寻优。这种算法有别于传统编程模式,其优势在于,避免了冗长的编程和筹划,程序本身是基于一定规则的随机运行来寻找最佳配置。也就是说,当程序最开始找到目标的时候,路径几乎不可能是最优的,甚至可能是包含了无数错误的选择而极度冗长的。但是,程序可以通过蚂蚁寻找食物的时候的信息素原理,不断地去修正原来的路线,使整个路线越来越短,也就是说,程序执行的时间越长,所获得的路径就越可能接近最优路径。这看起来很类似与我们所见的由无数例子进行归纳概括形成最佳路径的过程。实际上好似是程序的一个自我学习的过程。

二、这种优化过程的本质在于:

选择机制:信息素越多的路径,被选择的概率越大。更新机制:路径上面的信息素会随蚂蚁的经过而增长,而且同时也随时间的推移逐渐挥发消失。

协调机制:蚂蚁间实际上是通过分泌物来互相通信、协同工作的。蚁群算法正是充分利用了选择、更新和协调的优化机制,即通过个体之间的信息交流与相互协作最终找到最优解,使它具有很强的发现较优解的能力。基于以上机制编写的程序的核心代码可能不过上百行,却完成了类似于学习的过程。原因就是所谓的自组织理论,简单规则的涌现。事实上,每只蚂蚁并不是像我们想象的需要知道整个世界的信息,他们其实只关心很小范围内的眼前信息,而且根据这些局部信息利用几条简单的规则进行决策,但是,当集群里有无数蚂蚁的时候,复杂性的行为就会凸现出来。这就是人工生命、复杂性科学解释的规律!

那么,这些简单规则是什么呢?下面详细说明:

1、范围:蚂蚁观察到的范围是一个方格世界,蚂蚁有一个参数为速度半径(一般是3),那么它能观察到的范围就是3*3个方格世界,并且能移动的距离也在这个范围之内。

2、环境:蚂蚁所在的环境是一个虚拟的世界,其中有障碍物,有别的蚂蚁,还有信息素,信息素有两种,一种是找到食物的蚂蚁洒下的食物信息素,一种是找到窝的蚂蚁洒下的窝的信息素。每个蚂蚁都仅仅能感知它范围内的环境信息。环境以一定的速率让信息素消失。

3、觅食规则:在每只蚂蚁能感知的范围内寻找是否有食物,如果有就直接过去。否则看是否有信息素,并且比较在能感知的范围内哪一点的信息素最多,这样,它就朝信息素多的地方走,并且每只蚂蚁多会以小概率犯错误,从而并不是往信息素最多的点移动。蚂蚁找窝的规则和上面一样,只不过它对窝的信息素做出反应,而对食物信息素没反应。

4、移动规则: 每只蚂蚁都朝向信息素最多的方向移,并且,当周围没有信息素指引的时候,蚂蚁会按照自己原来运动的方向惯性的运动下去,并且,在运动的方向有一个随机的小的扰动。为了防止蚂蚁原地转圈,它会记住最近刚走过了哪些点,如果发现要走的下一点已经在最近走过了,它就会尽量避开。

5、避障规则:如果蚂蚁要移动的方向有障碍物挡住,它会随机的选择另一个方向,并且有信息素指引的话,它会按照觅食的规则行为。

6、播撒信息素规则:每只蚂蚁在刚找到食物或者窝的时候撒发的信息素最多,并随着它走远的距离,播撒的信息素越来越少。根据这几条规则,蚂蚁之间并没有直接的关系,但是每只蚂蚁都和环境发生交互,而通过信息素这个纽带,实际上把各个蚂蚁之间关联起来了。比如,当一只蚂蚁找到了食物,它并没有直接告诉其它蚂蚁这儿有食物,而是向环境播撒信息素,当其它的蚂蚁经过它附近的时候,就会感觉到信息素的存在,进而根据信息素的指引找到了食物。
****https://www.cnblogs.com/Qling/p/9348098.html
蚁群算法简介及应用https://www.cnblogs.com/lfri/p/12242311.html
对蚁群算法的解释https://www.cnblogs.com/wukuanglin/p/11799162.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yos1Dnt1-1688196030591)(2023-07-01-11-41-34.png)]
C语言实现https://www.cnblogs.com/paulbai/archive/2012/03/21/2410695.html

蚁群算法求解TSP问题https://www.cnblogs.com/twzh123456/p/11798800.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oo1D8uDe-1688196030592)(2023-07-01-11-41-44.png)]

蚁群算法(Ant Colony Optimization,ACO)是一种基于蚂蚁行为模拟的启发式优化算法,通常用于解决组合优化问题,如旅行商问题(TSP)和任务分配问题等。蚁群算法的核心思想是通过模拟蚂蚁在搜索空间中的移动和信息交流来寻找问题的最优解。

蚁群算法的基本原理是通过大量的人工蚂蚁在问题空间中进行随机搜索,并通过信息素的更新和挥发来引导蚂蚁的行动。每只蚂蚁在搜索过程中根据信息素以及启发函数(heuristic function)做出决策,选择下一个要遍历的节点。成功的路径上会释放更多的信息素,这样其他蚂蚁就有更大可能性选择该路径,逐步形成一个正向反馈的过程,最终收敛到问题的最优解。

蚁群算法包括两个重要的步骤:路径选择和信息素更新。路径选择是蚂蚁根据信息素和启发函数选择下一个节点的过程。信息素更新是指在每次迭代后,根据蚂蚁的走过的路径和目标函数值,更新问题空间中各个路径上的信息素。

蚁群算法的优势在于能够处理复杂的组合优化问题,并且具有一定的鲁棒性和适应性。它结合了局部搜索和全局搜索的特点,能够在搜索过程中充分利用已有的信息,并通过信息素的引导实现全局搜索。

然而,蚁群算法也存在一些挑战和限制。首先,算法的性能高度依赖于参数的选择和调整。不同问题可能需要不同的参数设置,这对问题的适应性和通用性提出了要求。其次,蚁群算法在解决大规模问题时可能遇到搜索空间爆炸的问题,导致计算复杂度增加。此外,蚁群算法的收敛速度较慢,需要进行多次迭代才能得到较好的解。

总之,蚁群算法是一种基于模拟蚂蚁行为的启发式优化算法,适用于解决组合优化问题。它通过蚂蚁的搜索和信息交流来寻找最优解,并具有一定的鲁棒性和适应性。然而,在使用蚁群算法时需要仔细选择参数和调整算法以获得较好的性能。

当应用蚁群算法解决问题时,通常会遵循以下步骤:

  1. 定义问题:明确问题的目标和约束条件。将问题转化为适合蚁群算法求解的形式,如旅行商问题、任务分配问题等。

  2. 初始化参数:确定蚁群算法的相关参数,包括蚂蚁数量、信息素初始值、信息素挥发率等。这些参数的选择对算法的性能和收敛速度有重要影响。

  3. 创建蚂蚁群体:根据问题的规模和复杂程度,创建一定数量的蚂蚁,并将它们放置在问题空间中的不同位置。

  4. 路径选择:每只蚂蚁根据信息素和启发函数决策下一个要遍历的节点。信息素表示路径上的足迹,启发函数则提供了节点间的启发信息。蚂蚁可以通过概率方法(如轮盘赌选择法)来选择下一个节点。

  5. 更新信息素:在每一次迭代结束后,根据蚂蚁的路径和目标函数值,更新问题空间中各个路径上的信息素。成功的路径上将释放更多的信息素,而信息素会随时间挥发。这样,经过多次迭代,优良路径上的信息素逐渐增加,而不良路径上的信息素则减少。

  6. 判断终止条件:根据问题的要求和算法的性能,设定适当的终止条件,如达到最大迭代次数、目标函数值达到阈值等。

  7. 输出最优解:最终,根据蚁群算法的迭代结果,输出找到的最优解或近似最优解。

需要注意的是,蚁群算法中的启发函数和信息素更新策略可以根据具体问题进行设计。启发函数可以根据节点间的距离、经验知识等提供指导信息。信息素更新策略可以根据蚂蚁的走过的路径和目标函数值来确定。

此外,为了提高蚁群算法的性能,常常使用一些改进策略,如引入局部搜索机制(如2-opt操作)、采用多种信息素调整方式(如最大最小蚁群系统)等。

总结起来,蚁群算法通过模拟蚂蚁行为的方式,通过路径选择和信息素更新来求解组合优化问题。这个算法的基本步骤包括定义问题、初始化参数、创建蚂蚁群体、路径选择、信息素更新、判断终止条件和输出最优解。通过合理的参数设置和改进策略,蚁群算法可以得到较好的优化性能和近似最优解。

以下是一个简单的 Matlab 代码示例,演示如何使用蚁群算法解决旅行商问题(TSP):

% TSP问题的距离矩阵
distanceMatrix = [0, 2, 9, 10;
                  1, 0, 6, 4;
                  15, 7, 0, 8;
                  6, 3, 12, 0];

% 参数设置
numAnts = 10;           % 蚂蚁数量
numIterations = 100;    % 迭代次数
alpha = 1;              % 信息素重要程度因子
beta = 2;               % 启发信息重要程度因子
rho = 0.5;              % 信息素挥发率
Q = 1;                  % 信息素增加强度因子

% 初始化信息素矩阵
pheromoneMatrix = ones(size(distanceMatrix)) / numel(distanceMatrix);

% 迭代寻找最优路径
bestPath = [];
bestDistance = Inf;

for iter = 1:numIterations
    % 每只蚂蚁的当前位置和已经访问过的节点
    antPos = ones(numAnts, 1);
    visitedNodes = false(size(distanceMatrix));
    
    % 每只蚂蚁进行路径选择
    for ant = 1:numAnts
        while any(~visitedNodes(ant,:))
            currentNode = antPos(ant);
            unvisitedNodes = find(~visitedNodes(ant,:));
            
            % 计算节点选择概率
            nodeProbs = (pheromoneMatrix(currentNode, unvisitedNodes) .^ alpha) ...
                        .* ((1 ./ distanceMatrix(currentNode, unvisitedNodes)) .^ beta);
            nodeProbs = nodeProbs / sum(nodeProbs);
            
            % 根据概率选择下一个节点
            nextNode = randsample(unvisitedNodes, 1, true, nodeProbs);
            
            % 更新蚂蚁位置和已访问节点
            antPos(ant) = nextNode;
            visitedNodes(ant, nextNode) = true;
        end
    end
    
    % 计算每只蚂蚁的路径距离
    pathDistances = zeros(numAnts, 1);
    for ant = 1:numAnts
        nodes = [antPos(ant); find(visitedNodes(ant,:))];
        pathDist = distanceMatrix(sub2ind(size(distanceMatrix), nodes(1:end-1), nodes(2:end)));
        pathDistances(ant) = sum(pathDist);
    end
    
    % 更新最优路径
    [minDist, minIdx] = min(pathDistances);
    if minDist < bestDistance
        bestDistance = minDist;
        bestPath = [antPos(minIdx), find(visitedNodes(minIdx,:))];
    end
    
    % 更新信息素矩阵
    deltaPheromoneMatrix = zeros(size(distanceMatrix));
    for ant = 1:numAnts
        nodes = [antPos(ant); find(visitedNodes(ant,:))];
        for i = 1:length(nodes)-1
            deltaPheromoneMatrix(nodes(i), nodes(i+1)) = deltaPheromoneMatrix(nodes(i), nodes(i+1)) + Q / pathDistances(ant);
        end
    end
    pheromoneMatrix = (1-rho) * pheromoneMatrix + deltaPheromoneMatrix;
end

% 输出结果
disp('最优路径:');
disp(bestPath);
disp('最优距离:');
disp(bestDistance);

请注意,上述代码仅为演示目的,并不包含所有可能的改进和优化。在实际应用中,您可能需要根据具体问题进行修改和调整。

猜你喜欢

转载自blog.csdn.net/shaozheng0503/article/details/131491010