什么是计算论文?

表达想法的有力方式

人们习惯于用散文——有时是图片——来表达自己。但在现代计算时代,有一种新的东西成为可能,我想称之为计算论文

几十年来,我一直致力于构建支持计算论文的技术,但直到最近,我才意识到计算论文对人们的学习方式以及他们交流事实和思想的方式有多么重要。未来的专业人员将以计算论文的形式定期提交结果和报告。教育工作者通常会用计算式作文来解释概念。学生们将例行地编写计算论文作为课堂作业。

这是一个非常简单的计算文章的例子:

简单的计算文章示例

这里有三种基本的东西。首先是普通文本(这里是英语)。第二,电脑输入。第三,计算机输出。关键的一点是,所有这些共同作用,以表达所沟通的内容。

普通的文本提供了上下文和动机。计算机输入给出了正在讨论的内容的精确说明。然后计算机输出事实和结果,通常以图形的形式。它是一种强大的阐述形式,将人类作者的计算思维与计算机的计算知识和计算处理结合起来。

但真正起作用的是Wolfram语言-以及它所提供的高级思想的简洁表达,定义了人类计算思维与计算机所提供的实际计算和知识之间的独特桥梁。

在一篇典型的计算文章中,Wolfram Language的每一段输入通常都很短(通常不超过一两行)。但关键是,这种输入可以以一种计算机和阅读文章的人都能轻易理解的形式,传达一种高层次的计算思维。

对于所有这一切,沃尔夫勒姆语言有如此多的内在知识是至关重要的——关于世界和如何在其中计算事物。因为这使得它不仅能立即讨论抽象的计算,还能讨论世界上存在和发生的真实的事情,并最终提供一种真正的计算交流语言,将人与计算机的能力联系起来。

一个例子

让我们用计算作文来解释计算作文。

假设我们想讨论一种人类语言的结构,比如英语。英语基本上是由单词组成的。让我们列出一些常见的。

生成英语常用词列表:

词库[]

词库[]

一个典型的单词有多长?好吧,我们可以拿一个常用词列表,做一个直方图,显示它们的长度分布。

做一个单词长度的直方图:

直方图[StringLength [WordList []]]

直方图[StringLength [WordList []]]

法语也一样:

直方图[StringLength[WordList[语言->“法语”]]

直方图[StringLength[WordList[语言->“法语”]]

注意,法语单词的长度往往更长。我们可以研究这是否是法语文档比英语文档更长的原因,或者这与文本的熵等量有什么关系。(当然,因为这是一篇计算文章,读者可以在文章中重新进行计算,比如试着用俄语而不是法语。)

但另一方面,让我们通过比较语言的翻译来比较语言,比如“计算机”。

查找“计算机”的10种最常见语言的翻译:

把[WordTranslation(“计算机”,所有),10]

把[WordTranslation(“计算机”,所有),10]

找到每种情况下的第一个翻译:

首先/@ Take[

首先/@ Take["computer", All], 10]

根据对“计算机”的翻译,将通用语言排列在“特征空间”中:

[首先/@ Take[WordTranslation[

[首先/@ Take[WordTranslation["computer", All], 40]]

从这个情节,我们可以开始研究各种语言之间的结构和历史关系。但从计算论文的角度来看,这里重要的是,我们在分享普通文本、计算机输入和输出之间的论述。

文本说明了基本要点是什么。输入给出了我们想要的精确定义。输出显示了什么是正确的。但是看看输入。甚至仅仅通过查看其中的Wolfram Language函数的名称,就可以很好地了解它在谈论什么。虽然函数名是基于英语的,但可以使用“代码说明“要用另一种语言理解它,可以说日语:

FeatureSpacePlot[第一/ @Take [WordTranslation(“计算机”,所有),40]]

[首先/@ Take[WordTranslation["computer", All], 40]]

但假设有人不知道FeatureSpacePlot.它是什么?如果它只是英语中的一个单词或短语,我们可能会查字典,但不会有一个精确的答案。但是Wolfram语言中的函数总是被精确定义的。要知道它是做什么的,我们可以从它的文档开始。但更重要的是,我们可以自己运行它来明确地了解它的功能。

FeatureSpacePlot页面

而这正是计算机论文伟大之处的关键所在。如果你读了一篇普通的文章,你有什么不明白的地方,那么到最后,你真的只需要问作者,找出他们的意思。然而,在计算文章中,有Wolfram Language输入,它精确而明确地指定了一切——如果你想知道它的意思,你可以运行它并在你的计算机上探索它的任何细节,自动地,不需要与作者进行任何讨论。

实用性

如何写一篇计算机论文呢?有了我们的技术堆栈,这是非常容易的——主要是由于我们引入了笔记本的概念Mathematica的第一版一直追溯到1988年。笔记本是一种结构化文档,它将文本单元格与Wolfram语言输入和输出单元格混合在一起,包括图形、图像、声音和交互式内容:

典型的笔记本

在现代,一个伟大的(但很难实现的)事情是完整的Wolfram笔记本可以在桌面、云和移动设备上无缝运行。你可以用母语写一本笔记本Wolfram桌面应用程序(Mac、Windows、Linux)-或通过任何web浏览器在web上,或通过Wolfram云应用.然后你可以通过Wolfram云你可以通过网页或手机访问它,或者下载到桌面,现在,iOS设备上。

笔记本电脑的环境

有时你希望笔记本的读者只是看看它,也许打开和关闭一组单元格。有时您还希望它们能够操作交互元素。有时你希望他们能够编辑和运行代码,或者可能修改整个笔记本。关键的一点是,所有这些事情都很容易用我们建立的云-桌面-移动系统来做。

学生作业的新形式

计算机论文对学生来说很适合阅读,但也很适合写作。目前大多数学生作业的模式都非常陈旧。写一篇文章。给出一个数学推导。这些已经存在了几千年了。并不是说他们有什么问题。但现在有了新的东西:写一篇计算文章。这很有教育意义。

计算论文实际上是通过人类作者和计算机之间的协作讲述的一个智力故事。计算机就像一种智力外骨骼,让你立即掌握巨大的计算能力和知识。但它也是理解的执行者。因为它引导计算机通过存储如果你想说,你必须自己理解。

当学生写普通文章时,他们通常会写一些在某种意义上“已经存在”的内容(“讨论这篇文章”;“解释这段历史”;……)。但是在进行计算的过程中(至少使用Wolfram语言),很容易发现新的东西,计算性的文章最终会有一个本质上用之不竭的新内容供应,这是以前从未见过的。学生将探索和发现以及理解和解释。

当你写一篇计算论文时,计算论文中的代码必须产生与你所讲故事相符的结果。这不像你在做数学推导,然后有老师告诉你你得到了错误的答案。您可以立即看到代码的功能,以及它是否符合您正在讲述的故事。如果没有,那么可能你的代码错了,或者你的故事错了。

学生撰写计算论文的实际程序应该是什么?在今年的Wolfram暑期学校我们做了一个实验,要求我们所有的学生写一篇关于他们所知道的任何东西的计算文章。我们最后得到72篇有趣的文章探索非常广泛的话题。

在更典型的教育背景下,计算机论文的“提示”可能是“英语单词的典型长度是多少”或“探究英语单词的长度”。

我还尝试过另一种工作流程。作为课堂的“教室”组件,进行现场编码(或现场实验)。创造或发现一些东西,每个学生都跟着做他们自己的计算。下课后,每个学生都将得到一本自己做的笔记本。然后让他们的“作业”是把笔记本变成一篇计算文章,解释做了什么。

根据我的经验,这是一个非常好的练习,可以真正测试和巩固学生的理解。但还有其他一些东西:当学生们写了一篇计算论文时,他们就有了可以永久保存和直接使用的东西。

这是计算机论文的一大特点。当学生们编写它们时,他们实际上是在为自己创建一个自定义的计算工具库——他们将在未来的任何时候都可以立即使用。对于学生来说,在课堂上记笔记,然后再也不提这些笔记是很常见的。是的,他们可能会遇到一些情况,这些笔记可能会有帮助。但往往很难让人回过头去读笔记——尤其是因为这只是个开始;还是要执行讲义上的内容。

但关键是,对于一篇计算论文,一旦你找到了你想要的东西,实现它的代码就在那里,可以立即应用到任何出现的东西上。

你想学什么

计算论文是关于什么的?几乎任何东西!我经常说,对于任何研究领域(从考古学到动物学),要么现在有,要么很快就会有一个“计算性的X”。任何“计算性X”都可以立即使用计算性论文进行探索和解释。

但即使还没有一个明确的“计算X”,计算论文仍然是组织和展示材料的有力方式。从某种意义上说,一系列计算通常需要“讲述故事”这一事实在一篇文章中,有助于为整篇文章定义一个清晰的主干。实际上,计算演示的结构化性质有助于建议叙事结构,使学生(和其他人)更容易写出易于阅读和理解的文章。

但实际的主题是什么呢?好吧,假设你正在学习历史——比如英国内战的历史。好吧,方便的是,Wolfram语言内置了很多关于历史的知识(就像很多其他东西一样)。所以你可以通过一种对话来展示英国内战。例如,你可以问它战斗的地理位置:

GeoListPlot [\ !\ \ * NamespaceBox[“LinguisticAssistant DynamicModuleBox[{排版'query $ $ =“英国内战”,排版'boxes $ $ = TemplateBox[{“\”英国内战\ ",RowBox[{“实体”、“[”,RowBox [{MilitaryConflict“\” \"", ",", "\" EnglishCivilWar \""}], "]"}], "\" 实体MilitaryConflict[\ \ \” \\\", \ \\\" EnglishCivilWar \\\"]\"", "\" 军事冲突\ "},“实体”),Typeset ' all假设$$ = {{"type" -> "Clash", "word" -> "English Civil War", "template" -> "假设\"${word}\"是${desc1}。使用as \ ${desc2}代替","count" -> "3", "Values" -> {{"name" -> "MilitaryConflict", "desc" -> "a military conflict", "input" -> "*英语+民事+ _ * MilitaryConflict -战争”},{“名字”——>“单词”,“desc”——>“一个字”,“输入”——>“* C。英语+Civil+War-_*Word-"}, {"name" -> "HistoricalEvent", "desc" -> "a historical event", "input" -> "English+Civil+War-_*HistoricalEvent-"}}}, {"type" -> "SubCategory", "word" -> "English Civil War", "template" -> "假设${desc1}。使用${desc2}代替","count" -> "4", "Values" -> {{"name" -> "EnglishCivilWar", "desc" -> "EnglishCivilWar (1642 - 1651)", "input" -> "* dpconflict . militaryconflicte . "English+Civil+War-_*\ EnglishCivilWar-"}, {"name" -> "FirstEnglishCivilWar", "desc" -> "English CivilWar (1642 - 1646)", "input" -> "* dpconflict . militaryconflicte . "English+Civil+War-_*\ FirstEnglishCivilWar-"}, {"name" -> "SecondEnglishCivilWar", "desc" -> "SecondEnglishCivilWar", "input" -> "* dpconflict . militaryconflicte . "English+Civil+War-_*\ SecondEnglishCivilWar-"}, {"name" -> "ThirdEnglishCivilWar", "desc" -> "ThirdEnglishCivilWar", "input" -> "* dpconflict . militaryconflicte . "英语+民事+战争_ * \ ThirdEnglishCivilWar——“}}}},排版'assumptions $ $ ={},排版'open $ $ ={1,2},排版'querystate $ $ ={“在线”——>真的,“允许”——>真的,“mparse.jsp”——1.305362 > 6.5672759594240935,”消息 " -> {}}}, DynamicBox [ToBoxes [AlphaIntegration 'LinguisticAssistantBoxes[”“4、自动、动态(排版'query $ $),动态[Typeset 'boxes $$],动态[Typeset ' allassumption $$],动态[Typeset ' assumption $$],动态[Typeset 'open $$],动态[Typeset 'querystate $$]], StandardForm], ImageSizeCache->{265。,{7所示。, 17岁。}}, TrackedSymbols: >{排版'query $ $,排版'boxes $ $,排版'allassumptions $ $,排版'assumptions $ $,排版'open $ $,排版'querystate $ $}], DynamicModuleValues: > {}, UndoTrackedVariables: >{排版'open $ $}], BaseStyle - >{}“部署”,DeleteWithContents - >没错,可编辑- > False, SelectWithContents - >真]\)[“战斗”]]

你可以询问战争开始的时间线(你不需要说“前15场战斗”,因为如果你关心,你可以直接从Wolfram语言代码中读取):

TimelinePlot[采取[\ !\ \ * NamespaceBox[“LinguisticAssistant DynamicModuleBox[{排版'query $ $ =“英国内战”,排版'boxes $ $ = TemplateBox[{“\”英国内战\ ",RowBox[{“实体”、“[”,RowBox [{MilitaryConflict“\” \"", ",", "\" EnglishCivilWar \""}], "]"}], "\" 实体MilitaryConflict[\ \ \” \\\", \\\" EnglishCivilWar \\\"]\ \"", "\" 军事冲突\ "},“实体”),Typeset ' all假设$$ = {{"type" -> "Clash", "word" -> "English Civil War", "template" -> "假设\"${word}\"是${desc1}。使用as \ ${desc2}代替","count" -> "3", "Values" -> {{"name" -> "MilitaryConflict", "desc" -> "a military conflict", "input" -> "*英语+民事+ _ * MilitaryConflict -战争”},{“名字”——>“单词”,“desc”——>“一个字”,“输入”——>“* C。英语+Civil+War-_*Word-"}, {"name" -> "HistoricalEvent", "desc" -> "a historical event", "input" -> "English+Civil+War-_*HistoricalEvent-"}}}, {"type" -> "SubCategory", "word" -> "English Civil War", "template" -> "假设${desc1}。使用${desc2}代替","count" -> "4", "Values" -> {{"name" -> "EnglishCivilWar", "desc" -> "EnglishCivilWar (1642 - 1651)", "input" -> "* dpconflict . militaryconflicte . "English+Civil+War-_\ *EnglishCivilWar-"}, {"name" -> "FirstEnglishCivilWar", "desc" -> "English CivilWar (1642 - 1646)", "input" -> "* dpconflict . militaryconflicte . "英语+内战+战争-_\ *FirstEnglishCivilWar-"}, {"name" -> "SecondEnglishCivilWar", "desc" -> "SecondEnglishCivilWar", "input" -> "* dpconflict . militaryconflicte . "English+Civil+War-_\ *SecondEnglishCivilWar-"}, {"name" -> "ThirdEnglishCivilWar", "desc" -> "ThirdEnglishCivilWar", "input" -> "* dpconflict . militaryconflicte . "英语+民事+战争_ \ * ThirdEnglishCivilWar——“}}}},排版'assumptions $ $ ={},排版'open $ $ ={1,2},排版'querystate $ $ ={“在线”——>真的,“允许”——>真的,“mparse.jsp”——1.305362 > 6.5672759594240935,”消息 " -> {}}}, DynamicBox [ToBoxes [AlphaIntegration 'LinguisticAssistantBoxes[”“4、自动、动态(排版'query $ $),动态[Typeset 'boxes $$],动态[Typeset ' allassumption $$],动态[Typeset ' assumption $$],动态[Typeset 'open $$],动态[Typeset 'querystate $$]], StandardForm], ImageSizeCache->{275。,{7所示。, 17岁。}}, TrackedSymbols: >{排版'query $ $,排版'boxes $ $,排版'allassumptions $ $,排版'assumptions $ $,排版'open $ $,排版'querystate $ $}], DynamicModuleValues: > {}, UndoTrackedVariables: >{排版'open $ $}], BaseStyle - >{}“部署”,DeleteWithContents - >没错,可编辑- > False, SelectWithContents - >真]\)(“战争”),15]]

你可以开始观察军队是如何移动的,或者在不同的地方谁赢了谁输了。首先,你可以写一篇计算文章,其中计算基本上只是生成定制的信息图来说明你的叙述。然后你可以更进一步,开始真正的“计算历史”。你可以开始计算战争进展的各种统计数据。你可以找到与其他战争进行定量比较的方法,等等。

你能写一篇关于艺术的“计算机论文”吗?绝对的。也许是关于艺术史的。随机挑选10幅梵高的画作:




梵高油画产量

EntityValue [RandomSample [\ !\ \ * NamespaceBox[“LinguisticAssistant DynamicModuleBox[{排版'query $ $ =“梵高”,排版'boxes $ $ = TemplateBox[{“\”文森特·梵高\ ",RowBox[{“实体”、“[”,RowBox[{“\”的人 \"", ",", "\" vq62 VincentVanGogh: 9 \""}], "]"}], "\" 实体(\ \ \”的人 \\\", \\\" vq62 VincentVanGogh: 9 \\\"]\"", "\" 人\ "},“实体”),排版'allassumptions $ $ ={{“类型”- >“冲突”,“词”——>“梵高”、“模板”——>“假如\ " ${词}\”是$ {desc1}。使用\ $ {desc2}”,而不是“数”- >“4”、“价值观”- >{{“名字”——>“人”、“desc”——>“一个人”,“输入”——>“* C。范+梵高_ *人——“},{“名字”——>“电影”,“desc”——>“电影”,“输入”——>“* C。van+gogh-_*Movie-"}, {"name" -> "SolarSystemFeature", "desc" -> "a solar system feature", "input" -> "范+梵高_ * SolarSystemFeature——“},{“名字”——>“单词”,“desc”——>“一个字”,“输入”——>“* C。范+梵高_ *词“}}}},排版'assumptions $ $ ={},排版'open $ $ ={1,2},排版'querystate $ $ ={“在线”——>真的,“允许”——>真的,“mparse.jsp”——0.472412 > 6.125865914333281,”消息 " -> {}}}, DynamicBox [ToBoxes [AlphaIntegration 'LinguisticAssistantBoxes[”“4、自动、动态(排版'query $ $),动态(排版'boxes $ $),动态[Typeset ' allassumption $$],动态[Typeset ' assumption $$],动态[Typeset 'open $$],动态[Typeset 'querystate $$]], StandardForm], ImageSizeCache->{227。,{7所示。, 17岁。}}, TrackedSymbols: >{排版'query $ $,排版'boxes $ $,排版'allassumptions $ $,排版'assumptions $ $,排版'open $ $,排版'querystate $ $}], DynamicModuleValues: > {}, UndoTrackedVariables: >{排版'open $ $}], BaseStyle - >{}“部署”,DeleteWithContents - >没错,可编辑- > False, SelectWithContents - >真]\)(“NotableArtworks”),10],“图像”)

然后看看他们使用的颜色(选择范围小得惊人):

ChromaticityPlot (%)

ChromaticityPlot (%)

或者你可以写一篇关于实际创造艺术或音乐的计算论文。

科学是什么?你可以通过观察行星的性质来重新发现开普勒定律:

\ !\ (\ * NamespaceBox[“LinguisticAssistant”,DynamicModuleBox[{排版'query $ $ =“行星”,排版'boxes $ $ = TemplateBox[{\“\”行星”,RowBox[{“EntityClass”、“[”,RowBox[{“\”的星球 \"", ",", " 所有 "}], "]"}], "\" EntityClass[\ \ \“行星\ \ \”,所有]\”,\“\”行星"}"," EntityClass "],排版'allassumptions $ $ ={{“类型”- >“冲突”,“词”——>“行星”,"template" -> "假设${word} "是${desc1}。使用as \ ${desc2}代替","count" -> "4", "Values" -> {{"name" -> "PlanetClass", "desc" -> "引用行星","input" -> "*C。行星-_*PlanetClass-"}, {"name" -> "ExoplanetClass", "desc" -> "指的是系外行星","input" -> "*C。行星-_*ExoplanetClass-"}, {"name" -> "MinorPlanetClass", "desc" -> "指的是小行星","input" -> "*C。行星_ * MinorPlanetClass——“},{“名字”——>“单词”、“desc”——>“一个字”,“输入”——>“* C。行星_ *词“}}}},排版'assumptions $ $ ={},排版'open $ $ ={1,2},排版'querystate $ $ ={“在线”——>真的,“允许”——>真的,“mparse.jsp”——0.400862 > 6.054539882441674,”消息 " -> {}}}, DynamicBox [ToBoxes [AlphaIntegration 'LinguisticAssistantBoxes[”“4、自动、动态(排版'query $ $),动态(排版'boxes $ $),动态[Typeset ' allassumption $$],动态[Typeset ' assumption $$],动态[Typeset 'open $$],动态[Typeset 'querystate $$]], StandardForm], ImageSizeCache->{171。,{7所示。, 17岁。}}, TrackedSymbols: >{排版'query $ $,排版'boxes $ $,排版'allassumptions $ $,排版'assumptions $ $,排版'open $ $,排版'querystate $ $}], DynamicModuleValues: > {}, UndoTrackedVariables: >{排版'open $ $}], BaseStyle - >{}“部署”,DeleteWithContents - >没错,可编辑- > False, SelectWithContents - >真]\)[{“DistanceFromSun”、“OrbitPeriod”}]

ListLogLogPlot (%)

ListLogLogPlot (%)

也许你可以继续看看有没有系外行星。或者你可以开始解行星的运动方程。

你可以看看生物学。这是人类线粒体参考序列的第一个开始:

基因组数据[{“线粒体”{1150}]

基因组数据[{“线粒体”{1150}]

你可以把它分解成可能的密码子:

StringPartition (%, 3)

StringPartition (%, 3)

Wolfram语言中有大量关于各种事物的数据。但是还有一个问题Wolfram数据存储库,它包含各种特定的数据集。比如这是一张美国州游乐场的地图:

GeoListPlot [ResourceData[

地理列表图[ResourceData[“美国州游乐场”][全部,“地理位置”]]

这是自2010年以来颁布的国家宪法的词汇云:

WordCloud[StringJoin[Normal[ResourceData["World Constitutions"][Select[#YearEnacted > \!]\(\* NamespaceBox["LinguisticAssistant", DynamicModuleBox[{Typeset 'query $$ = "year 2010", Typeset 'boxes $$ = RowBox[{"DateObject", "[", RowBox[{"{", "2010", "}"}], "]"}], Typeset ' all假设${"type" -> "MultiClash", "word" -> "", "template" -> ""假设${word1}指的是\ ${desc1}。使用\ " $ {word2} \ " $ {desc2}。”,“数”- >“2”、“价值观”- >{{“名字”——>“PseudoTokenYear”,“词”——>“2010年”,“desc”——>“一年”,“输入”——>“* MC。+ 2010年_ * PseudoTokenYear——“},{“名字”——>“单位”,“词”——>“年”,“desc”——>“单位”,“输入”——>“* MC。+ 2010年_ *单位——“}}}},排版'assumptions $ $ ={},排版'open $ $ ={1},排版'querystate $ $ ={“在线”——>真的,“允许”——>真的,“mparse.jsp”——0.542662 > 6.186074404594303,”消息 " -> {}}}, DynamicBox [ToBoxes [AlphaIntegration 'LinguisticAssistantBoxes[”“4、自动、动态(排版'query $ $),动态(排版'boxes $ $),动态[Typeset ' allassumption $$],动态[Typeset ' assumption $$],动态[Typeset 'open $$],动态[Typeset 'querystate $$]], StandardForm], ImageSizeCache->{86。,{7所示。, 18岁。}}, TrackedSymbols: >{排版'query $ $,排版'boxes $ $,排版'allassumptions $ $,排版'assumptions $ $,排版'open $ $,排版'querystate $ $}], DynamicModuleValues: > {}, UndoTrackedVariables: >{排版'open $ $}], BaseStyle - >{}“部署”,DeleteWithContents - >没错,可编辑- > False, SelectWithContents - >真]\)&],“文本”]]]]

很多时候,人们感兴趣的不是公共数据,而是某种本地数据。其中一个方便的来源是Wolfram数据下降.在教育设置中,可以设置特定的数据集(或云对象),以便某些特定的组可以读取(和/或添加)这些数据集。这是我为自己积累的数据,显示了我一天的心率。以下是今天的内容:

DataListPlot [TimeSeries [Databin [

DateListPlot[TimeSeries[YourDatabinHere]]

当然,做一个直方图也很容易:

直方图[TimeSeries [Databin [

直方图(TimeSeries [YourDatabinHere]]

数学呢?数学的一个关键问题是理解为什么事情是正确的。传统的方法是给出证明。但是计算论文提供了另一种选择。它们的步骤本质是不同的,但目的是一样的:展示什么是真的,为什么是真的。

作为一个非常简单的例子,让我们看看素数。以下是前50个:

表[[n], {n, 50}]

表[[n], {n, 50}]

让我们找到所有这些素数的余数mod 6:

Mod[Table[Prime[n], {n, 50}], 6]

Mod[Table[Prime[n], {n, 50}], 6]

但是为什么只有1和5出现(好吧,在质数2和3的平凡情况之后)?我们可以通过计算看出这一点。任何数字都可以写成6N+K对于一些NK:

表[6 n + k, {k, 0,5}]

表[6 n + k, {k, 0,5}]

但是如果我们把数字分解成这种形式,我们会看到6N+ 1和6N+5是唯一不需要是倍数的:

系数(%)

系数(%)

计算机科学呢?例如,你可以写一篇关于实现欧几里得算法的计算文章,研究它的运行时间,等等。

定义一个函数来给出欧几里得算法中的所有步骤:

gcdlist[现代,b_]: = NestWhileList[{去年[#],应用(Mod , #]} &, { a、b},去年[#]! = 0和1)

gcdlist[现代,b_]: = NestWhileList[{去年[#],应用(Mod , #]} &, { a、b},去年[#]! = 0和1)

找出200以下数字的算法的运行长度分布:

直方图[Flatten[Table[Length[gcdlist[i, j]], {i, 200}, {j, 200}]]]

直方图[Flatten[Table[Length[gcdlist[i, j]], {i, 200}, {j, 200}]]]

或者在现代,人们可以探索机器学习,比如,通过绘制部分MNIST手写数字数据集的特征空间图:

FeatureSpacePlot [RandomSample[键[ResourceData[“MNIST”]],50]]

FeatureSpacePlot [RandomSample[键[ResourceData[“MNIST”]],50]]

如果您想深入了解软件工程,可以写一篇关于HTTP协议的计算性文章。从站点获取HTTP响应:

URLRead(“https://www.wolframalpha.com”)

URLRead(“https://www.wolfram.com”)

这张图显示了这个网址上的网页元素的树状结构:

TreeForm[Import[ False, AspectRatio -> 1/2]" title="TreeForm[Import["http://www.wolframalpha.com", {"HTML", "XMLObject"}], VertexLabeling -> False, AspectRatio -> 1/2]" width="497" height="257" class="alignnone size-full wp-image-14978">

树窗体[导入]http://www.wolframalpha.com“,{HTML”,“XMLObject”}],顶点标签->假,AspectRatio->1/2]

或者从一个完全不同的角度,你可以谈论解剖学:

AnatomyPlot3D(左脚)

AnatomyPlot3D[实体(“AnatomicalStructure”、“LeftFoot”))

怎样才能写出一篇优秀的计算机论文?

就我所知,要想写一篇优秀的计算机论文,就必须尽可能地简单易懂。当然,这种格式非常有用。因为一篇计算性的文章充满了输出(通常是图形的),很容易略读,并且能立即让人对文章想要说的内容有一些印象。计算型论文是结构化的文档,以封装良好的片段传递信息,这也有助于实现这一点。

但最终还是要由计算机论文的作者来弄清楚。但另一件有帮助的事情是,计算性文章的本质是,它必须有一个“计算叙述”——计算机可以执行的代码片段序列,以完成文章中讨论的内容。虽然一个人可能可以写一篇普通的文章,没有什么意义,但仍然听起来不错,但最终不能在一篇计算文章中做类似的事情。因为到最后,代码还是代码,必须要运行和做一些事情。

那么什么会出错呢?嗯,就像英语散文一样,Wolfram语言代码可能会变得不必要的复杂,难以理解。在一篇好的计算论文中,普通文本和代码都应该尽可能简单和干净。我试图通过说每一条输入最多应该有一行或两行,并且输入的标题应该总是只有一行来加强这一点。如果我想做的事情的核心(可能不包括显示选项之类的东西)不只是一行代码,那么我会将其分解,分别解释每行代码。

我所关心的另一个重要原则是:明确表达。不要使用某个变量,比如说,隐式存储单词列表。实际上,至少显示列表的一部分,这样人们就可以清楚地看到它是什么样子的。当输出很复杂时,找到一些表格或可视化,使您感兴趣的特性变得明显。不要让“关键结果”隐藏在角落里;确保你设置的方式使它在前面和中心。

使用有条理的笔记本。用段落标题来划分计算类文章,这同样有助于使它们更容易浏览。我遵循在每个输入前有一个“标题行”的风格。如果这重复了一段文字的内容,也不用担心;想想那些只是“看图片”的人可能会读一些东西来理解一张图片是什么,然后他们才真正开始阅读完整的文本叙述。

Wolfram笔记本的技术使它直接放入交互元素,比如操作,转化为计算论文。有时这是非常有用的,甚至是必要的。但互动元素不应该被过度使用。因为每当有需要交互的元素时,就会降低浏览文章的能力。

有时需要相当数量的数据或代码来设置特定的计算文章。云对于处理这个问题非常有用。只需将数据(或代码)部署到Wolfram云,并设置适当的权限,以便在文章中的代码执行时自动读取。

笔记本还允许单元格的“反向关闭”——即使生成输出单元格的输入单元格最初是关闭的,输出单元格也可以立即被看到。这种隐藏的代码通常应该避免在计算文章的主体,但是它有时有用的开始或者结束的一篇文章,要么给预示着即将发生的事,或者包括一些更高级的,你不想去通过详细的。

好的,那么如果一篇计算论文是作为家庭作业完成的,那么如何评估呢?第一个简单的问题是:代码是否运行?这几乎可以自动确定。然后,评估过程与普通文章非常相似。当然,将单元格添加到笔记本中并对其中的内容进行评论是非常简单的。这些单元格可以包含可运行的代码,例如,可以在文章中获取结果,并对其进行处理或检查。

好的计算作文有原则吗?以下是一些候选人:

0.明白你在说什么(!)

1.找到最直接和直接的方式来表达你的主题

2.保持每个Wolfram语言输入的核心在一两行之内

3.尽可能使用显式可视化或其他信息表示

4.尽量使每个输入和标题都能独立理解

5.将不同的主题或方向分成不同的子部分

学习语言

计算论文的核心思想是使用Wolfram语言表达计算思想。但要做到这一点,必须了解该语言。现在,与人类语言不同,Wolfram语言是明确设计的(是的,这是我在过去30多年中一直在做的事情)遵循明确的原则,尽可能地简单易学。但仍有学习要做。

Wolfram语言的一个特点是,与人类语言一样,它通常读起来比写起来更容易。这意味着,对人们来说,学习写计算机论文所需要的东西的一个好方法就是首先阅读一堆论文。也许到那时他们就可以开始修改这些文章了。或者,他们可以开始创建“笔记论文”,基于现场编码或其他课堂会议生成的代码。

当人们在写Wolfram语言方面变得更加流利时,有趣的事情发生了:他们开始用这种语言表达自己,并使用Wolfram语言输入在计算文章中携带重要的叙述部分。

当我写作的时候Wolfram语言的基本介绍(这本书很大一部分是由一系列计算类文章组成的)我有过一次有趣的经历。在这本书的开头,用英语解释计算练习相当容易(“用前10个方块做一个表格”)。但在书中稍晚的时候,这变成了一个令人沮丧的过程。

用Wolfram语言很容易表达我想要的东西。但是用英语表达这个词又长又别扭(而且听起来有点像法律术语)。这就是使用Wolfram语言的全部意义,也是我花了30多年时间构建它的原因:因为它提供了一种更好、更清晰的方式来表达计算思想。

人们有时会说,人类的语言决定了你的思维方式。目前还不清楚这对人类语言有多真实。但计算机语言绝对如此。Wolfram语言最强大的一点是它帮助人们形成清晰的计算思维。

传统的计算机语言是关于编写代码来描述计算机应该做什么的细节。Wolfram语言的重点是提供更高层次的东西——可以立即讨论世界上的事情,并允许人们尽可能直接地使用它作为计算思维的媒介。从某种意义上说,这使得一篇好的计算文章成为可能。

计算论文的漫长道路

现在我们已经有了完善的计算机论文,我意识到我已经走上了一条通往它们的道路近40年.起初,我将交互式计算机输出和透明胶带的描述融入其中:

交互式计算机输出草图,点击放大

到1981年,当我建立SMP的时候,我通常会写一些文档,其中穿插着代码和解释:

代码穿插着解释,点击放大

但直到1986年,当我开始记录后来的Mathematica和Wolfram语言时,我才开始认真地开发一种风格,接近我现在喜欢的计算论文:

Wolfram语言版本1文档-点击放大

和释放1988年的Mathematica 1.0另一个关键因素是:Wolfram笔记本的发明。笔记本的形式至少在表面上与今天非常相似(在许多方面已经比25年后开始出现的仿制品更加复杂!):细胞集合,并能够包含文本,可执行代码,图像等。

早期的Mac笔记本电脑

起初,笔记本只能在Mac和NeXT电脑上使用。几年后,它们被扩展到Microsoft Windows和X Windows(以及后来的Linux)。但是人们很快就开始使用笔记本来提供他们所做的报告,并创造丰富的说明性和教育性的材料。在几年内,开始有基于笔记本的课程,以及由笔记本打印的书籍,后面有交互式的光盘版本:

笔记本出版的例子-点击放大

所以从某种意义上说,计算论文的原材料早在20世纪90年代初就已经存在了。但是,要真正让计算性的文章成为自己的一部分,就需要云的发展,以及整个广泛的计算知识范围,这是现在Wolfram语言的一部分。

到了1990年,完全有可能创造出一个带有叙述的笔记本,人们做到了,特别是关于数学之类的主题。但如果涉及到真实世界的数据,事情就会变得一团糟。人们必须确保所需的一切都能从发行CD-ROM或其他任何东西中获得。我们创建了一个球员的笔记本在很早的时候,它有时与笔记本一起分发。

但在最近几年,特别是随着发展Wolfram云,事情变得更加精简。因为现在你可以无缝地将事情存储在云中,并在任何地方使用它们。而且,你可以直接在云中使用笔记本电脑,只需使用web浏览器。此外,得益于大量用户辅助创新(包括自然语言输入),用Wolfram语言编写变得更加容易,而且这样做可以实现更多的功能。

我认为现在肯定发生的一件重要的事情是,它已经变得足够轻,可以产生一个好的计算文章,它是有意义的做一些例行公事,无论是专业地写报告,或作为一个学生做家庭作业。

古代教育历史

学生写计算机论文的想法在现代是一种新事物,这是由一整套当前技术所实现的。但这与遥远的过去产生了奇妙的共鸣。你看,如果你学会了喜欢数学主题在美国几百年前,一个大的事情你需要做的就是创建一个所谓的密码本的几年你仔细写解决一系列问题,解释与计算。当时的想法是,你将你的密码本保存到你的余生,每当你需要解决像它包含的问题时,就参考它。

现在,在计算论文中,你可以做同样的事情。与手工计算相比,您可以解决的问题要复杂和广泛得多。但就像读密码书一样,你可以写一些计算类的文章,所以将来它们对你会很有用——尽管现在你不必再手工模拟计算了;相反,你只需要编辑你的计算笔记,并立即重新运行Wolfram语言的输入。

事实上,我最近才学会了如何对书籍进行加密。大约20年来,我一直把一本奇怪的手写笔记本作为艺术品(它说是由某个乔治·莱曼(George Lehman)于1818年创作的,显然是他的作品)宾夕法尼亚州Orwigsburg),页面如下:

密码书-点击放大

我现在知道这是一本密码书——在这一页上描述了如何“通过给定阴影的长度来求垂直物体的高度”。当然,我也无法抗拒现代计算机论文模拟,不用说,它可能更复杂一些。

求太阳当前位置的方位角、高度:

SunPosition []

SunPosition []

求单位高度物体的阴影长度:

1 / Tan (SunPosition [] [[2]]]

1 / Tan (SunPosition [] [[2]]]

给定一个10英尺的阴影,求出物体的高度:

棕褐色[日光位置[][[2]]]10英尺

棕褐色[日光位置[][[2]]]10英尺

路的前方

我喜欢写文本文章(比如博客文章!)但我更喜欢写计算类的文章。因为至少对于我想要沟通的许多事情,我发现它们是一种更纯粹、更有效的方式。我可以花大量的文字来表达一个想法,或者我可以只提供一小段Wolfram语言输入,它可以非常直接地表达这个想法,并通过生成(通常是非常可视化的)输出来展示它是如何工作的。

当我写我的大书的时候一种新的科学(从1991年到2002年),我们的技术和世界都还没有完全准备好,以计算机论文的形式,他们现在可能。我为这本书所做的研究填满了成千上万的Wolfram笔记本。但是当我真正把书整理在一起的时候,我只是展示了从这些笔记本中得到的结果——包括在书的后面的注释里的一小部分代码。

但现在,这本书的故事可以用计算机论文来讲述——我已经开始写了。(只是为了好玩,我一直在直播我正在做一些工作来创造这些。)让人非常满意的是,这本书中的思想是如何清晰而清晰地在计算机论文中表达出来的。

计算机论文有很大的潜力。事实上,我们现在开始了收集“主题探索”的项目,即使用计算机论文以前所未有的清晰和直接的方式探索广泛的主题。就像我们的Wolfram示范项目(现在有11000多个Wolfram语言支持的演示)。下面是我写的一个典型的例子:

中心极限定理

计算机论文开辟了各种新的交流方式。直接呈现计算实验和探索的研究论文。报告描述已发现的情况,但允许立即调查其他情况。当然,计算论文为学生(和其他人)定义了一种非常直接和有效地展示他们所学知识的方式。

写和读计算论文都有一些令人满意的地方。就好像在交流思想的过程中,我们最终能够超越纯人类的努力,真正利用计算的力量。对我来说,在将Wolfram语言打造成一种计算交流语言之后,看到它是如何实现的,真是太棒了可以用来在计算论文中进行有效的交流。

当我收到一篇格式良好的计算机论文时,感觉很好。因为我马上就知道我会得到一个我能真正理解的故事。不会有各种各样的遗漏来源和隐藏的假设;只有Wolfram语言输入是独立的,我可以拿出来自己学习或运行。

现代网络世界给我们带来了一些新的交流方式,比如博客、社交媒体和维基百科。但所有这些仍然遵循文字+图片的基本概念,这是自识字时代开始就存在的。有了计算论文,我们终于有了新的东西——看到它让所有事情成为可能,这将是令人兴奋的。

12个评论

  1. 你好,斯蒂芬
    再过几个星期,我就要提交一篇完全用Mathematica笔记本写的统计学博士论文了,这个博客深深地打动了我。
    我有一个附录,在附录中我支持这种形式的陈述,我引用了理查德·克兰德尔1991年出版的《科学数学》一书的序言。
    今天,我读了你们的计算论文博客,并添加了一个章节,提到了这个新术语的旧概念。
    我已经用编程的“反向关闭”单元格为我所有的标题图,这被证明是无价的,在产生有吸引力的文件,我一直打算在计算文章的精神。
    因此,我应该感谢你们的精神支持,并希望主考人员同意我们的做法!
    最好的祝愿
    巴里

    巴里斯托克斯
  2. 好的文章!
    作为一名概率论和统计的介绍性讲师,我对中心极限定理的笔记本印象特别深刻,我想知道关于这些主题是否还有更多的笔记本可用。

    鲁本
  3. 你可能会对计算机科学家Donald Knuth提出的“读写编程”的想法感兴趣。

    吉姆·泰森
  4. 不要忘了计算机期刊文章,所有人都可以获得这些数据。

    David g .鹳
  5. 你写道,“真正让它工作的是Wolfram语言。”我困惑。你的计算作文与你从Markdown、iPython等笔记本上得到的作文有什么不同?

    • Wolfram语言支撑着我们的技术堆栈,创造了一个有凝聚力的过程。我们的笔记本提供了一个完整的生产环境,从数据导入,原型,操作和测试,这些都可以在同一个笔记本上完成部署到云或生成最终报告或演示。它不需要像iPython笔记本那样与单独的工具捆绑在一起,这使得我们的笔记本更适合计算性文章,因为您不需要设置您的笔记本来使用特定的库。
      最重要的是,因为我们的语言统一了我们的技术堆栈,所以不存在像Python那样相互不兼容的解释器的问题,甚至当你迁移到可以接受多种语言内核的Jupyter时,确保每种特定语言都有所需的包变得越来越困难。Markdown在笔记本上很有用,但在iPython笔记本上的Markdown是不可折叠的,这使得它们很难构造。
      另外一个关键特性是我们内置的知识库。在数千个领域中,知识库包含了直接来自主要来源的精心策划的专家知识。它不仅包含数万亿的数据元素,还包含了封装几乎每个领域的方法和模型的海量算法。

      管理
  6. 我同意计算论文是一项重要的创新。它们一直是Mathematica软件不可分割的一部分,这是多么美妙啊,而这一理念的内涵还在不断展现。我认为有趣的是,它为“数学家做什么”提供了一个新的、更好的答案。一篇计算论文不仅仅是一个问题的解决方案,或者是如何解决问题的描述,而是一个完整的模型和向导式的游览,其中包含了比印刷论文更多的问题解决过程。

    一个显而易见的问题是,计算机论文是否能以一种深层次的方式相互联系,使论文链成为一个连续的证明?例如,一连串的计算性论文可以成为一个完整的计算性证明吗?比如说,怀尔斯对费马大定理的证明?如果没有,还缺什么?一篇计算性的文章能证明另一篇文章可以“调用”的定理吗,比如计算函数?在我看来,数学文献应该被视为一个庞大的相互关联的结构,而不是由互不相容的符号组成的孤立孤岛。

    为了充分理解这种形式的含义,我将自己写一些计算论文。过去让我陷入困境的是,我想写的几乎所有东西都不能(我相信)用Wolfram语言表达,因为它们涉及直接操作(例如,拖动和组装Polyminoes)作为输入,而Wolfram语言似乎不支持这种操作。

    • 即将到来的Wolfram语言版本将迈出第一步,在语言中实现证明,当然,这些证明可以成为
      计算的文章。

      长时间的人写的可读的证明(例如。http://annals.math.princeton.edu/wp-content/uploads/annals-v162-n3-p01.pdf)不是数学证明的未来。而是证明的未来
      将是机器可读和机器验证的证据。有一个很好的最近的博客关于这个问题,AMS在最后提到了Wolfram Language-LEAN的连接。

      蒂莫西·周(https://arxiv.org/abs/0712.1320v2)写道:“所有数学家都熟悉公开研究的概念
      问题。我提出一个不太熟悉的概念,即公开展示问题。解决一个公开展示问题意味着解释一个
      以一种使它完全清晰的方式来学习数学。每一步都要有动力和清晰;理想情况下,学生应该有这种感觉
      他们本可以自己得出结果的。”

      我们认为计算机论文是理想的解决/实现这样一个“开放的阐述问题”。

      管理
  7. 您是否考虑发布用于编写此类文档的样式表,或者发布用于输入描述文本单元格的默认样式?您使用的单元格样式(据我所知)在默认样式表中是不可用的。我仍然为这些单元格使用旧的MathCaption,但希望使用更新的样式。

    丹尼尔
    • 输入描述单元格的样式将在下一版本中可用,称为“CodeText”,但只能通过“格式>样式>其他”对话框访问。之后将提供完整的样式表支持。

      管理
  8. 我对这些计算笔记本(wolfram alpha / jupyter)唯一的问题是图形和文本混合在一起,在我看来很难集中精力。我认为简单的双列用户界面可能更好,它将文本与计算分离开来。

    De大凯文
Baidu