解决方案

Wolfram语言和Mathematica版本13的最新功能(上)


Wolfram 在持续不断的敲响创新的钟声......

用初等函数显示积分的结果

可以计算 Abramowitz & Stegun 写的《数学函数手册》中的所有函数

数字的另一种表示

数学函数的提升

更多PDE建模:固体和结构力学

用图像和视频制作新的视频

图像拼接

继续生长的树图

更加完美的图形着色

子图同构

空间场的计算

地球不知道的闰秒

更清晰的新地理地图

几何区域的拟合与构建

化学式和化学反应

生物序列的绘图、次级键等

航班数据

多轴和多面板图

绘图缩放中的日期和无穷大

新的可视化类型

符号化光源的功能

用于机器学习的内容检测器

机器学习的可视化功能和诊断

自动化追踪机器人等问题

自动匹配输入括号

交互式进度控制

自然语言+二维数学符号的交互式输入

创建、部署和评分测试题

解密电子邮件、PDF等

云端表达成为主流

Wolfram 函数存储库已经有2259+个函数

轻而易举创建程序包

缩短的别名

构建闪亮的符号网页

区块链的挖矿生矿

文档与执行文件的分离


创新的征程仍在继续

就在几周前,距离 Mathematica 1.0 发布已经过去了三分之一世纪(https://writings.stephenwolfram.com/2021/10/celebrating-a-third-of-a-century-of-mathematica-and-looking-forward/)。今天,我很高兴地在此宣布我们长期以来一直运行的研发最新成果:Wolfram 语言(https://www.wolfram.com/language/)和 Mathematica(https://www.wolfram.com/mathematica/) 的第13版。(是的,13这个主题(https://blog.wolfram.com/2021/11/09/13-ways-of-looking-at-the-number-13/)——加上今天是本月的 13 号——很有趣的巧合。)

自我们上次发布12.3版已经过去了207天,也就是6个月多一点。我可以很高兴地说,在这短短的时间内我们取得了令人印象深刻的研发成果:不仅总共有117个全新的函数(https://reference.wolfram.com/language/guide/SummaryOfNewFeaturesIn130.html),还有数百个更新和升级的函数、数千个错误修复和小改进,以及许多使系统使用起来更容易、更顺畅的新想法。

在过去的三分之一个世纪中,我们每天、每周、每个月一直都在努力为 Mathematica 和Wolfram 语言这一庞大的集成框架添加更多内容。现在我们可以看到所有一个个想法、项目和工作的成果:即在超过三分之一个世纪的时间里,持续不断的敲响创新的钟声:


可以从这个图表中看出我们付出的很多努力。但它也反映了其他方面:Wolfram语言核心设计原则(https://www.wolfram.com/language/principles/)是成功的。正是基于此,现在这个庞大的系统才能够保持其连贯性和一致性,并变得越来越强大。我们今天建造的东西不是从零开始的;它建立在我们之前建立的巨大能力塔(https://reference.wolfram.com/language/) 之上。这就是为什么我们能够取得如此大的进展,实现如此多的自动化——并进行如此多的发明和创新。

在1.0版(https://www.wolfram.com/mathematica/scrapbook/)中,总共有554个函数(https://reference.wolfram.com/legacy/v1/)。而在12.0和13.0版本之间,我们现在总共添加了635个新函数(https://reference.wolfram.com/language/guide/SummaryOfNewFeaturesIn130.html)(除了已经更新和升级的702个函数外)。它实际上比听起来要付出更多努力。因为当我们今天添加一个功能时,我们的期望值可比1988年高得多——因为我们可以做更多的自动化,整个系统中我们必须连接和集成的更多。而且,当然,今天我们可以做到并且也确实编写了比1988年(印刷的)Mathematica Book(https://www.stephenwolfram.com/publications/mathematica-book/)中所容纳的内容更广泛和详细一百倍的文档内容(https://reference.wolfram.com/language/)。

别忘了积分!

早在1988年,人们真正喜欢的Mathematica 1.0特色之一就是能够以符号方式进行积分。多年来,我们逐渐增加了可以完成的积分范围。三分之一个世纪之后——在13.0版中——我们又一次向前迈进了一步。

这是以前无法在“闭合形式”(https://www.wolframscience.com/nks/notes-12-6--history-of-exact-solutions/)下完成的积分,但在13.0版中可以:


代数函数的任何积分原则上都可以根据我们的通用DifferentialRoot(https://reference.wolfram.com/language/ref/DifferentialRoot.html)对象来完成。但更大的算法挑战是在熟悉的函数方面获得“人性化的答案”。而这是一个很纤弱的事情,系数的微小变化可能会对可能的减少产生很大影响。但是在13.0版中,有许多以前只能用特殊函数来完成的积分,现在可以用初等函数来计算结果。下面是一个范例:


在12.3版中,仍然可以进行相同的积分,但是用椭圆积分表示(https://reference.wolfram.com/language/guide/EllipticIntegrals.html):


数学函数:达到下一个里程碑

在人们仍然需要手工做积分之类计算的时代,当人们发现自己的问题可以用某种从未听说过的奇特“特殊函数”来解决时,总是会令他们感到兴奋和惊讶。特殊函数在某种意义上是一种包装数学知识的方式:一旦你知道方程的解是一个拉梅( Lamé)函数,它就会立即告诉你很多关于它的数学知识。

在Wolfram语言中,我们一直非常认真地对待特殊函数,不仅支持大量的特殊函数,而且可以将它们计算为任何数值精度,并让它们参与全方位的符号数学运算。

大约 45 年前,当我第一次开始使用特殊函数时,标准参考书是 Abramowitz & Stegun 1964 年的《数学函数手册》(https://en.wikipedia.org/wiki/Abramowitz_and_Stegun)。它列出了数百个函数,有些被广泛使用,有些则不太常用。多年来,在 Wolfram 语言的开发过程中,我们一直在研究 Abramowitz & Stegun 的更多函数。

在 13.0 版中,我们终于完成了!Abramowitz & Stegun 中的所有函数现在都可以在 Wolfram 语言中完全计算。最后添加的函数是库仑波函数(https://reference.wolfram.com/language/guide/SpecialFunctions.html#10588913)(与研究量子散射过程相关)。他们在 Abramowitz & Stegun 中是这样的:


在版本 13 中,下图显示了是如何在 Wolfram 语言中获取第一张图片:


当然这个函数还有更多故事,现在我们可以看到:


另一种数字

人们可能认为一个数字只是一个数字。这对于整数来说基本上是正确的。但是当一个数字是实数时,情况就复杂多了。比如有时您可以象征性地“命名”一个实数。但大多数实数没有“符号名称”。并且要准确地指定它们,您必须给出无限数量的数字或等价物。结果最后是以可以想到的近似实数视为代表实际实数的某些完整集合。 一种直接的方法是使用有限精度数,如下所示:


另一种方法(在 12.0 版中引入)是使用 Around(https://reference.wolfram.com/language/ref/Around.html),它实际上表示围绕给定数字“随机分布”的数字分布:


当您对Around数字进行运算时,“误差”会使用某种有效地基于高斯分布的误差演算进行组合——并且您得到的结果在某种意义上是统计结果。

但是,如果您想使用近似数,但仍要获得可证明的结果怎么办?一种方法是使用 Interval(https://reference.wolfram.com/language/ref/Interval.html)。但是现在在版本 13.0 中可用的更简化的方法是使用 CenteredInterval。以下请参见用作贝塞尔函数(https://reference.wolfram.com/language/guide/BesselRelatedFunctions.html)输入的 CenteredInterval:


可以通过多种方式证明 Wolfram 语言中的内容。您可以使用 Reduce(https://reference.wolfram.com/language/ref/Reduce.html)。您可以使用 FindEquationalProof。您可以使用 CenteredInterval——它实际上利用了数值计算。这是一个具有复杂超越根的函数:


我们能证明函数在 3 到 4 区间内大于 0 吗?让我们在下面的中心区间上计算函数:


现在我们可以检验“所有这个区间”确实大于0:


我们从“最坏情况”的方式计算区间,现在却为我们提供了一个明确的定理。

许多其他数学内容

与 Wolfram 语言的每个新版本一样,13.0 版提升了很多之前的数学函数。其中一个例子是获取函数极点的一种新的便捷方法。在复平面中绘制的特定函数:


这是单位圆内此函数的确切极点(及其重数):


现在我们可以对这些极点的残差求和,并使用柯西定理(https://mathworld.wolfram.com/CauchyIntegralTheorem.html)得到一个围道积分:


同样在微积分领域,我们为微分方程增加了各种便利的处理方法。例如,我们现在直接支持 ODE 中的向量变量(https://reference.wolfram.com/language/ref/DSolveValue.html):


我们还能依据图论方面的能力大大增强对 ODE 方程组的求解,找到将它们“解开”成为块对角线形式的方法,使我们能够在比以前复杂得多的情况下找到符号解。

对于偏微分方程,通常不可能获得非线性偏微分方程的通用“封闭形式”解。但有时可以得到称为完全积分(https://reference.wolfram.com/language/ref/CompleteIntegral.html)的特定解(其中只有任意常数,而不是“整体”任意函数)。现在我们有一个明确的函数来求解:


从微积分转向代数,我们添加了函数 PolynomialSumOfSquaresList,它为多元多项式提供了一种“正性证明”。这个想法是,如果多项式可以分解为平方和(大多数,但不是全部,永远不会为负),那么这证明多项式确实总是非负的:


对平方求和会再次给出原始多项式:


在 13.0 版中,我们还添加了几个新的矩阵函数。比如Adjugate(https://reference.wolfram.com/language/ref/Adjugate.html),它本质上是一个矩阵逆,但不除以行列式。还有 DrazinInverse(https://reference.wolfram.com/language/ref/DrazinInverse.html),它给出矩阵的非奇异部分的逆——特别用于求解微分代数方程。


更多PDE建模:固体和结构力学

PDE 既难以求解,也难以针对特定情况进行设置。多年来,我们已经为 PDE 构建了最先进的有限元解决方案。我们还构建了开创性的符号计算几何系统(https://reference.wolfram.com/language/guide/GeometricComputation.html),让我们能够灵活地描述 PDE 的区域。但是从版本 12.2(https://writings.stephenwolfram.com/2020/12/launching-version-12-2-of-wolfram-language-mathematica-228-new-functions-and-much-more/) 开始,我们也做了一些其他事情:我们已经开始为可以使用 PDE

建模的特定类型的物理系统创建显式符号建模框架。我们已经有了传热(https://reference.wolfram.com/language/PDEModels/tutorial/HeatTransfer/HeatTransfer.html)、传质(https://reference.wolfram.com/language/PDEModels/tutorial/MassTransport/MassTransport.html)和声学(https://reference.wolframcloud.com/language/PDEModels/tutorial/PDEModelsOverview.html)。现在在 13.0 版中,我们添加了固体和结构力学。

对我们来说,一个“经典的测试问题”是一茶匙的偏转(https://writings.stephenwolfram.com/2020/12/launching-version-12-2-of-wolfram-language-mathematica-228-new-functions-and-much-more/#convenient-real-world-pdes)。以下是设置方法。首先,我们需要定义我们的变量:勺子在每个 x、y、z 点的每个方向上的位移:


然后我们需要说一下我们勺子的材料参数是什么。在这里,我们可以利用我们的整个知识库,其中包含有关多种材料的详细信息:


现在我们已准备好实际设置和解决 PDE 问题:


一个 x、y、z 位移的内插函数列表被作为结果给出。现在我们可以使用一个新的 13.0 版图形函数来立即可视化这个结果:


这些插值函数也提供了关于我们得到的解决方案的更多细节。例如,这是勺子的应变张量,以对称的内插函数数组形式给出:


现在我们可以例如找到应变张量的最大 3, 3 分量及其实现的位置:


如何找到勺子上的应变值分布?一种简单的方法是对勺子中的随机点进行采样。


然后制作这些点应变的平滑直方图:


(我们之前看到的最大值在右边的尾部。)固体力学是一个复杂的领域,第 13 版有处理它的优秀工业级技术。事实上,我们有一整本名为“固体力学模型验证” (https://reference.wolfram.com/language/PDEModels/tutorial/StructuralMechanics/SolidMechanicsVerificationTests.html)的专著,描述了我们如何验证结果。我们还提供了一本关于固体力学的综合专著,描述了如何处理特定问题并使用我们的技术栈解决它们。


用图像和视频制作新的视频

在 12.3 版中,我们发布了 AnimationVideo 和 SlideShowVideo 等函数,可以轻松地根据生成的内容制作视频。在 13.0 版中,我们现在还拥有一系列用于从现有图像和视频创建视频的函数。 顺便说一句,在我们开始制作视频之前,版本 13.0 中的另一个重要新功能是现在可以直接在笔记本中播放视频:


这在桌面和云中都适用,您可以在笔记本电脑中获得所有标准视频控件,但您也可以弹出视频以使用外部(例如全屏)查看器进行查看。(您现在也可以使用 AnimatedImage 打包视频,使其成为“类似 GIF”的基于帧的动画。)

好的,那么回到从图像制作视频。假设您有一个大尺寸图像:


“体验”这样的图像的一个好方法是通过依次访问图像不同部分的“游览视频”。以下是如何执行此操作的示例:



您可以缩放也可以平移:



一个更复杂的例子是这个经典的“物理图像”:


可以找到所有人脸的位置,然后计算访问每个人脸的最短路径:


现在我们可以创建图像的“面部游览”:


除了从图像到视频,我们还可以从视频到视频。GridVideo 可处理多个视频,将它们排列在一个网格中,并创建一个组合的新视频:


我们还可以将单个视频“总结”为一系列视频 + 音频片段,例如在视频中等距选择。将其视为 VideoFrameList 的视频版本。以下是“总结”75 分钟视频的示例:


在版本 13.0 中还添加了一些处理视频的实用便利的函数。一个是 OverlayVideo,它允许您使用图像“水印”视频,或插入相当于“画中画”视频的内容:


我们还直接对视频进行了许多图像操作。因此,例如,要裁剪视频,您只需要使用 ImageCrop:

ImageCrop[%,200]


图像拼接

假设您从不同角度拍摄了一堆照片,现在您想将它们拼接在一起。在 13.0 版中,我们使用 ImageStitch 函数让这一切变得非常简单:


图像拼接的部分内容是在图像中找到关键点。在 13.0 版中,我们为 ImageKeypoints (https://reference.wolfram.com/language/ref/ImageKeypoints.html) 添加了另外两种方法(SIFT 和 RootSIFT)。但是对齐关键点还不是所有。我们也在做一些比如亮度均衡和镜头校正,以及跨接缝混合图像的努力。

可以使用诸如 TransformationClass (https://reference.wolfram.com/language/ref/TransformationClass.html)之类的选项来细化图像拼接,这些选项指定在组合单独的图像时应允许进行哪些转换。


树图继续生长

我们在 12.3 版中引入了 Tree (https://reference.wolfram.com/language/ref/Tree.html)作为基本构造。在 13.0 中,我们扩展了 Tree 并添加了一些增强功能。首先,现在有用于树图布局和可视化的选项。

例如,以下功能可放射状地布置一棵树(请注意,记住这是树图而不是一般图,这个想法可以帮助进行更系统性的嵌入):


这增加了样式元素的选项,其中一个由其树图位置指定的特定元素被挑出并标为蓝色:


更复杂的新“树概念”之一是 TreeTraversalOrder(https://reference.wolfram.com/language/ref/TreeTraversalOrder.html)。想象一下,你要“跨过”一棵树。您应该以什么顺序访问节点?下图展示了默认行为。设置树图:


现在显示 TreeScan(https://reference.wolfram.com/language/ref/TreeScan.html) 访问节点的顺序:


这按照访问节点的顺序显式标记节点:


默认情况下,此顺序是深度优先。但是现在 TreeTraversalOrder(https://reference.wolfram.com/language/ref/TreeTraversalOrder.html) 允许您要求其他排序。这是广度优先的顺序:


以下是一个稍微精致一些的排序:


为什么这很重要?事实证明,“遍历顺序”与关于计算过程和我现在所说的多重计算(https://writings.stephenwolfram.com/2021/09/even-beyond-physics-introducing-multicomputation-as-a-fourth-general-paradigm-for-theoretical-science/)的深层问题有关。从某种意义上说,遍历顺序定义了“参考框架”,树图的“观察者”通过该框架对其进行采样。而且,是的,这种语言听起来像物理学,但这是有充分理由的:这与我们物理项目中出现的一系列基础物理学概念密切相关。遍历顺序的参数化——除了对一堆现有算法有用——打开了将计算过程与物理学的思想联系起来以及关于我称之为多重计算的新概念的大门。


图形着色

长期以来,Wolfram 语言的图论能力令人印象深刻(例如,在使我们的物理项目(https://www.wolframphysics.org/)成为可能方面至关重要)。但在 13.0 版中,我们添加了更多内容。

我们普遍收到了围绕图形着色功能的请求。例如,给定一个图,如何为它的顶点分配“颜色”,使得没有一对相邻的顶点具有相同的颜色?在版本 13.0 中有一个函数 FindVertexColoring(https://reference.wolfram.com/language/ref/FindVertexColoring.html) 可以做到这一点:


现在我们可以用这些颜色“高亮”图形:


经典的“图形着色”问题涉及为地理地图着色。例如,这里是代表美国各州边界关系的图表:


现在很容易找到美国各州的 4 种颜色:


实际上有很多问题可以归结为图形着色。另一个例子是安排一场“比赛”,其中所有配对的人都在“比赛”,但每个人一次只参加一场比赛。所需的匹配集合是完整图形:


每个匹配对应于图中的一条边:


现在通过找到“边缘着色”,我们有一个可能的“时间段”列表,其中可以进行每场比赛:


EdgeChromaticNumber 给出一个所需的匹配总数:


地图着色也带来了平面图的话题。13.0 版引入了用于处理平面图的新功能。PlanarFaceList(https://reference.wolfram.com/language/ref/PlanarFaceList.html) 作用于平面图并告诉我们如何将图分解为“面”:


FindPlanarColoring(https://reference.wolfram.com/language/ref/FindPlanarColoring.html)直接计算这些平面的着色。同时,DualPlanarGraph(https://reference.wolfram.com/language/ref/DualPlanarGraph.html)制作了一个图,其中每个面都是一个顶点:


子图同构及更多

它随处可见。给定的图在哪里包含某个子图?在 13.0 版中,有一个函数可以给出结果(All(https://reference.wolfram.com/language/ref/All.html) 的意思是给出所有实例):


出现这种子图同构的一个典型领域是化学。这是分子的图形结构:


我们找到了六个原子组成的环:


13.0 版中的另一个新功能与处理流图(https://reference.wolfram.com/language/guide/GraphModifications.html#2145780989)有关。

基本问题是:在“流经”图形时,哪些顶点是关键的,换个说法就是,如果要到达所有未来的顶点,哪些顶点“必须被访问”?这是有向图的示例(是的,由多路系统(https://www.wolframphysics.org/technical-introduction/the-updating-process-in-our-models/multiway-systems-for-our-models/)制成):


现在我们可以使用 DominatorTreeGraph(https://reference.wolfram.com/language/ref/DominatorTreeGraph.html),它向我们展示了从 A 开始,哪些顶点对于到达何处至关重要的地图:


这现在说明每个顶点的“支配者”是什么,即离它最近的关键顶点是什么:


如果该图表示一个“事件”对其他“事件”的因果关系或其他依赖性,则支配者实际上是同步点,在那里一切都必须沿着“历史线索”进行。


空间场的估算

想象一下,您在空间的某些点(例如地球表面)对数据进行了采样。数据可能来自气象站、土壤样本、矿产钻探或其他来源。在 13.0 版中,我们添加了一组函数,用于从样本中估计“空间场”(https://reference.wolfram.com/language/guide/SpatialStatistics.html#914095272)(或有时称为“克里金法”(https://en.wikipedia.org/wiki/Kriging))。

取一些样本数据,并对其进行绘制:


现在让我们对数据进行“空间估计”:


这很像 InterpolatingFunction(https://reference.wolfram.com/language/ref/InterpolatingFunction.html),我们可以在任何我们想要的地方采样:


为了构建该计算,我们必须使用一个模型。我们可以在创建空间估计时更改模型:


得到的结果会不一样:


在 13.0 版中,您可以使用 SpatialTrendFunction(https://reference.wolfram.com/language/ref/SpatialTrendFunction.html) 和 SpatialNoiseLevel (https://reference.wolfram.com/language/ref/SpatialNoiseLevel.html)等选项详细控制模型。一个关键问题是如何假设空间场中的局部变化 - 您可以使用 VariogramModel (https://reference.wolfram.com/language/ref/VariogramModel.html)以符号形式指定。


正确把握时间:闰秒和其他

一天应该正好有24小时。只是地球不知道这一点。事实上,它的自转周期随时间略有变化(通常它的自转会减慢)。因此,为了使“一天中的时间”与太阳在天空中的位置保持一致,发明了“hack”来增加或减少“闰秒”(https://www.wolframalpha.com/input/?i=leap+second)。

从某种意义上说,描述时刻的问题有点像地理位置的问题。在地理位置中,存在描述空间位置的问题。知道地球上的经纬度是不够的;还必须有一个“地理模型”(由 GeoModel (https://reference.wolfram.com/language/ref/GeoModel.html)选项定义),描述地球的形状,因此纬度应该映射到实际空间位置。

在描述某个时刻时,我们同样必须说明我们的“时钟时间”如何映射到实际的“物理时间”。为此,我们在 13.0 版中引入了时间系统的概念,由 TimeSystem(https://reference.wolfram.com/language/ref/TimeSystem.html)选项定义。

这定义了 UT1 时间系统中 2021 年 12 月的第一个时刻:


这是 TAI (国际原子时)时间系统中 2021 年 12 月的第一个时刻:


但即使它们都与相同的“时钟描述”相关联,它们对应于不同的实际时刻。减去它们,我们得到一个非零值:


所以这里发生了什么呢?TAI 是一个基于原子钟的时间系统,其中每一天都精确地为 24 小时,其时间系统的“零”是在 1950 年代后期设置的。另一方面,UT1 是一个时间系统,其中每一天的长度由地球的实际自转定义。这表明,自从 TAI 和 UT1 在 1950 年代后期同步以来,地球的实际自转速度已经减慢到现在比精确的 24 小时一天的计量晚了大约 37 秒的地步。

UTC也是重要的时间系统——它是标准的“民用时间”,也是互联网的事实上的标准时间。UTC 不跟踪地球的精确自转速度;相反,它在 UT1 将要累积与 TAI 的下一秒差异时增加或减少离散闰秒——因此现在 UTC 正好落后 TAI 37 秒:


在版本 12.3(https://writings.stephenwolfram.com/2021/05/launching-version-12-3-of-wolfram-language-mathematica/) 中,我们引入了 GeoOrientationData(https://reference.wolfram.com/language/ref/GeoOrientationData.html),它基于测量的地球旋转速度的数据馈送。基于此,以下是过去十年间一天中 24 小时的偏差:


(而且这表明——这是自 1950 年代后期开始测量以来的第一次——地球的自转速度略有加快。)我们能看到为解释这些变化而添加的闰秒吗?让我们看看TAI时间系统中2017年初的几秒钟:


现在让我们使用新的 TimeSystemConvert(https://reference.wolfram.com/language/ref/TimeSystemConvert.html)函数将这些时刻转换为它们的 UTC 表示:


仔细看看这个。首先,UTC 和 TAI 的 2016 年结束和 2017 年开始的时间略有不同。但还有更奇怪的事情发生。在 2016 年底,UTC 显示时间为 23:59:60。为什么没有以“时钟算术”风格“打包”算入第二天?答:因为插入了闰秒。(这让我想知道当年在 0 时区庆祝新年的时候......)

如果您觉得这很微妙,请思考以下内容。在您的计算机内部有许多基于“全球时间”的控制系统操作的计时器。如果全球时间“出现故障”,这些计时器可能会发生问题。那么我们如何解决这个问题呢?我们在 Wolfram 语言中所做的是使用“涂抹过的 UTC”,并在一天中有效地涂抹掉闰秒——主要是通过使每个“秒”不完全等于“物理秒”长的方法。

这是 UTC 时间 2016 年最后一秒开始的时候:


但是在涂抹后的UTC中:


您可以从“闰秒日”中的秒数推导出该数字:


顺便说一句,您可能想知道为什么要关心这些内部原理的复杂性。在日常生活中,闰秒是一个细节。但如果你在做天文学,它们真的很重要。毕竟,在一(闰)秒内,光可以传播大约 186,000 英里……。


更清晰的新地理地图

地图涉及大量数据,(以适当的投影等方式)有效地交付和渲染是很困难的。在 13.0 版中,我们通过对所有标签使用矢量字体来最大地“锐化”地图:


至少现在,默认情况下背景仍然是位图。您也可以将“清晰化”的矢量图形用于背景,但渲染时间会更长:


使用矢量标签的一个优点是它们可以在所有地理投影中工作(请注意,在版本 13 中,如果您没有为 GeoGraphics(https://reference.wolfram.com/language/ref/GeoGraphics.html) 指定区域,它将默认为整个世界):


版本 13 中的另一个新增功能是混合多个背景层。下面是一个范例,其中包含一张街道地图,顶部有一张半透明的地形图(上面有标签):


几何区域:拟合与构建

给定一个圆上的一堆点,它们所在的圆是什么?

以下是围绕圆圈随机选择的点:


新函数 RegionFit(https://reference.wolfram.com/language/ref/RegionFit.html) 可以找出点在哪个圆上:


这是三维空间中的点集合:


可将这些点拟合到一个圆柱体上:


13.0 版中另一个非常有用的新功能是 ConcaveHullMesh(https://reference.wolfram.com/language/ref/ConcaveHullMesh.html)——它会试图从三维的点集合中重建一个曲面。以下是1000个点:


凸包将在所有点周围放置“收缩封装”:


但是凹包会使表面“陷入凹坑”:


还可以自由重建曲面。版本 13 中的另一个函数是 GradientFittedMesh(https://reference.wolfram.com/language/ref/GradientFittedMesh.html),它根据推断的曲面法线集合形成曲面:


我们刚刚说的是根据“点数据”构建几何区域。13.0 版中的另一个新功能是构造实体几何 SolidGeometry(CSG)(https://reference.wolfram.com/language/guide/SolidGeometry.html#1393753078),可以明确地从几何图元构建区域。该功能的主要函数是 CSGRegion(https://reference.wolfram.com/language/ref/CSGRegion.html),允许对图元进行各种操作。下图是由图元的交集形成的区域:


请注意,这是一个“精确”区域——不涉及数值近似。所以当我们想要求得体积时,我们会得到一个确切的结果:


可以分层构建更复杂的结构:


尽管积分会更困难,但通常仍然可以得到诸如体积之类的精确结果:


给定一个分层构造的几何区域,可以使用 CSGRegionTree(https://reference.wolfram.com/language/ref/CSGRegionTree.html) 将其“树出”:


在做机械工程的内容时,通过实际执行各种操作来制造零件是很常见的,这些操作可以很容易地以 CSG 形式表示。下例是一个稍微复杂的 CSG 树:


可以“组装”到典型工程部件的实际 CSG 区域中:


思考一下,CSG 高亮了确定两个区域何时“相同”的问题。例如,即使一个区域可能被表示为一个一般的多边形 Polygon(https://reference.wolfram.com/language/ref/Polygon.html),它实际上也可能单纯是一个矩形 Rectangle(https://reference.wolfram.com/language/ref/Rectangle.html)。更重要的是,该区域可能位于空间中的不同位置,具有不同的方向。

在版本 13.0 中,函数 RegionCongruent 对此进行了测试:


RegionSimilar (https://reference.wolfram.com/language/ref/RegionSimilar.html)还允许区域改变大小:


但是知道两个区域相似,下一个问题可能是:从一个区域到另一个区域需要什么转换?在 13.0 版中,FindRegionTransform (https://reference.wolfram.com/language/ref/FindRegionTransform.html)对该问题进行计算:


化学式和化学反应

在第 12 版中,我们引入了分子作为化学中分子的符号表示。在后续版本中,我们一直在稳步添加更多围绕 Molecule 的功能。在版本 13.0 中,我们添加了诸如使用附加信息注释二维和三维分子图的功能:


分子提供了特定类型分子的表示,在三维空间中具有特定的原子排列。然而,在版本 13.0 中,我们将其推广到任意化学式,化学式描述每种类型原子的数量,而没有提供化学键或三维排列的信息。可以像输入字符串一样输入化学式:


仅从公式就可以计算出一些属性,例如分子量:


给定化学式,可以知道具有该化学式的特定“已知”分子:


通常会有很多这样的分子,可以看到它们在“化学特征空间”中的排列方式:


我们既然可以处理分子和化学式了,下一步则是化学反应。而在 13.0 版中,我们从用符号表示化学反应的能力开始。

您可以将反应输入为字符串:


以下是用明确规则表示的反应:


但这个化学反应没有配平。我们可以使用 ReactionBalance(https://reference.wolfram.com/language/ref/ReactionBalance.html)配平该化学反应:


而且,不用说,ReactionBalance 是非常通用的,因此它可以处理需要求解丢番图方程 DiophantineEquations(https://reference.wolfram.com/language/guide/DiophantineEquations.html)来配平的化学反应:


生物序列:绘图、次级键等

在版本 12.2 中,我们引入了 BioSequence(https://reference.wolfram.com/language/ref/BioSequence.html) 的概念,以表示由离散单元序列组成的 DNA、RNA 和蛋白质等分子。在 13.0 版中,我们添加了各种新的 BioSequence(https://reference.wolfram.com/language/ref/BioSequence.html)功能。一个是 BioSequencePlot(https://reference.wolfram.com/language/ref/BioSequencePlot.html),它提供了生物序列的直接可视化表示:


除了可视化之外,13.0 版还增加了表示 RNA、蛋白质和单链 DNA 次级结构的能力。例如,这里是一段带有额外氢键的 RNA:


您还可以使用“点括号”表示法指定次级结构:


BioSequence (https://reference.wolfram.com/language/ref/BioSequence.html)还支持混合链,例如涉及 DNA 和 RNA 之间的链接:


Molecule(https://reference.wolfram.com/language/ref/Molecule.html)将 BioSequence 转换为一个显式的原子集合:


总而言之,这是对于胰岛素分子,两个肽(现在有二硫键)之间交联的例子:


航班数据

Wolfram 语言的目标之一是尽可能多地了解世界。在 13.0 版中,我们添加了一个新领域:有关当前和过去飞机航班的信息(目前仅限美国)。

假设我们想了解昨天波士顿和圣地亚哥之间的航班。我们可以询问 FlightData(https://reference.wolfram.com/language/ref/FlightData.html):


现在让我们看看其中一个航班。可表示为一个符号实体,也具有各种属性:


这将飞机的高度绘制为时间的函数:


这是航班遵循的飞行路径:


FlightData 还可以获取汇总数据。例如,下图说明昨天到达波士顿的所有航班来自哪里:


下图显示了昨天从波士顿起飞的航班的直方图:


同时,以下是抵达波士顿的航班在机场附近的路线:


而且,是的,现在还可以开始查看跑道航向、昨天的风向等——我们在知识库中拥有的所有数据。


多轴和多面板图

我们年复一年在收到添加这个功能的请求。并且我们也针对这个功能做了很多努力。但是现在在 13.0 版本中,我们将多轴绘图直接内置到 Wolfram 语言中。下面是一个例子:


如图所示,蓝色曲线的刻度在左边,橙色曲线的刻度在右边。

您可能认为这看起来很简单。但事实并非如此。实际上,需要将多个坐标系都组合成一个图,然后通过各种形式的样式链接的轴来消除歧义。我在们12.3 版中引入的 AxisObject(https://reference.wolfram.com/language/ref/AxisObject.html) 和“非实体轴”(https://reference.wolfram.com/language/ref/MultiaxisArrangement.html)为此奠定了基础的最后一步。

以下是一个更复杂的案例,有 5 条曲线,每条曲线都有自己的轴:


如果某些曲线共用它们的轴,则会发生以下情况:


多轴可让您将多条曲线打包到一个“绘图面板”上。多面板图可让您将曲线放入具有共用轴的不同但连接的面板中。多面板图的第一个范例已经在版本 12.0 中引入。但现在在 13.0 版中,我们将多面板图扩展到其他类型的可视化中:


绘图缩放中的日期和无穷大

在 13.0 版中,绘图中的“坐标”不一定要是数字;他们也可以是日期。因此,这意味着所有常用的绘图函数都“适用于”时间序列:


所以可以在多个轴上设置日期。下面是根据日期绘制一天中的时间(一个 TimeObject(https://reference.wolfram.com/language/ref/TimeObject.html))的示例,在这种情况中,即为用于存储在 Databin(https://reference.wolfram.com/language/ref/Databin.html)中的电子邮件时间戳:


13.0 版中,轴的另一项新功能是具有无限绘图范围的能力(或者更确切地说是缩放):


该函数的原理是用缩放函数将无限区间映射到有限区间。您可以明确将其与 ScalingFunctions(https://reference.wolfram.com/language/ref/ScalingFunctions.html)一起使用:


这是一个稍微复杂一点的例子,其中包括一个双无限区间:


新的可视化类型

我们一直致力于添加新类型的内置可视化功能。在 13.0 版中,我们添加了如矢量位移图(https://reference.wolfram.com/language/ref/VectorDisplacementPlot.html)的功能,以支持我们在固体力学方面的新功能:


三维空间中:


该图显示了给定区域如何因特定位移场而变形。VectorPoints(https://reference.wolfram.com/language/ref/VectorPoints.html)还允许包含位移向量:


在版本 12.3 中,我们引入了 GeoGraphPlot(https://reference.wolfram.com/language/ref/GeoGraphPlot.html)函数,用于绘制以顶点为地理位置的图形。在 13.0 版中,我们添加了 GeoGraphValuePlot(https://reference.wolfram.com/language/ref/GeoGraphValuePlot.html),它还允许您可视化图形边缘的“值”:


符号化Lighting的功能

Lighting (https://reference.wolfram.com/language/ref/Lighting.html) 是感知三维图形的关键元素。自 1.0 版以来,我们就有了基本选项 Lighting 来指定三维场景中的整体照明。但是在版本 13.0 中,我们可以对光照进行更精细的控制——现在我们支持三维对象的材质、表面和着色属性,这是一个很重要的功能。

关键的一点是使光源可以用符号表示。下例表示光源的配置:


它可以立即与现有的照明选项一起使用:


但是新功能是通过为它们指定不同的符号“照明样式”来“单独照亮”场景中的不同对象:


顺便说一下,13.0 版的另一个新特性是内置的 Torus(https://reference.wolfram.com/language/ref/Torus.html)图元:


用于机器学习的内容检测器

Classify (https://reference.wolfram.com/language/ref/Classify.html) 可让您训练“全数据”分类器。“这是猫吗?”或“这是关于电影的文本吗?”在 13.0 版中,我们添加了训练内容检测器的功能,这些检测器用作数据子部分的分类器。“这里有什么猫?”“该内容的哪个部分讲电影?”

该功能的基本思想是给出整个输入的范例,在每种情况下都说明输入中的哪个位置对应于特定的类。以下是在文本中挑选主题类别的一些基本训练:


现在我们可以在特定输入上使用内容检测器:


这是如何运作的?基本原理是 Wolfram 语言已经对文本、单词和含义有诸多了解。所以你可以举一个与足球相关的例子,它可以从它的内置知识库(https://www.wolfram.com/knowledgebase/)中给出篮球是同一类物品的信息。

在 13.0 版中,您不仅可以为文本创建内容检测器,还可以为图像创建内容检测器。图像的问题要复杂得多,因此构建内容检测器需要更长的时间。但是,一旦构建完成,它就可以在任何图像上快速运行。

就像文本一样,您可以通过提供范例图像来训练图像内容检测器,并说明您给出的事物类别在这些图像中出现的位置:


完成此训练后(在支持 GPU 的机器上花费了大约 5 分钟),我们可以应用我们刚刚创建的检测器:


当您应用检测器时,您可以向它询问各种信息。这里提供了可用于注释原始图像的边界框:

顺便说一句,这个功能的原理比较复杂。总之我们使用了大量关于通常出现的图像类型的内置知识。当您提供样本图像时,我们会使用通过转换样本获得的各种“典型相似”图像来增强这些图像。然后再利用从您的范例中获得的新信息有效地重新训练我们的图像系统。


机器学习的可视化功能和诊断

我一直使用的机器学习功能之一是 FeatureSpacePlot(https://reference.wolfram.com/language/ref/FeatureSpacePlot.html)。13.0 版添加了一种新的默认方法,使 FeatureSpacePlot 更快更稳健生成很好的结果。这是它在 10,000 张图像上运行的示例:


Wolfram 语言中机器学习的一大优点是您可以以高度自动化的方式使用它。您只需给 Classify(https://reference.wolfram.com/language/ref/Classify.html)一组训练范例,它就会自动生成一个您可以立即使用的分类器。但它究竟是如何做到的呢?流程的一个关键部分是弄清楚如何提取特征并将数据转换为数字数组。在 13.0 版中,您现在可以获得为之构建的显式特征提取器(https://reference.wolfram.com/language/ref/FeatureExtractor.html)(例如,您可以在其他数据上使用它):


以下是单个数据的提取特征:


这解释了 Classify 的工作逻辑。您还可以询问 Classify 给出的输出影响最大的是什么。有一种方法是使用 SHAP 值来确定您提供的任何数据中指定的每个属性对输出的影响。在 13.0 版中,我们添加了一种方便的图形方式(https://reference.wolfram.com/language/ref/ClassifierMeasurements.html)来显示给定输入的内容:


自动化追踪机器人等问题

设计控制系统是很复杂的。首先,必须为要控制的系统建立一个模型。然后必须定义控制器的目标。然后必须实际构建一个实现这些目标的控制器。借助 Wolfram 语言和 Wolfram System Modeler 中的整个技术栈,我们可以用前所未有的自动化流程来完成这些事情。

13.0 版专门增加了设计控制器的功能,使系统跟踪指定的信号——例如让机器人遵循特定的轨迹。

思考一个非常简单的机器人,它由一个移动的小车组成,并附有一个指针:


首先,我们需要一个机器人模型,我们可以在 Wolfram System Modeler (https://www.wolfram.com/system-modeler/) 中创建(或作为 Modelica 模型 (https://reference.wolfram.com/language/ref/format/MO.html) 导入):


我们现在的目标是建立一种方法来“驱动”机器人的输入变量(移动推车的力,以及指针的扭矩):


为了实现输出变量的某些行为(指针末端的位置):


这是我们希望指针末端随时间变化的曲线:


现在我们要实际构建控制器——这也是我们需要了解一些控制理论的地方。在这里,我们将使用极点放置(https://reference.wolfram.com/language/ref/StateFeedbackGains.html)的方法来创建控制器。使用 13.0 版的新功能设计一个“跟踪控制器”来跟踪指定的输出(要设置这些数字,您必须了解控制理论):


现在制作包含机器人及其控制器的闭环系统:


现在我们可以模拟整个系统的行为,将参考轨迹的 x 和 y 坐标列表作为输入:


基于这个模拟,这里有一个关于指针末端位置的图:

初始瞬态之后就会遵循我们想要的路径。而且,尽管有些复杂,但比我们直接使用真实的硬件而不是进行理论上的“基于模型(https://reference.wolfram.com/language/guide/SystemModelAnalyticsDesign.html)”的设计要简单得多。


少输入一些括号!

当您第一次启动版本 13 并输入类似 f[ 的内容时,您将看到以下内容:




接第二篇......