Press "Enter" to skip to content

用GEKKO以确定性的方式对世界进行建模

Iván Díaz在Unsplash上的照片

求解微分代数方程和应用动态优化的软指南

随着世界变得越来越数字化,数据收集正在迅速扩展。这些数据使我们能够创建更准确的模型,帮助我们解决许多商业和技术领域的问题并找到优化的解决方案。由于这些模型是基于真实世界的数据构建的,而真实世界的数据天然具有随机性,数据集中的随机性、噪声和异常往往是不可避免的。通常需要花费很多时间进行探索性数据分析、数据预处理和异常值检测。在拟合模型之前,这些方法已成为了解和优化数据的常见方法。然而,使用这样的数据构建的任何模型都只是对真实解的近似。这是因为数据再次具有随机性(不确定性)并受到许多未知因素的影响(Knightian不确定性)。除此之外,数据不足或存在偏倚的不平衡数据集还可能降低模型的准确性(Epistemic不确定性)。即使面对这些不确定性,以这种方式构建的模型仍然是无价的,并且内在的随机性有时可以帮助更好地理解现实世界的复杂性。然而…还存在一种替代方法:确定性建模。

确定性建模是与随机性建模相对立的方法。它是一种通过消除现实世界引入的混乱来简化建模过程的方法。这些模型本质上是理想化的,意味着它们代表基于特定假设的理想解决方案。这些假设可以来自一组主观、概率性或概括性规则,并假设输入和输出之间存在明确定义的模式。虽然这听起来与使用随机数据建模类似,但主要区别在于模型现在由这些预定义的假设确定,而不是训练数据。你可能会想到一个问题:“如果我不是基于数据训练模型,那么我从哪里得到这些模型假设?”答案很简单,但有时会被忽视,那就是领域知识。领域知识是一组关于特定主题的已知规则和概念。通过领域知识得出这些假设,作为确定性建模的基础。在任何编程语言中,可以使用自定义代码编写这些确定性模型,但随着模型变得越来越复杂,专门为此任务编写了一些库。其中一个名为GEKKO的Python库将被探讨。

GEKKO是一个用于执行建模语言高级过程监视器(APMonitor)的Python库。它提供了一系列针对确定性建模需求定制的功能和函数,便于创建和分析复杂模型。它可以解决混合整数和微分代数方程,并与用于线性、二次、非线性和混合整数规划的大规模求解器相结合。GEKKO具有9种问题类型,可用于定义确定性模型设置。然而,在本文中,只考虑同时解决所有方程的移动视角估计(MHE)模式。MHE模式用于通过最小化测量输出与由优化问题和目标确定的模型预测之间的差异来估计动态系统的状态。这是通过应用递归估计或移动窗口估计来实现的。

哇!这是相当多的术语,但通过以下实际例子,这一切很快就会明白了。

太空飞行是人类令人难以置信的成就。将人造物发送到太空是工程和智慧的奇迹。但是将物体送入太空是相当昂贵的。因此,有信心地构建能够如预期般执行的火箭非常重要。收集实时发射的数据对改进未来火箭的性能非常有帮助。但在那之前必须发射一枚火箭才能获得数据,其中就存在问题。没有随机数据就没有基于随机的模型。这时就需要确定性模型和GEKKO登场了。火箭的确定性模型的假设非常简单,你猜对了,是火箭科学!也就是说,即使没有将火箭离地面一英寸,我们也可以使用物理定律来确定特定火箭配置在理想情况下的性能。例如,让我们使用GEKKO复制SpaceX的Falcon 1第一阶段火箭配置。

首先,让我们使用公开已知的信息[1][2]来设置猎鹰1号一级火箭,并首先定义一些模拟常量和已知值。

现在我们可以真正开始使用GEKKO进行有趣的事情了。由于我们正在进行基于时间的模拟,让我们首先定义时间组件:

  • 火箭飞行时间为200秒
  • 燃料燃烧时间已知为161.6秒
  • 还有一个稍后使用的附加时间组件

有了时间数组设置,我们可以初始化一个GEKKO模型并设置模型的时间组件。下一步是定义必须在每个时间步骤中求解的变量。这些变量是由我们对火箭的假设确定的,但它们也可以包括我们可能有兴趣在模拟结束时评估的变量。为了使这个模拟保持简单,变量包括:

  • 质量
  • 距离
  • 速度
  • 推力产生的力
  • 稍后使用的附加虚拟时间变量

对于这些变量中的每一个,我们可以给它一个起始值,并设置上下限来限制它们。GEKKO变量是定义我们感兴趣的变量最通用的方式。然而,实际上还有很多其他选项,比如固定、控制和操作变量,它们可以使用户对变量的演变方式有更多的控制。你应该去了解一下!

在我们继续之前,需要注意的是,为了节省你的阅读时间,避免过多的数学内容,这个火箭模型将忽略火箭物理学中的一些已知假设。这些假设包括,火箭上升时空气密度和重力的变化,科里奥利力的影响以及很多机械工程组件。然而,通过所做的假设,将涵盖影响火箭飞行和动力学的主要力量。现在,是介绍它们以及在GEKKO中应用它们的好时机。

与任何经典运动物体一样,牛顿运动定律适用。这意味着我们已经对这个火箭的运动有了一个很好的想法。但让我们快速回顾一下我们需要做到这一点的微分方程。别担心,它们非常简单。让我们首先定义火箭如何移动并覆盖距离的方程式:

用GEKKO以确定性的方式对世界进行建模 四海 第2张

哇!这个是基础物理学,物体的速度只是距离的变化除以时间的变化。接下来,让我们添加火箭在移动过程中会经历的阻力。顺便说一句,它真的很阻力很大。

用GEKKO以确定性的方式对世界进行建模 四海 第3张

有了这个,我们现在可以将力和速度之间建立另一个关系。记住:

用GEKKO以确定性的方式对世界进行建模 四海 第4张

好了,有了这个公式,我们可以将火箭将经历的所有力(前进推力、阻力,当然还有重力)与速度相关联。这就是它的工作原理:

用GEKKO以确定性的方式对世界进行建模 四海 第5张

我保证这是这个模拟中最难的方程式。在火箭起飞之前,还会有另外两个假设。其中一个与火箭中的燃料有关。如果火箭将其燃料燃烧为推进剂,那么一个好主意是描述火箭的质量如何变化。为了做到这一点,让我们假设质量的减少与最大推力和燃烧时间呈线性关系,如下所示:

用GEKKO以确定性的方式对世界进行建模 四海 第6张

最后一个假设是当燃料用完时会发生什么。这个假设非常酷,因为它是一个逻辑语句,而且GEKKO也有相应的功能。

完成了所有这些工作之后,我们现在可以将所有的部分整合在一起,建立我们的确定性模型。

请注意,上面的代码中有一些额外的东西没有提到。首先调用了一个虚拟的时间方程,这是为了跟踪燃料耗尽的时间。接下来,使用了一个优化目标。为什么要这样做?因为MHE解决一个目标,在这种情况下是尝试在每个时间步骤中使火箭达到地面最大高度。你可以根据你想要优化的内容尝试其他目标函数(例如,尝试 m.fix_final(h, 50e3) 和然后 m.Obj(thrust*v) 来节约火箭燃料)。最后一件事是,GEKKO会打印出模拟是否能够找到最优解。对于这个模拟,你将看到我们实际上有负自由度。这是使用 m.if3 的一个怪异之处,这通常会导致模拟无法解决。所以,如果你想尝试一些更复杂的东西,也许还是坚持使用 m.if2 吧。

最后,是时候看到我们模拟的结果了。为了快速而好地查看模拟解决的结果,绘制结果是一个很好的可视化方法。

用GEKKO以确定性的方式对世界进行建模 四海 第7张

分析火箭的性能提供了一些有趣的见解。首先,它在达到最大高度73.83公里和最大速度802.15米/秒的同时,火箭的平均推力为322.68千牛,燃烧了高达19.59吉焦的能量。

这些结果为我们提供了关于火箭的能力和性能的关键信息,即使在建造火箭之前。更好的是,参数可以很容易地调整和微调,随着越来越多的复杂性的增加,真正展示确定性建模带来的令人难以置信的潜力。有了所有这些可用的信息,这些知识可以进一步用于帮助工程师进行设计优化,并帮助预算这样昂贵的项目。

虽然火箭很酷,但确定性建模的更现实的应用包括许多不同类型的系统的优化。这些系统的例子包括:制造工厂的生产线、交通控制和路径规划、模拟传染和疾病的复杂传播、建模气候变化及其影响,甚至在金融领域使用基于确定性的博弈论模型。

总之,确定性建模是一个寻找理想场景解决方案的好选择,可以很好地描述领域知识。它们可以用来建模复杂的非线性系统,并在真实世界数据可用之前提供强有力的预测和概率结果。总而言之,确定性建模是一个对其掌握感兴趣的人来说的强大工具。

[1] 推进系统Falcon-I ( http://www.b14643.de/Spacerockets_2/United_States_2/Falcon-I/Propulsion/engines.htm )

[2] Falcon 1 ( https://en.wikipedia.org/wiki/Falcon_1 )

Leave a Reply

Your email address will not be published. Required fields are marked *