前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Wolfram语言和Mathematica版本13的最新功能

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

作者头像
WolframChina
发布2022-04-01 13:01:16
2.2K0
发布2022-04-01 13:01:16
举报
文章被收录于专栏:WOLFRAMWOLFRAM

本文译自 Wolfram 博客:https://blog.wolfram.com/2021/12/13/launching-version-13-0-of-wolfram-language-mathematica/

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:

代码语言:javascript
复制
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[ 的内容时,您将看到以下内容:

版本 13 现在所做的是在它认为没有歧义时自动添加匹配的括号。需要学习的是,您可以“输入”括号;换句话说,如果这种情况下光标正好位于自动添加的 ] 之前,您明确键入 ] 则不会出现新的 ];系统只会“输入”]。

还有一种选择是使用 ctrlspace 移动到自动添加的右括号的右侧。而且,顺便说一句,即使光标不在括号旁边,ctrlspace 也会“向右移动”下一个右括号;即使光标位于嵌套结构的深处,它也会这样做。

自动化行为(https://reference.wolfram.com/language/ref/DelimiterAutoMatching.html)(如果您真的不喜欢,可以在“首选项”对话框中将其关闭)不仅适用于 [ ],还适用于 { }, ( ), [[ ]], <| |>、(* *) 和(重要的)“”。并且 ctrlspace 也适用于所有这些类型的分隔符。

对于认真的用户体验爱好者来说,可能还有一个有趣的地方。键入 ctrlspace 可能会将光标移动得远到看不见它。当输入正在实时排版的数学和其他二维材料时,也会发生这种远程光标移动。在 1990 年代,我们发明了一种机制来避免人们“丢失光标”。在内部,我们称其为“难以置信的收缩斑点”。它是一个大的黑点,出现在光标的新位置,并在大约 160 毫秒内缩小为纯光标。将此视为“视觉黑客”。实际上我们在准备加入人类的预注意视觉系统,这会让人们自动将视线转移到“突然出现的物体”上,但实际并没有真正注意到自己已经这样做了。

在版本 13 中,我们现在不仅将这种机制用于实时排版,还用于 ctrlspace——每当“跳跃距离”超过某个阈值时添加 blob。

你甚至可能不会注意到这个黑点的存在(只有一小部分人似乎“看到”了它)。但如果时机够好,你会看到:

计算的进步

你正在运行一个很长的计算,一定想知道这期间系统都在干什么?我们有一项长期计划,旨在为尽可能多的执行长时间计算的函数提供交互式进度监控。

13.0 版本中的一个例子是ParallelMap、ParallelTable等自动为您提供进度监控:

显示是暂时的;它仅在计算运行时存在,然后消失。

这方面还有很多其他的例子,而且还会有更多。视频、机器学习、知识库访问、导入/导出和各种算法函数都有进度监控:

一般来说,进度监控是一件好事;它可以帮助您了解正在发生的事情,并允许您检查事情是否偏离了轨道。但有时它可能会令人困惑,特别是如果有一些你甚至不知道被调用的内部函数 ——你突然看到它的进度监控。很长一段时间以来,我们一直认为这个问题会使广泛进度监控成为一个坏主意。但是,看到正在发生的事情的价值几乎总是超过看到你不知道的“幕后”发生的事情所带来的困惑。一旦某些操作结束,它的进度监视器就会消失,因此在您的最终笔记本中没有任何迹象,这确实很有帮助。

顺便说一句,每个带有进度监控的函数都有一个 ProgressReporting 选项,您可以将其设置为 False。此外,还有一个全局变量 $ProgressReporting 指定整个系统的默认值。

值得一提的是,“做完了吗?”有不同层次的监控。某些函数会经过系统的一系列步骤,例如处理视频中的每一帧。在这种情况下,可以将“完成比例”显示为进度指示条。有时,通过“统计地”查看到目前为止部分计算中发生的情况,也可以至少对“完成比例”(以及预期的完成时间)做出一些猜测。例如,这就是 ParallelMap 如何等进行进度监控。当然,通常不可能知道任意计算需要多长时间。这就是计算不可约性以及图灵机停机问题的不可判定性的故事。但是假设(大多数情况下结果都很好)不同子计算的运行时间分布相当平滑,仍然可以给出合理的估计。(而且,是的,潜在不确定性的“明显迹象”是完成百分比可能会随着时间的推移而下降和上升。)

Wolfram|Alpha 笔记本

多年来,我们拥有 Mathematica + Wolfram Language,并且拥有 Wolfram|Alpha。然后在 2019 年底,我们推出了Wolfram|Alpha Notebook Edition,作为两者之间的一种融合。事实上,在 Mathematica 和 Wolfram|Alpha 的标准桌面和云部署中,现在还有 Wolfram|Alpha-Mode Notebook 的概念,其基本思想是您可以用自由形式的自然语言输入内容,但获得在表示和建立计算方面的 Wolfram 语言功能:

在 13.0 版中,Wolfram|Alpha-Mode Notebooks 添加了很多内容。首先,有用于直接输入 2D 数学符号的调色板:

现在还可以直接从自由格式的语言输入中立即生成丰富的动态内容:

除了“定制”互动内容,在 Wolfram|Alpha-Mode Notebooks 中,您还可以立即访问来自 Wolfram 演示项目(https://demonstrations.wolfram.com/) 中 12,000 多个演示的互动内容:

Wolfram|Alpha Notebook Edition 尤其适用于教育。在 13.0 版中,我们包含了第一个交互式测验集合,特别是关于图的:

测验所需要的一切都在语言中

13.0 版引入了在桌面和云端直接用 Wolfram 语言创建、部署和评分测验的能力。以下是已部署测验(https://www.wolframcloud.com/obj/sw-writings/Quizzes/WolframLanguageQuiz/quiz)的示例:

这是怎么做的?有一个创作笔记本(https://www.wolframcloud.com/download/sw-writings/Quizzes/WolframLanguageQuiz/authoring),看起来像这样:

这一切都基于我们在12.2版本中引入的表单笔记本功能。但是还有一个额外的元素:QuestionObject。QuestionObject 给出了要问的问题的符号表示,和 AssessmentFunction 一起应用到提供的答案、评估、评分或以其他方式处理。

在最简单的情况下,“要问的问题”只是一个字符串。但它可以更复杂,并且您可以在创作笔记本中选择一系列可能性(将稳步增长):

(构造 QuestionInterface 可让您详细控制“问题提示”的设置方式。)

一旦您在创作笔记本中创建了测验(当然它不必只是课件意义上的“测验”),您需要部署它。设置允许您设置各种选项:

然后,当您按“ Generate 时,您会立即获得测验的部署版本,例如,可以直接在 Web 上访问。您还将获得一个结果笔记本,它向您展示如何从进行测验的人那里检索结果。

那么当有人做测验时会发生什么呢?每当他们按下 Submit时,他们的答案将被评估并提交到您指定的目的地——可以是云对象、数据库等(您还可以指定您希望将本地反馈提供给进行测验的人。)

因此,在几个人提交了答案后,您得到的结果可能如下所示:

总而言之,13.0 版现在提供了用于创建简单和复杂测验的简化工作流程。测验可以涉及各种不同类型的响应——特别是包括可运行的 Wolfram 语言代码。评估也可以是复杂的——例如包括代码比较。

只是为了了解可能的情况,这里有一个要求选择颜色的问题,它将与正确答案在一定的公差范围内进行比较:

解开电子邮件、PDF等

电子邮件线程到底是什么样的?我琢磨这个已经很久了。现在在 13.0 版中,我们可以轻松导入 MBOX 文件并查看电子邮件的线程结构。以下是我们内部邮件列表中的一个示例:

代码语言:javascript
复制
Import["https://www.wolframcloud.com/obj/sw-writings/Version-13/Example1.mbox","ThreadGraph"]

现在我们可以对此进行标准图操作:

12.2 版的一个重要新功能是能够以各种形式忠实地导入 PDF,包括页面图像和纯文本。在 13.0 版中,我们添加了将 PDF作为矢量图形导入的功能。

以下是作为图像导入的页面示例:

现在这是一个作为矢量图形导入的页面:

现在,为了证明它是矢量图形,我们实际上可以进去修改它,一直到每个字形中使用的笔画:

现在我们有了Wolfram 语言的视频,我们希望能够导入尽可能多的视频。我们已经支持非常完整的视频容器和编解码器列表。在 13.0 版中,我们还添加了导入 .FLV (Flash) 视频的功能,让您有机会将它们转换为现代格式。

CloudExpression 成为主流

您有一个想要跨会话操作的表达式。一种方法是使用PersistentValue使整个表达式持久化——或者将其显式存储在文件或云对象中,并在需要时将其读回。但是有一种更有效和无缝的方法来做到这一点——它不需要你一直处理整个表达式,而是让你“戳”和“偷看”各个部分——那就是使用CloudExpression。

我们在 2016 年的10.4 版本中首次引入了CloudExpression。当时,它的目的是作为一种相当临时的方式来存储相当小的表达式。但我们发现它比我们预期的更有用,因此在 13.0 版中它进行了重大升级,使其更加高效和强大。

值得一提的是,还有其他几种方法可以在 Wolfram 语言中持久存储内容。您可以使用PersistentValue来持久化整个表达式。您可以使用Wolfram Data Drop (https://datadrop.wolframcloud.com/) 功能让您逐步添加到数据仓。您可以使用ExternalStorageUpload 将内容存储在 S3 或 IPFS 等外部存储系统中。或者您可以设置一个外部数据库(如基于 SQL 或基于文档的数据库),然后使用Wolfram 语言函数来访问和更新它.

但是 CloudExpression 提供了一种更轻量级但更通用的方式来设置和操作持久表达式。基本思想是创建一个持久存储在您的云帐户中的云表达式,然后能够对该表达式执行操作。如果云表达式由列表和关联组成,那么标准的 Wolfram 语言操作让您可以有效地读取或写入云表达式的部分内容,而无需在会话中将整个内容拉入内存。

这会从一个包含多项式的表中创建一个云表达式:

这给了我们表格的第 5 部分:

代码语言:javascript
复制
In[1]:= ce[5]
Out[1] = 1+x^5

我们可以重置它:

代码语言:javascript
复制
In[2] := ce[5]= yyyy
Out[2] = yyyy

这得到了整个云表达式:

但重要的一点是,获取和设置部分云表达式不需要将表达式拉入内存。相反,每个操作都直接在云中完成。

在传统的关系数据库系统中,数据必须具有一定的“矩形性”。但是在云表达式中(例如在 NoSQL 数据库中),您可以有任何嵌套列表和关联结构,此外,元素可以是任意符号表达式。

CloudExpression的设置使您使用的操作是原子的,例如,您可以安全地让两个不同的进程同时读取和写入同一个云表达式。结果是CloudExpression 是处理由APIFunction 和 FormFunction等构建的数据的好方法。

顺便说一句,CloudExpression 最终实际上只是一个云对象,因此它与CloudObject 共享权限功能。这意味着,例如,您可以让其他人读取或写入您创建的云表达式。(与CloudExpression关联的数据存储在您的云帐户中,尽管它使用自己的存储配额,与CloudObject的配额不同。)

假设您将大量重要数据作为子列表存储在CloudExpression中。CloudExpression非常易于使用,您可能会担心只输入ce["customers"]=7 之类的内容,然后您的关键数据会突然被覆盖。为避免这种情况,CloudExpression 提供了PartProtection选项,它允许您指定,例如,您是要允许更改表达式的结构,还是只允许更改其“叶元素”。

函数存储库的进展

当我们在 2019 年推出Wolfram 函数存储库时,我们并不知道它会以多快的速度增长。但我很高兴地说,它取得了巨大的成功——每天可能发布 3 个新函数,迄今为止总共有 2259 个函数。这些函数不是核心Wolfram 语言的一部分,但可以立即从任何 Wolfram 语言系统访问.

它们是由社区成员贡献的功能,由我们审查和策选。考虑到核心 Wolfram 语言的所有功能,在单个贡献函数中可以实现的效果是非常了不起的。这些函数大多不具备集成到核心 Wolfram 语言所需的全部广度和鲁棒性(尽管版本 13.0 中的Adjugate等函数是从函数库中的“原型”开发的),但他们所拥有的是一个大大加速的交付过程,这使得新领域中的便利新功能能够非常迅速地可用。

函数存储库中的一些函数扩展了算法能力。一个例子是用于计算分数导数的FractionalOrderD :

FractionalOrderD 中有很多内容。但它在某种程度上是非常具体的——从某种意义上说,它基于一种特定类型的分数微分。将来我们可能会在系统中构建全尺度分数微分,但这需要大量新算法。Function Repository 中的 FractionalOrderD 所做的是现在只提供一种形式的分数微分。

这是函数存储库中函数的另一个示例,这次是基于Wolfram|Alpha中的功能:

另一个类似的例子是:

某些功能提供扩展的可视化功能。这是维恩图:

有很多方法可以想象处理更复杂的情况;这个函数做了一个特殊的选择:

作为可视化函数的另一个示例,这里是TruthTable — 用于直观显示核心语言BooleanTable 函数的结果:

一些函数为语言的特定特性提供了方便的(尽管可能不完全是通用的)扩展。这是IntegerChop 将“足够接近整数”的实数化简为精确整数:

代码语言:javascript
复制
In[=]:= ResourceFunction["IntegerChop"][7.00000000000000000000000001]
Out[=]:= 7

这是一个函数的示例,也许有一天它会在核心语言中。但目前最常见的情况是由 Function Repository 函数提供的:

代码语言:javascript
复制
In[=]:= ResourceFunction["PolarDecomposition"][{{2.5,4.5},{5.6,1.2}}]
Out[=]:= {{{0.12766, 0.991818}, {0.991818, -0.12766}}, {{5.87333, 
   1.76465}, {1.76465, 4.30999}}}

Function Repository 中有很多函数,它们为核心语言的功能领域提供了特定的扩展。例如, BootstrappedEstimate为统计功能提供了一个有用的特定扩展:

这是一个“重新映射”曼德尔布罗集的函数 —— 使用 FunctionCompile 比MandelbrotSetPlot 更进一步:

有一些功能看起来绝对是“小众”——但如果你需要它们,它们会非常有用:

还有一些功能使“当前问题”变得方便。一个例子是MintNFT:

还有“有趣的功能”(肯定也很有用):

还有一些功能可能被认为是“内幕”幽默:

顺便说一句,不仅仅是函数库一直在成长,做出了各种巨大的贡献:还有数据库 (https://datarepository.wolframcloud.com/) 和神经网络库 (https://resources.wolframcloud.com/NeuralNetRepository/),它们也在大力推进。

介绍创建程序包的工具

函数存储库是关于创建添加功能的单个函数。但是,如果您想创建一个具有许多相互关联的函数的全新功能世界怎么办?也许它不仅涉及函数,还涉及例如对用户界面元素的更改。多年来,我们使用我们称之为 paclet 的技术在内部构建了Wolfram 语言系统的许多部分——它有效地提供了可以自动安装在任何给定用户系统上的功能包。

在12.1 版本中我们开放了 paclet 系统,提供了PacletFind 和PacletInstall 等特定功能来使用 paclet。但是创建 paclet 仍然是一门黑魔法。在 13.0 版中,我们现在发布了第一轮工具来创建 paclet (https://reference.wolfram.com/language/PacletTools/guide/PacletTools.html),并允许您将它们部署为文件或通过 Wolfram Cloud (https://www.wolfram.com/cloud/index.php.zh) 分发。

以程序包形式分发的程序包工具,现在默认包含在每个 Wolfram 语言安装程序中. 目前,这些工具位于一个单独的包中,您必须加载:

代码语言:javascript
复制
Needs["PacletTools`"]

要开始创建 paclet,您需要定义一个“paclet 文件夹”,其中包含构成您的 paclet 的所有文件:

这将设置您的 paclet 的基本大纲结构,然后您可以添加文件:

作为替代方案,您可以在第一次创建 paclet 时在您的 paclet 中指定一些组件:

paclet 中可以存在各种各样的元素,在未来的版本中,将会有更多的工具使创建它们变得更加容易。然而,在 13.0 版中,交付的一个主要工具是文档工具 (https://reference.wolfram.com/language/DocumentationTools/tutorial/DocumentationToolsQuickStart.html),它提供了用于创建与内置系统功能相同类型的文档的工具。

您可以直接从主系统调色板 (Palettes) 菜单访问这些工具:

现在,您可以在您的程序包函数参考页面、指南页面、技术说明和其他文档元素中创建笔记本。一旦你有了这些,你就可以使用PacletDocumentationBuild将它们构建到完成的文档中。然后,您可以将它们作为笔记本文件、独立的 HTML 文件或部署在云中的材料。

即将推出用于创建程序包的其他工具,以及用于用户贡献数据包的公共程序包存储库。支持 Paclet 存储库的一个重要特性——已经可以与私有部署的 paclet 一起使用——是新函数 PacletSymbol。

对于函数存储库,您可以使用 ResourceFunction["name"] 访问存储库中的任何函数。PacletSymbol 是程序包的类似物。使用程序包的一种方法是显式加载其所有资产。但是 PacletSymbol 允许您“深度调用”到一个 paclet 以访问单个函数或符号。就像ResourceFunction 一样,在幕后仍然会发生各种资产加载,但是在您的代码中,您可以只使用 PacletSymbol 而无需任何可见的初始化。顺便说一下,一种新兴的模式是用一个程序包“支持”一组相互依赖的函数存储库函数,使用PacletSymbol 从函数存储库中的代码访问各个函数。

上下文别名介绍

当您为某事使用名称(例如x)时,总是会出现“哪个x?”的问题。从版本 1.0 开始,每个符号都有上下文的概念。默认情况下,您在Global上下文中创建符号,因此您创建的x的全名是Global`x。

创建程序包时,您通常希望对其进行设置,以便它们引入的名称不会干扰您正在使用的其他名称。为了实现这一点,通常让程序包定义自己的上下文。然后,您始终可以通过其全名引用程序包中的符号,例如Package`Subpackage`x等。

但是,当您只要求x时,您会得到什么?这是由Context和ContextPath的设置定义的。

但有时你想要一个中间案例。如果Package`在上下文路径$ContextPath上,您希望能够在“在其程序包中”引用 x ,而不需要输入(或必须查看)潜在的长程序包的名称。

在 13.0 版中,我们引入了上下文别名的概念来让您这样做。基本思想非常简单。当您执行 Needs["Context`"] 加载定义特定上下文的程序包时,您可以通过执行 Needs ["Context`"->"alias`"] 添加“上下文别名” 。这样做的结果是,您可以将该上下文中的任何符号称为 alias`name。如果您没有指定上下文别名,Needs 会将您要求的上下文添加到 $ContextPath,因此其符号是“只有 x“ 形式。但是,如果您正在使用许多不同的上下文,这些上下文可能包含名称重叠的符号,那么为每个上下文使用上下文别名是一个更好的主意。如果您定义短别名,则不会有更多的输入,但您将确保始终引用正确的符号。

这会加载与上下文 ComputerArithmetic` 对应的包,默认情况下将该上下文添加到 $ContextPath:

代码语言:javascript
复制
Needs["ComputerArithmetic`"]

现在可以使用具有ComputerArithmetic的符号而无需说明其上下文:

这将加载为其定义上下文别名的包:

代码语言:javascript
复制
 Needs["ComputerArithmetic`"->"ca`"]

现在您可以使用别名来引用它的符号:

全局符号$ContextAliases指定您当前使用的所有别名:

顺便说一句,就像我们关于名称以大写字母开头的符号的约定一样,程序包的上下文名称也以大写字母开头是一种常见的通用约定。现在我们也有上下文别名,我们建议使用小写字母的约定。

符号网页构建

如果你想把一个笔记本变成一个网页,你需要做的就是 CloudPublish。同样,如果您想在 Web 上创建表单,您可以将 CloudPublish 与 FormFunction(或FormPage)一起使用。此外, Wolfram 语言中还内置了多种其他直接写 Web 的功能。

但是,如果您想制作一个包含精致 Web 元素的网页怎么办?一种方法是使用XMLTemplate 将 Wolfram 语言输出插入 HTML 等文件。但在 13.0 版中,我们开始设置完整网页结构的符号规范,让您充分利用 Wolfram 语言和 web 能力及框架。

这是一个非常小的例子:

这是它产生的网页:

基本思想是使用WebColumn、WebRow和WebItem的嵌套组合来构建网页。每一个都有不同的 Wolfram 语言选项。但它们也允许直接访问 CSS 选项。因此,除了 Wolfram 语言背景-> LightBlue选项之外,您还可以使用 CSS 选项,例如"border-right"->"1px solid #ddd"。

还有一个额外的关键特性:InterfaceSwitched。这是能够创建响应式网页的核心,这些网页在不同类型的设备上查看时可以改变其结构。InterfaceSwitched 是一个符号结构,您可以在 WebItem、WebColumn 等内部的任何位置插入它,并且在使用不同的界面访问时会表现出不同的行为。所以,例如

代码语言:javascript
复制
InterfaceSwitched["Width", <|{0,480}->1, {480,768}->2,{768,Infinity}->3|>]

如果从宽度在 0 到 480 像素之间的设备访问它,它将表现为 1,依此类推。您可以使用CloudPublish 看到这一点

然后只需调整用于查看结果的窗口的大小:

现在聊聊 NFT!

自12.3 版发布以来,世界上发生的一件事就是 NFT 理念的主流化。实际上,多年来我们已经有工具来支持区块链上的 NFT 以及一般的代币。但在 13.0 版本中,我们添加了更精简的 NFT 工具,特别是在我们连接到 Cardano 区块链的背景下。

NFT(“不可替代代币”)的基本思想是拥有一个可以在用户之间转移但不能复制的独特代币。它就像一枚硬币,但每个 NFT 都可以是独一无二的。区块链提供了谁拥有什么 NFT 的永久分类帐。当你转移 NFT 时,你所做的只是在区块链中添加一些东西来记录该交易。

NFT 可以用来做什么?很多事情。例如,我们为今年从我们的暑期学校和夏令营“毕业”的人颁发了“NFT 证书” 。我们还发布了 NFT 来记录我们在直播中创建的一些元胞自动机艺术品的所有权。一般来说,NFT 可以用作任何事物的永久记录:所有权、凭证或只是对成就或事件的纪念。

在典型情况下,直接在区块链上运行的 NFT 有一个小的“有效负载”。如果有更大的资产(如图像),它们将存储在一些分布式存储系统(如 IPFS)上,并且区块链上的有效负载将包含指向它们的指针。

这是一个示例,它使用我们的几个区块链功能——以及与 Cardano 区块链的新连接——从 IPFS 检索与我们几周前铸造的 NFT 相关联的图像:

你怎么能自己铸造这样的 NFT 呢?Wolfram 语言有执行此操作的工具。Wolfram 函数库中的 ResourceFunction["MintNFT"] 提供了一种通用的工作流程(专门针对 CIP 25 Cardano NFT 标准)——而且还会有更多。

低于“纯消费者”层面的区块链的完整故事是复杂和技术性的。但是 Wolfram 语言提供了一种独特的简化方式来处理它,基于区块链结构的符号表示,可以使用 Wolfram 语言的所有标准函数直接操作。还有许多不同的区块链,具有不同的设置。但是通过我们在过去几年中所做的大量努力,我们已经能够创建一个统一的框架,在不同的区块链之间进行互操作,同时仍然允许访问它们的所有特殊功能。因此,现在您只需设置不同的BlockchainBase(比特币、以太坊、Cardano、Tezos、ARK、Bloxberg 等),就可以与不同的区块链进行交互了。

更时尚、更快地下载

我在这里谈到的所有内容今天都可以立即在 Wolfram Cloud 和桌面上使用——适用于 macOS、Windows 和 Linux(对于 macOS,英特尔和“Apple Silicon” ARM 均适用)。但是当你去下载时(至少对于 macOS 和 Windows)有一个新的选择:下载没有本地文档。

Wolfram Desktop 或 Mathematica的实际可执行包对于 Windows 大约为 1.6 GB,对于 macOS 大约为 2.1 GB(对于 macOS 更大,因为它包含涵盖 Intel 和 ARM 的“通用”二进制文件)。但是还有文档。而且还有很多。如果您全部下载,则需要另外下载 4.5 GB,部署到系统上时需要 7.7 GB。

所有这些文档存在的意义是非常重要的,我们为它的广度和深度感到自豪。将这些文档直接保存在您的计算机上绝对很方便——作为笔记本,您可以立即调出并根据需要进行编辑。但是随着我们的文档变得越来越大(我们正在努力让它变得更大),更好的优化是节省计算机上的本地空间,从网络上获取文档。

因此,在 13.0 版中,我们引入了无文档下载——你只需访问网络并在您的浏览器中显示文档。当你第一次安装 Mathematica 或 Wolfram|One 时,可以选择“完整包”,包括本地文档。或者可以选择只安装可执行包,而不安装文档。如果您稍后改变主意,您始终可以使用“帮助”菜单中的“安装本地文档”项下载并安装文档。

欢迎观看 Wolfram 博士演示的 Wolfram 语言版本 13 的新功能:

https://www.bilibili.com/video/BV1g3411x7Gd

视频中使用的笔记本:

https://www.wolframcloud.com/obj/s.wolfram/Published/V13Live-01.nb

13.0.1 软件试用

Wolfram 网店:https://store.wolfram.com/catalog/ 创建 Wolfram ID 登录扫码下载试用版:

Wolfram Mathematica:

https://www.wolfram.com/mathematica/trial/

Wolfram System Modeler:

https://www.wolfram.com/system-modeler/trial/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WOLFRAM 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 电子邮件线程到底是什么样的?我琢磨这个已经很久了。现在在 13.0 版中,我们可以轻松导入 MBOX 文件并查看电子邮件的线程结构。以下是我们内部邮件列表中的一个示例:
  • 您有一个想要跨会话操作的表达式。一种方法是使用PersistentValue使整个表达式持久化——或者将其显式存储在文件或云对象中,并在需要时将其读回。但是有一种更有效和无缝的方法来做到这一点——它不需要你一直处理整个表达式,而是让你“戳”和“偷看”各个部分——那就是使用CloudExpression。
相关产品与服务
区块链
云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档