解决方案

Wolfram 语言 & Mathematica 12.2 上线了:228个新函数!(二)

永无止境的数学故事


从一开始,数学一直是Wolfram语言(和Mathematica)的核心用例。在过去的三分之一的世纪中,看到我们能够进行多少数学运算已经非常令人满意了。但是,我们做得越多,我们就越有可能实现,并且会走得更远。在某种意义上,这已经成为我们的日常工作。在某些数学领域,人们会一直手动或零碎地进行某些数学运算。我们会发现:是的,我们可以为此做一个算法!我们可以使用这些年来建立的巨大功能塔建更多的数学系统化和自动化。使任何人都可以进行可计算的数学。12.2版也是如此,一整套“数学进展”。


让我们晒下干货:特殊函数。从某种意义上说,每个特殊函数都是对某些数学块的封装:这是一种为特定类型的数学问题或系统定义计算和属性的方式。从Mathematica 1.0开始,我们已经实现了特殊函数的出色覆盖,并稳定地扩展到越来越复杂的函数。在版本12.2中,我们还有另一类函数:Lamé函数。


Lamé函数是处理椭球坐标复杂世界的一部分;它们以椭圆体形式表示为Laplace方程的解。现在,我们可以计算它们,对其进行扩展,对其进行转换,并执行将函数集成到我们的语言中所涉及的所有其他事情中:



同样在版本12.2中,我们在椭圆函数上也做了很多工作——极大地加快了椭圆函数的数值计算速度,并发明了以任意精度有效地执行此操作的算法。我们还介绍了一些新的椭圆函数,例如JacobiEpsilon,它提供了EllipticE的泛化,它避免了分支切割并保持椭圆积分的解析结构:



几十年来,我们已经能够进行许多符号Laplace和逆Laplace变换。但是在版本12.2中,我们解决了使用轮廓积分进行拉普拉斯逆变换的微妙问题。这是一个对复杂平面中的功能结构有足够了解的知识,可以避免分支剪切和其他令人讨厌的奇异之处。一个典型的结果有效地累加了无穷多个极点:



在轮廓积分和其他方法之间,我们还添加了数值拉普拉斯逆变换。最终看起来都很容易,但是要实现这一目标,需要进行许多复杂的算法工作:



告诉我该函数


在轮廓积分和其他方法之间,我们还添加了数值拉普拉斯逆变换。最终看起来都很容易,但是要实现这一目标,需要进行许多复杂的算法工作:


看这个例子:Tan[x] 是内射吗?不是全局:


1、 FunctionInjective[Tan[x], x]
2、False


在区间内,是:


1、 FunctionInjective[{Tan[x], 0 < x < Pi/2}, x] 2、True


Tan [x]的奇点如何?这给出了集合的描述:


1、 FunctionSingularities [Tan [x],x] 2、Cos[x]==0


您可以使用Reduce获得显式值:



我们在内部长期使用各种函数测试属性。但是,随着版本12.2的使用,函数属性变得更加完整和公开。想知道是否可以互换两个极限的顺序?试下FunctionSingularities。想知道您是否可以在积分中进行变量的多变量更改?试下FunctionInjective。


而且,是的,即使在Plot3D中,我们也经常使用FunctionSingularities来确定发生了什么事情:



主流视频


在版本12.1中,我们开始了将视频作为Wolfram语言的内置功能的过程。版本12.2继续该过程。在12.1中,我们只能处理台式机笔记本中的视频。现在它已扩展到云笔记本——因此,当您使用Wolfram语言生成视频时,它可以立即部署到云中。


VideoGenerator是12.2中的主要视频新功能。提供制作图像(和/或音频)的功能,VideoGenerator将根据它们生成视频(此处为4秒的视频):



要添加音轨,我们可以使用VideoCombine:



那么我们将如何编辑该视频?在版本12.2中,我们具有标准视频编辑功能的编程版本。例如,VideoSplit会在特定时间分割视频:



但是Wolfram语言的真正力量在于系统地将任意功能应用于视频。通过VideoMap,您可以将功能应用于视频以获取另一个视频。例如,我们可以逐渐模糊刚刚制作的视频:


VideoMap[Blur[#Image, 20 #Time] &, %%]



还有两个用于分析视频的新函数VideoMapList和VideoMapTimeSeries,它们通过将函数应用于视频中的帧及其音轨来分别生成列表和时间序列。


另一个新的函数与视频处理和视频编辑高度相关,是 VideoIntervals,其确定在其上任何给定的标准适用于一个视频的时间间隔:



在视频的实际处理中,常见的操作是转码。在版本12.2中,使用VideoTranscode函数可以在我们支持的300多种容器和编解码器之间转换视频。顺便说一句,12.2还具有新的功能ImageWaveformPlot和ImageVectorscopePlot常用于视频色彩校正使用:



处理视频的主要技术问题之一是处理典型视频中的大量数据。在版本12.2中,现在可以更好地控制该数据的存储位置。选项GeneratedAssetLocation(默认为$GeneratedAssetLocation)使您可以在不同的文件,目录,本地对象存储等之间进行选择。


但是,版本12.2中还有一个新功能,以AnimatedImage的形式处理“轻量级视频” 。AnimatedImage只需获取一张图像列表,然后生成立即在笔记本中播放的动画,并将所有内容直接存储在笔记本中。



大计算?将它们发送给云提供商!


对我而言,它经常出现——特别是在我们的Physics Project中。我想进行大量计算,但是我不想(或不能)在计算机上进行计算。相反,我想做的是将其作为批处理作业在云中运行。


只要存在云计算提供商,原则上这就是可能的。但这是非常困难的。好吧,现在,在版本12.2中,这终于很容易了。给定任何Wolfram语言代码,您都可以使用RemoteBatchSubmit将其发送为在云中作为批处理作业运行。


批处理计算提供者方面需要进行一些设置。首先,您必须在适当的提供商处拥有一个帐户——最初,我们支持AWS Batch和Charity Engine。然后,您必须使用该提供程序进行配置(我们已经有了描述如何执行此操作的工作流)。但是一旦完成,您将获得一个远程批处理提交环境,基本上就是开始提交批处理作业所需的全部:



我得到一个代表我的远程批处理作业的对象,我可以查询该对象以了解作业的状况。首先,它只是告诉我,我的工作是“可运行的”:


job[“ JobStatus”]
Runnable


稍后,它会说“开始”,然后是“运行”,然后(如果一切顺利)“成功”。作业完成后,您可以得到这样的结果:



但是,在云中远程运行计算的真正意义在于,它们可能比您可以在自己的计算机上运行的计算更大,更紧致。下面我们可以运行与上面相同的计算的方式,但是现在要求使用GPU:


RemoteBatchSubmit [env,
NetTrain [NetModel [“ LeNet”],“ MNIST”,TargetDevice->“ GPU”],
RemoteProviderSettings-> <|“ GPUCount”-> 1 |>]


RemoteBatchSubmit还可以处理并行计算。如果您请求多核计算机,则可以立即在其核上运行ParallelMap等。但是,您可以使用RemoteBatchMapSubmit进行更进一步的操作——它会自动将您的计算分布在整个云中的独立计算机的整个集合中。
这是一个例子:



RemoteBatchSubmit和RemoteBatchMapSubmit使您可以对云计算服务进行高级访问,以进行常规批处理。但是在版本12.2中,还有直接的较低级接口可用,例如适用于AWS的。
连接到 AWS:



当然,你总是可以直接通过Wolfram语言进行翻译:


TextTranslation [“今日は良い一日だった”]
Today was a good day.


可以制作10维图吗?


绘制涉及一维、二维或三维的数据很简单。对于超出此尺寸的几个维度,可以使用颜色或其他样式。但是,当您处理十个维度时,那就崩溃了。例如,如果您有很多10维数据,那么您可能将不得不使用DimensionReduce之类的东西来尝试撩出“有趣的功能”。
但是,如果您仅处理几个“数据点”,则还有其他方法可以可视化10维数据之类的东西。在版本12.2中,我们引入了一些用于执行此操作的函数。
作为第一个示例,让我们看一下ParallelAxisPlot。这里的想法是,每个“维度”都绘制在“单独的轴”上。对于单个点而言,这并不令人兴奋:



但是ParallelAxisPlot的重要功能之一是,默认情况下,它会自动确定每个轴上的比例,因此不需要轴代表类似的事物。因此,例如,以下是针对所有化学元素绘制的7个完全不同的量:




3D阵列图


早在1984年,我使用Cray超级计算机制作了随时间变化的2D元胞机的3D图片(是的,在35毫米幻灯片上捕获):



我等了36年,才可以一种真正精简的方式来重现这些内容。现在终于在版本12.2中有了它:ArrayPlot3D。在2012年,我们已经引入Image3D来表示和显示由具有指定颜色和不透明度的3D体素组成的3D图像。但是它的重点是“放射线样式”的工作,其中某些体素之间存在连续性的假设。而且,如果您确实有离散数据的离散数组(如在元胞自动机中),则不会导致清晰的结果。


在这里,对于3D元胞机的更为详细的情况:



12.2中的另一个新的ArrayPlot 系列函数是 ComplexArrayPlot,这里将其应用于牛顿方法的值数组:



推进可视化的计算美学


Wolfram语言的目标之一是拥有“自动看起来不错”的可视化效果,因为它们具有有效实现良好计算美学的算法和启发式方法。在版本12.2中,我们针对各种可视化类型调整了计算美学。例如,在12.1中,默认情况下,这是SliceVectorPlot3D的外观:



从版本10开始,我们还越来越多地使用PlotTheme选项,以“切换”详细选项,以使可视化效果适合不同的目的并满足不同的审美目标。因此,例如在版本12.2中,我们已将绘图主题添加到GeoRegionValuePlot中。这是默认值的示例(顺便说一句,它已更新):



版本12.2中的另一件事是添加了新的图元和新的“原始材料”,以创建美观的视觉效果。在版本12.1中,我们引入了诸如HatchFilling之类的用于交叉阴影的功能。在版本12.2中,我们现在还具有LinearGradientFilling:



推进可视化的计算美学


Wolfram语言的核心目标是定义一种连贯的计算语言,计算机和人类都可以轻松理解。我们(尤其是我!)在语言的设计以及诸如为函数选择正确的名称等方面投入了大量精力。但是,为了使语言尽可能易于阅读,简化其“非语言”或句法方面也很重要。对于函数名称,我们基本上是在利用人们对自然语言单词的理解。对于句法结构,我们希望利用人们在数学等领域的“环境理解”。

十多年前,我们引入了|-->作为指定Function函数的一种方式,因此与其编写

Function[x, x^2]

( 或#2&),您可以这样写:

x |-> x^2

为了输入 |--> 你必须输入\ [Function]或至少ESC fn ESC,这往往感觉“有点困难”。

那么,在12.2版本中,我们通过可以键入就像| - >来“主流化” |-->

x | - > x^2

您也可以做类似的事情:

{x,y} |-> x + y

以及类似的东西:

SameTest->({x,y} |-> Mod [x-y,2] == 0)

在版本12.2中,还有另一个新的“短语法”:// =

假设您得到了一个结果,比如说res。现在,您想将一个函数应用于res,然后“更新res ”。新函数 ApplyTo(写为// =)使执行此操作变得容易:

res = 10
10
res//=f
f[10]
res
f[10]

我们一直在寻找重复的“计算集”,我们可以将它们“打包”成具有“易于理解的名称”的函数。在版本12.2中,我们有几个新的此类函数:FoldWhile和FoldWhileList。FoldList通常只获取一个列表,并将每个连续的元素“折叠”到其建立的结果中,直到到达列表的末尾:

FoldList [f,{1,2,3,4}] {1,f[1,2],f[f[1,2],3], f[f[f[1,2],3,4]}

但是,如果您想“尽早停止”怎么办?FoldWhileList允许您执行此操作。因此,在这里我们依次除以1、2、3,...,当结果不再是整数时停止:

FoldWhileList [Divide,5 !, Range [10],IntegerQ]
{120,120,60,20,5,1,1/6}


更多数组体操:列操作及其泛化


假设您有一个数组,例如:


为什么这有用?一个示例是,当您拥有数据数组,其中不同维度对应于不同的属性,然后您要“忽略”特定的属性,并针对该属性聚合数据。假设您要忽略的属性位于数组中的n级。然后,您要做的所有操作都是使用ArrayReduce [f,...,n],其中f是用于聚合值的函数(通常是Total或Mean)。


您可以通过适当的Transpose,Apply等序列来获得与ArrayReduce相同的结果。但是它非常混乱,并且ArrayReduce提供了这类数组操作的完美“包装”。

ArrayReduce非常通用;它不仅使您“减少”单个维度,而且使整个维度集合成为可能:


在最简单的级别上,ArrayReduce是在数组上“按列”应用函数的便捷方法。但是总的来说,这是将函数应用于具有任意索引的子数组的一种方法。而且,如果您考虑张量,则ArrayReduce是收缩的一般化,其中可以涉及两个以上的索引,并且可以在应用操作(不必求和)之前对元素进行“展平” 。


观看代码运行:Echo系列中的更多内容


这是调试代码中的一句古老谚语:“输入打印语句”。但是在Wolfram语言中它更加优雅,尤其要感谢Echo。这是一个简单的主意:Echo [ expr ] “回显”(即打印)expr的值,然后返回该值。因此,结果是您可以将Echo放置在代码中的任何位置(通常为Echo @ …),而不会影响代码的功能。


在版本12.2中,有一些遵循“ Echo ”模式的新函数。第一个示例是EchoLabel,它只是在回显的内容上添加标签:



爱好者可能想知道为什么需要EchoLabel。毕竟,Echo本身允许使用第二个参数来指定标签。答案(是的,这是一种微妙的语言设计),如果要将Echo作为要应用的函数插入(例如@),那么它只能有一个参数,因此没有标签。EchoLabel设置为具有EchoLabel[label]形式的运算符,因此EchoLabel [ label ] [ expr ]等效于Echo [ expr ,label ]。


12.2中的另一个新“回显功能”是EchoTiming,它显示运行的时间(以秒为单位):