2010年4月22日星期四

编程语言与科学计算 - 篇一

编程语言是用来向计算机发出指令,而计算机起初是用来做科学计算的,比如ENIAC最早就是被用作火炮弹计算和设计氢弹时计算断面中子密度。通过电子技术获得了比算盘更强大的计算能力。出于“标题什么的只是个引子”的理由,接下来要说的还是集中在计算工具上。
打算以历史发展的角度来说,并且重点在提及而非严谨,内容也会是选择性的来说。
第一个正式的高级编程语言Fortran最初就是发展于数值计算方面的需要。它命名是Formula Translation即公式翻译的意思,并且在特性上有接近数学公式的自然描述,很高的执行效率,直接对矩阵和复数进行运算,以及在这一领域长期广泛的积累。
下面按时间顺序说到Algol/Pascal。Algol的名称国际代数语言表示它一种算法语言,使用接近伪代码的表达式来描述计算过程,也就是直接面向算法的。Pascal基于ALGOL,强调了结构化编程以及数据结构的运用,在教学和开发中一直有着广泛的运用。这里也体现了“算法+数据结构=程序”的说法。
然后到了某种意义上算是第二个高级语言LISP/Scheme。LISP即LISt Processor列表处理语言,是一种基于λ演算的函数式编程语言。它是人工智能(AI)上的运用在与计算机的结合,比如做自然语言分析。利用它特有的λ演算和LIST结构,可以设计数学上的符号积分系统。Scheme是LISP的一个方言(显著的是静态作用域),在如今的动态语言上留下了很明显的痕迹。LISP的一个分支LOGO被用在了直观的儿童教学和简单建模。
(GW)BASIC命名是初学者的全方位符式指令代码,是针对初学者简化自FORTRAN的人机交互式语言。这里想说的版本是GWBASIC(至少现存着),因为它本身接近原本ROM-Basic的形式。在启动PC后直接通过语言解释器的界面交互使用设备,并可以第门槛的来运用编程语言的功能。
APL/J让它作者获得了获得图灵奖,如今至少我没见过它的运用。不过它对数组和矩阵有很强的表现力,在现在看来接近于书写复杂的数学表达式(有点∑的感觉)。
Brainfuck,这个,貌似名称不文雅了。拿出来仅想说一下最简单的语言也可表示图灵完备的,也就是理论上最高的计算能力。而且图灵完备也不一定要冯诺依曼结构(比如用λ演算)。
然后说SQL/Prolog,果然开始慢慢跑开话题了。SQL呢,和数学上的联系在于关系代数,是用于数据库中的结构化查询语言。Prolog是代表Programming in Logic,其中显著的特性是Horn子句,设计为用于人工智能以及专家系统。在meta元编程上和LISP有共同的地方,即利用自身的特性施行特定领域语言的识别与使用。
电子表格软件EXCEL/VBA明显不是一种语言,但确实是数据处理上很实用并通用的东西,比如用在金融领域中。它本身可以直观的展示和编辑数据,而且在功能上除了丰富的内置函数,还提供了图表展示和求线性规划等等。公式和函数已经可以用来实现复杂的逻辑了,vba脚本反而不是很常用。
计算器calc,终于到了一个最熟悉的角色了。不论是实体还是软件,它就是一个简单纯粹的计算工具。使用最简单的计算器,就可以进行轻松的四则运算了。不过这里我的分类乱掉了,因为谈论计算器是从一个专用的计算设备的角度来看的,而编程语言是从语言的功能和实现对设备的使用的角度来说的。复杂的计算计算器可以用来算微积分数据分析图形展示等等,也提供了编程的接口。Linux下可以安装extcalc来玩玩。
C/C++因为在系统以及通用语言上的地位,可以用来代替Fortran和Algol处理运算和算法。因为C本身是一种较底层的语言,有着性能上优势以及系统的紧密的结合。C++上一个值得关注的方面是泛型编程。在STL中,利用C++的对象机制和模板机制,抽象了数据结构和相关算法。还提供了复数类供方便使用,Numerics库用于数列和矩阵上的高效扩充。
数学软件(用英语写成Mathematical software)是用来模拟分析计算数值符号几何数据的软件(额,断句有点问题,这里是三个动词加三个名词。这里是说到了专用软件和系统的话题)。从语言上说是使用了专用的接口,可以看作是一种DSL(Domain Specific Language)。而且比一般可用来计算的软件要可靠。其中的代表有MATLAB,实现了数值矩阵计算,建模仿真以及对专用工具箱的界面。在数值分析领域,有同源的若干开源实现比如Octave,而Scilab则倾向于实现出较完整的功能。
CAS是Computer Algebra System计算机代数系统的缩写,是用于进行符号运算的软件。其中一个维护至今的开源实现是Maxima(本身是LISP实现),它的前身Macsyma也影响了Maple及Mathematica的出现。速度方面会不如数值运算软件。
其他的还有一些有关的软件的例子。比如:统计分析软件R语言,用于。排版系统TeX,可以精美的展现出数学表达式。
最后,在这部分的最后,来说说SmallTalk的对象浏览器。它是出于ST的纯OO特性,在其集成且开放的应用开发环境GUI中,是用来提高编程效率的工具。至少现在说数学软件已不仅仅是指功能和组件了,开发环境也是作为一个要素和工具在使用的。
好了,以上的内容是从科学计算的角度回顾了一下编程语言发展。所以没有提及商务以及通信媒体方面的语言及应用,而数学软件也仅作为了一个来提(其实这方面的应用我也确实很不了解,话说这才是真正广泛并深入的部分),在此说明一下。

##分##看过一个艾薇儿演唱会加采访的视频,话说那种对行为细致叙述的歌词是很有魔力的。##割##

接下来要说的Python与科学计算,我只是觉得这是一个省事的方法。毕竟Py这里更多只是在作为一个界面与胶水,而我也只是要一个能用的方案而已。
已经有人写过详尽的专文了,传送:
《用Python做科学计算》 http://hyry.dip.jp/pydoc/index.html
也有一个使用了Py的集成系统Sagemath,它是对大量相关工具的集成。
教程可以见 http://www.sagemath.org/zh/ 感觉是很实用的一篇
用Py的好处是它在MacOS和众Linux发行版中是自带的,拿出来就可以当计算器用,而且它本身可以清晰的用来表现算法。另一个很重要的方面是,Py有着广泛的库和接口以及在有关领域一定规模的社区支持。比如会用到的库:NumPy,SciPy,SymPy(这个还在开发,目前不是很可靠。还是去用maxima吧,sage就是这么做的。也像Matlab用Mapple的感觉),matplotlib。。。
好了,我发现其实这里和具体的语言没什么关系,来提Py只是在把话题引到一个手头上可以具体使用的工具上来。
在开源方面GMP是个底层库,其他数学软件可以用它来计算的。而仿Matlab的开源系统也有很多来着,一些已经是完备并实用的了,如Freemat,Scl。其他也有一些实验性的,比如Mathomatic,是一个C语言的小巧便携的CAS实现,功能简单但移植方便。不过我这里是要能干活的工具来着。

下面以数值积分为例,来涉及一下数学软件的简单原理。
数值积分是计算机可用的定积分算法。它的概念源于对积分区间的分割,通过细分出的区域的面积和来无限逼近积分值。而利用计算机强大的计算的能力,可以有效地执行对分割出的区域的积分值的累加。其中用到的方法有牛顿-寇次公式,即将积分区间等分后用多项式的和来表示原函数来进行计算。可用梯形法,即用线段表示被积函数将积分面积表示为梯形面积之和。也用辛普森积分法,以二次曲线代替矩形或梯形进行积分。
另一种积分的求法是通过符号运算(如CAS中用到的)。原理是牛顿-莱布尼兹公式,将定积分表示为两个求两个函数值的差,通过求函数的积分函数来求定积分的值。
我不能确保我的解说是完全正确的。况且这里仅一个示例,也不会去谈论涉及到的更多的数学原理。这一小部分只是想展示科学体系的完整性,而且希望在后面的内容中去更多地关注数学模型的运用。

有关方面详细的,可以阅读数值计算Matlab的相关书籍,也可以再看一下关于LISP实现符号积分的文章。

打算写的东西,在下一帖里再继续,本篇先暂且到此了。

中英名词对照表:(补充中)
这部分在是对下面内容的汇集,以提供阅读和使用的方便。
...

Todo:
高等数学
线性代数
离散数学
数学建模
声波和位图

其他:
Mathematica有个在线版http://www.wolframalpha.com/

没有评论: