Mathematica与大学物理计算(第2版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-26 18:11:23

点击下载

作者:董键

出版社:清华大学出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Mathematica与大学物理计算(第2版)

Mathematica与大学物理计算(第2版)试读:

前言

目前,物理学的研究大致形成了三种方式:理论物理、实验物理和计算物理。通常情况下,大学物理课程传授的是前两种方式,第三种方式的教学还没有普遍开展。这种情况正在逐渐改变,原因来自两个方面:一是三种研究方式趋于综合才能更好地解决物理问题,深入的计算已经不可或缺;二是计算机已经普及,诸多计算软件已经很成熟,适时将计算物理从选修课升级为物理学专业的必修课已经具备了条件。

本书以Mathematica为计算工具,借助于研究一系列物理问题,试图向读者展示物理计算的方法,如何通过计算更好地理解物理学,计算如何能成为学习物理学的新方式,以及为大学物理教学更好地引入计算手段提供一些方法和素材。通过学习本书,读者可以树立物理计算的概念,确信计算可以解决很多问题,计算的机会无处不在。本书各章内容分述如下。

第1、2章着重介绍了Mathematica的语法、函数和一些典型数学问题的求解方法,为读者认识该软件的特点和用法打好基础。在随后的各章中按照物理学的领域分别研究了摆动、振动、电学、磁学、光学、量子、随机运动以及物理实验方面的一些问题,表明这些方面是如何借助于计算软件的帮助而展开和深入下去的,为读者打开更广泛的视野。

第3章详细研究了单摆问题,这个模型作为一个内涵丰富的“道具”,可以为读者从问题的提出、模型建立到Mathematica函数使用和计算结果的分析与表达,树立范本。结合单摆的研究,还就计算误差的发现方法和减小措施进行了探讨,这是做好数值计算必须要了解的。在考虑了地球自转效应之后,单摆就成了傅科摆,该章对傅科摆进行了详细的分析和仿真,让读者体会物理模型从过于理想化到接近真实的演变过程。

第4章研究了受迫振动问题和一维振动链问题,通过解析分析和数值计算相结合的方式充分展示了受迫振动的特点,以及多体振动会出现“合作运动”的现象,说明对耦合问题的分析应该着眼于“合作运动”模式的探寻而不是单个个体的运动,后者已经退居次要地位,而探寻“合作模式”的有效工具是FFT。

第5章重点研究了一些情形下的静电场计算和描绘问题,以电聚焦问题为例,介绍静电场计算的数值方法,包括各种经典迭代方法,以及如何利用Mathematica的插值功能将数值计算的结果延拓成连续的函数,从而可以计算电子的运动,揭示电极聚焦的可能性。该章还简单研究了两个“动电”即电路问题,其方法和结果都有借鉴价值。

第6章研究了若干情形下磁场的数值计算和磁场的描绘,详细讨论了能捕获原子的磁阱、长直螺线管、椭球螺线管以及三相输电线路截面上的磁场分布,这些结果既有学术价值也对实际使用磁场有参考作用。该章的另一个部分是研究了带电粒子在磁场里的运动,包括动量谱仪的设计和粒子的运动、同步加速器中对粒子轨道的约束以及磁镜对粒子的约束,这为读者了解更多的磁场类型和使用会有启发。

第7章借助于光线方程,研究了光线在光纤里的传播,介绍了折射率跃变界面上光线追迹的理论,由此讨论了光线经过透镜的传播问题,形象地解释了像差的形成,并由此探讨了组合透镜消色差的问题,这些结果具有重要的教学和应用价值。本章还详细研究了棱镜实验的模拟分析,以及如何从光路计算的角度求解传统几何光学中一些题目的问题,也很有启发性。本章最后模拟了光的衍射,包括随机分布孔的衍射。

第8章讨论了量子态的叠加导致新能级的形成和微扰计算的有效性问题,重点发展了一维散射问题“倒算法”和一维本征值问题“初值解法”的理论,导出了诸如共振隧道穿透问题以及复杂势函数模型下本征值问题计算的一般方法,并以此证明了周期性势场中粒子能级会分裂成能带。该章很有特色,可以为读者学习量子力学提供借鉴。

第9章介绍了概率和统计分析的概念与计算方法,为读者进行随机运动的计算奠定基础,接着模拟了气体分子的碰撞过程和趋向热平衡的问题,所设计的算法成功地将器壁对气体分子动量分布的影响考虑进来,推进了对碰撞问题的认识。该章还模拟了布朗运动和树叶的摆动,所得到的结论也很有启发性。

第10章通过深入计算,重点研究了实验误差分析如何指导选取合适的实验方法和实验条件,从而提高实验精度的问题,大大超越了传统误差教学仅在实验之后去计算误差的做法。

本书在众多物理问题的研究中,大量使用了Mathematica的函数,以及各种算法和技巧,并编写了大量的程序,可以供读者学习和模仿。书中相关程序请到清华大学出版社网站下载(网址:www.tup.com.cn,搜索本书书名网页)。选用本书作为计算物理教材和参考书的大学生、研究生、物理教师(包括中学物理教师)、科研人员,以及物理爱好者们,若能从书中汲取一些有益的营养,作者就非常欣慰了。

我要感谢本书所引用文献的作者们,他们在不同的方面给予了本人帮助和启发。特别要感谢的是Mathematica的研制者们,本书如果有某些成就,也有他们的一份贡献。写作过程中得到夫人崔秀芝的悉心照料,她同时也修正了原稿中那些不当的用词和疏漏之处。

本书的编写得到清华大学出版社编审人员的指导,在此一并致以衷心感谢!

读者在使用本书时若遇到问题,可以通过邮箱qfdongjian@163.com与作者联系,欢迎交流。在第1版发行期间,我收到了大量读者的来信,有学生,也有老师,所提出的问题各种各样,这是促使作者尽快重写此书的动力之一。在此,再次希望你们批评指正,以共同推动计算物理教学和研究的发展。董键2013年4月第1章初识Mathematica

本书的计算工作都是在数学软件Mathematica环境支持下进行的,所以先对该软件进行一些必要的介绍。Mathematica是从事数值运算和符号运算的优秀软件,其简单的语法和强大的功能,使很多科学工作者都对它特别青睐。对于学习数学和物理的读者来讲,首先要学会使用Mathematica,若要从事工程计算,再学习MATLAB等软件。Mathematica作为大学物理的学习工具和科普工具软件是首屈一指的。

要使用Mathematica进行计算,首先要将它安装到计算机里。作为一个大众软件,Mathematica已经很流行,初学者可以到Mathematica研制公司的网站上下载(试用版),网址是http://www.wolfram.com/。现在,Mathematica已经发展到8.x版,国内使用较多的还是7.x版,本书的计算就是在此版本下进行的,新版本的Mathematica对于物理计算的功能并没有增加。

对于英语水平不太高的读者,都希望有Mathematica中文介绍书,这方面已经有不少资料[1],包括网络扫描版本的。还有很多“数学实验”的书也在介绍Mathematica(往往是低版本的),它们提供了更多的例子让读者体会其函数的功能。为了进一步方便读者查阅,本章将对Mathematica的基本知识做一些梳理和介绍,以帮助读者快速入门。其实,Mathematica的联机帮助中就有比较详细的介绍,其所提供的例子简单明了,对于各种学习阶段的用户都有帮助,只要按F1键就能启动浏览界面,按类别进行查询。记住一点:要获得Mathematica的准确知识,就要查阅联机帮助;要提高Mathematica的使用水平,就要经常浏览联机帮助。1.1 Mathematica的窗口功能

现在,假定读者已经在计算机里安装了Mathematica,可以像启动其他视窗软件一样地启动它。图1-1就是Mathematica 7.0工作时的窗口画面,可以看到,在该视窗画面上,有菜单栏、标题栏、工具栏、工作区和模板窗口。其中,菜单栏和模板随版本而异。图1-1 Mathematica 7.0工作时的窗口画面

用户可以在工作区里输入编制的程序,本例中有两个小程序,第一个程序进行一个球体的质量计算,第二个程序画出了一个函数的曲线。在工作区的顶部可以显示工具栏,方法是从Window菜单启动Show Toolbar选项。工具栏可以用来选择单元类型、保存和打印文件、设置程序对齐方式等。通过Window菜单还可以启动标尺Ruler,用来进行文本和图形的对齐、缩放等操作。

模板是进行符号与函数简便输入的地方,在用户还不熟悉Mathematica的符号和函数的情况下,可以使用模板输入。模板窗口有几个,读者可以从Palettes菜单进入,选择需要的模板窗口,对多数用户来讲,使用Basic Math Assistant和Classroom Assistant两个模板就可以了。

在工作区的右边,读者可能注意到一些拉长的右括号“]”,这是“单元括号”,它所括起来的区域是一个单元(Cell),Mathematica就是按单元进行计算和显示的。单元又分为输入单元、输出单元和图形单元等。程序运行后,一般会有输出,这时,原来的一个输入单元就会跟随输出单元,系统自动将输入-输出单元用一个更大的“]”将它们括起来,组成一个复合单元,表示输入-输出单元的逻辑联系;同时,会在左边出现类似In[1]:=这样的符号,它表示输入程序的行号,但不会在每行前面都有行号。有的程序行要输出结果,就会在程序后面出现Out[3]=这样的符号,表示它是哪个输入行产生的结果。那么,什么样的输入行会有结果输出呢?这就是末尾不加分号(;)的输入行,在多数情况下,末尾加了分号,就不输出这一行运算的结果,但运算结果仍保存在内存里。

上面提到,Mathematica的程序是按单元来组织的,每个单元的程序单独编写和运行。那么,写好了程序,如何运行呢?这就要按运行命令键,即数字键盘区的Enter键,或者字母键盘区的Shift+Enter组合键,字母键盘区里的Enter键不是运行键,而是编辑键,例如输入程序要换行了,就是按这个区域的Enter键。要记住的一点是:在按运行命令键以前,请将光标定位到相应程序的单元区,若不然,就不会按要求运行。

如果要写多个程序,可以在已写程序单元下面的空白处单击,然后开始写新的程序,系统自动产生新的单元括号;也可以在已写过内容的两个单元之间插入新的单元,办法是:将光标移动到两个单元之间的空白处,光标变成了平躺的“工”字形,单击,出现一条水平横线,这时就可以写新的程序或者添加文字了。

为了更好地显示程序的层次结构,建议读者使用工具栏左端的下拉菜单,通过选择Title、Section、Input等,改变单元的属性,将单元组织成有序的结构,也为不同的工作自然分段,但程序一定要写在Input单元内。

这里要特别提醒读者的是:除了偶尔使用汉字需要切换到中文输入状态,其他情况下一律处于英文输入状态下!有两个地方可使用汉字,一个是作为字符串数据,另一个是作为注释内容出现在注释行里。注释行可以出现在程序的任何地方,它的格式是(*…*),其中…表示注释内容,其使用格式如下:(*这是注释行,加上注释更容易阅读,但不是必需的。*)1.2 Mathematica的变量与函数

对于初学者,要切记的一条是:虽然表面上看各个单元是独立的,但是,各个单元使用的变量(以及输出结果)却是公共的,不同单元的程序能够借助于变量互相联系,尤其是能互相干扰!

什么是变量呢?变量是一个符号,用来储存一些数据,这个数据就称为变量的值。变量就像一个仓库,数据可以进进出出,随着程序的运行,变量的值可以改变。表示变量的符号叫做变量名,Mathematica给变量起名的规则是:

以英文字母或者希腊字母开头,后面可以添加英文字母、数字和希腊字母。

变量名的长度没有限制,但不能含有空格、标点或下划线等符号。变量名中的字母区分大写和小写,例如a1与A1就是不同的变量名。

要注意,有几个字母是Mathematica系统使用的,有特别含义,用户不要随意使用。它们是:E、I、D、C、O、N(其中E表示自然对数的底,I表示虚数因子,D是微分算符,N是近似计算函数,O表示级数展开的高阶项,C代表符号运算产生的常数)。

在图1-1的窗口程序里,共使用了三个变量,它们分别是ρ、r和m。Mathematica的变量类型不用声明,是根据赋值的类型自动确定的,并可以随时改变类型。

知道了什么是变量,如何提防不同单元间变量的干扰呢?办法是:如果你确认不再需要使用过的变量,那就清除它的值!通常是使用函数Clear[],其格式是

Clear[变量1,变量2,…]

这是本书介绍的第一个函数,它对Mathematica的运行安全至关重要!建议读者形成一个习惯,在一个完整程序的末尾使用如下形式来清除所有已赋值变量的值:

Clear["Global`*"]

Mathematica的函数分为系统定义的函数和用户自己定义的函数,它们的共同特点是要在函数名之后用中括号“[]”将作用的对象括起来。

系统定义的函数可以在联机帮助里找到它们的名称和使用格式,其首字母必须大写,而且多数函数名使用英文单词全拼,如果函数名由几个英文单词组成,每个单词的首字母必须大写。使用单词全拼作为函数名,这对于熟悉英文的用户来讲,可以望文生义,非常有利于记忆和辨识函数的功能。

用户自己定义的函数,命名规则与变量名相同,其基本格式是

fun[x_,y_,…]:=expr

其中,fun表示函数名;x_、y_等表示函数的形式变量,一定要加下划线,各个变量之间要用逗号分隔;符号“:=”称为冒等号,表示右边延迟运算,中间没有空格;expr是函数的具体表达式,其中的变量x等不加下划线。

无论是用户定义的函数还是系统函数都要严格按格式使用,只有严格遵守规定,才不会出错。计算机是遵守严格科学规范的模范,我们要尊重它的这个习惯,要注意克服平时书写中那些随意性的习惯。

更多的Mathematica函数,将随着物理问题的研究,在出现的地方进行介绍。读者如果嫌这个办法慢,可以先按某一本介绍Mathematica的书突击式地学习一下,然后再来看本书后面的介绍,可能印象会更深刻。我们要把Mathematica当作物理研究的工具,甚至当作物理不可分割的一部分。这样来重视Mathematica,一点都不过分,若没有这个工具,就像没有电压表一样,想测量出电压那是很困难的。可以说,对Mathematica掌握得越熟练,读者的物理研究水平就越高。这个观念,在随后的研究中读者将体会得越发深刻。1.3 Mathematica的程序输入、保存与运行

所有需要Mathematica做的工作都必须通过程序进行。编程是解决问题的基本手段。程序一般先在纸上写好,或者写一个大概,然后输入计算机,经过运行调试,以检验它是否正确。关于程序调试的方法,请参阅附录A。这里先说说如何输入。程序输入是逐行进行的,不过,行的长度是不确定的,因为只有语句是基本的,不同的语句可以用分号连接放在一个输入行里。比如图1-1的第一个程序有三行,其实可以放在一行里。Mathematica行的长度没有限制,用户可以根据需要把多个语句放在一行里,当一行遇到窗口边缘的时候,它会自动调整屏幕一行的字符数,另起一行,显示其余的部分。

下面介绍几个常用符号的输入方法,学会它们可以提高的输入速度,要点是使用快捷键。

分数线:Ctrl+/

二次根号:Ctrl+2

上标:Ctrl+6

要输入希腊字母,懒惰一点是使用模板上的Typesetting,找到希腊字母区,单击相应的字母。不过,读者可以事先学会使用快捷键来输入一些常用的希腊字母,这些快捷键的学习方法是:先激活模板,用鼠标指向某个字母,例如ρ,在光标下面的提示框里出现ESC r ESC,表示字母ρ的快捷输入方式,如图1-2所示。图1-2 显示字符的快捷输入法

用户辛辛苦苦编写的Mathematica程序,若有保留价值,就应及时保存起来。保存文件的操作是常规的,即从菜单File进入,里面有文件“建立”、“打开”和“保存”等命令。也可以通过Window菜单激活Toolbar工具栏,单击“保存”按钮更方便保存文件。建议在常用的磁盘里建立一个文件夹,以后就将Mathematica文件存放在那里面。文件保存时要输入一个文件名,可以是英文字母、汉字、拼音字母、数字、减号、冒号的组合等。Mathematica程序文件名的后缀是nb,表示笔记本文件(note book),因为Mathematica程序按单元依次排列下来,就像一个笔记本。

一个“笔记本”里可以保存很多个程序。若要阅读、编辑或运行一个“笔记本”里的程序,可通过资源管理器找到这个文件,双击文件名,就启动了Mathematica,同时打开了文件。用户可以同时打开多个“笔记本”文件,管理这些文件窗口的方法是常规的,一般通过菜单栏上的Window菜单在不同文件间切换,或者使用快捷键Ctrl+F6依次切换(打开Window菜单也有快捷键,即Alt+W)。在第一次按了程序运行命令后,Mathematica会启动核心程序Kernel.exe,然后才能从事计算,这需要等上一会儿。在程序运行期间,除了工作区右边的单元括号变了颜色,用户还会在顶部标题栏看到Running...Untitled-1(或文件名)等,表明程序正在运行,此时一般不要再进行其他操作,否则,会影响程序的运行,甚至出现不可预料的后果。如果想终止程序运行,则按命令键“Alt+,”弹出一个对话框,选择Abort就行了。有时候,程序在一个地方终止后,会继续运行下面的部分,那就继续按终止命令键,直到结束,此时顶部的Running...消失,工作区窗口右边的单元括号的颜色恢复到正常编辑状态的颜色。

一些程序在运行期间会产生需要保存的数据,程序将建立相应的文件。关于数据文件的保存和使用,将在以后介绍。1.4 Mathematica的表型数据

下面介绍Mathematica里的数或数据的基本类型,它们是进行计算的基础。

Mathematica里使用的数分为近似数和准确数,凡带有小数点的数都是近似数,又称为实数(Real);其余的数都叫做准确数,包括整数(Integer)、分数(Rational)等。在此基础上还定义了复数(Complex),即形如a+b·i的数,其中a、b是近似或准确的数,i是虚数因子(i2=-1),它在Mathematica中有两种表示法,一种是用大写的字母I表示,另一种方法是输入ESC ii ESC,产生符号。此外,字符串(String)也是一种基本数据。

所有基本数据类型之间可以进行四则运算,运算符也是常规的,即符号+、-、*、/表示加、减、乘、除(其中*可以用空格代替,也可以使用ESC * ESC产生通常的乘法符号×)。乘方的表示有两种方法,一是按Shift+6,产生如2^3的计算机表示;另一种是按Ctrl+6,产生数学的表示,如23。如果表达式比较复杂,要多使用圆括号“()”将不同部分分清楚,不能使用其他括号。

对于本书的计算来说,Mathematica定义的表型数据是非常有用的。所谓表型数据(简称列表或者表,文献上称为List),就是用花括号“{}”括起来的数据,数据之间用逗号分隔,例如

{1,2,-6,2.3}

{{2,1},{-3,2},{10,-1}}

{2.5,{x→1.25}}

其中,第一种表示称为一维的表;第二种用嵌套的花括号表示,称为二维的表;第三种表示就比较复杂了,它不是通常理解的数据,它经常出现在Mathematica函数的输出结果中,不同的部分表示不同的含义,其中第二项可以称为替换型数据。

为了能正确使用表型数据,需要了解其操作规则,包括对表中元素的操作和对“表”的整体操作。表的操作函数将在1.5节介绍,现在介绍经常用到的简单操作表示法。设一维表型数据赋给变量data,“=”就是赋值号,操作如下。

若读者想对其中的元素进行操作,访问的方法是

data[[j]]

其中j只能取1~4的整数,表示元素的序号或位置索引,要用双中括号“[[]]”括起来。读者可以将第二个位置上的元素改换成2,操作方法及运行结果如下。

注意:此操作不是将b改成了2,而是表的第二个位置上的元素改成了2。若读者想在第二个元素的基础上加上2,则按以下操作:将第二个元素先取出,与2相加,再将结果赋给第二个元素,b的值并未改变,程序如下。

同样,如果要使用替换型数据,则只要遵循替换运算的规则即可,演示如下。

以上这段程序用函数Solve[]求解了一个一元二次方程的根,并将结果保存在变量s中,Out[8]显示了这个结果,它有两个根,分别是1和2,但表达的形式却是

这与通常的数学表示是不一样的,从整体来看是一个表,其中有两个元素,都是替换型数据。在接下来的语句中,s中的两个元素分别用来替换两个表达式中的x,得到结果Out[9]和Out[10],其中“/.”是替换运算符,其右边可以使用的表达式有x→1或者{x→1}等,表示替换规则。其中→的输入方法是“-”+“>”,或者ESC -> ESC。

要注意的是:(1)在以上程序中,在写方程

之前,x不能赋值,在求解了方程之后,x也一直没有被赋值。(2)程序中出现了方程的写法,其中特别要注意的是不能用赋值号“=”,而是要用双等号“==”,中间没有空格。

对于二维的表型数据,访问的方法有两种,一种是访问它的某一“行”,另一种是访问它的某个元素。元素好理解,什么是表的“行”呢?Mathematica把二维的表看成了矩阵,例如,表{{a,b},{c,d}},它可以表示成矩阵

据此,把表的第一“层”{a,b}称为第一行,以此类推。当然也可以谈矩阵的列,但Mathematica不常使用这个名字,常用行或层,另外就是“元素”了,例如a、b、c、d都叫元素。要访问行和元素,可以用如下的方式:

程序的第二行将表data的第一层取出,使用data[[1]],然后与2相乘,这就将该层里的所有元素都乘了2,再赋给data第一层,由程序第三行输出,Out[14]显示了这个操作的结果,data已经改变。程序第四行访问的是新的data的第一层第二个元素,使用符号data[[1,2]],然后对它加2并重新赋给这个位置,Out[16]证明了仅对这个位置进行了加2的操作,其他未变。

要记住:访问某行,只要该行的序号;访问某个元素,要用两个序号,第一个序号是行号,第二个序号是列号,中间用逗号分隔。序号必须是自然数。

这里顺便介绍表的两种输出方式,一种是普通的“行形式”,如Out[4]和Out[16]等;另一种是“二维形式”,需要使用函数TableForm[]或MatrixForm[],产生“表型方式”或“矩阵方式”的输出,效果如下。

显示数据用“表型方式”更好。作为一个小技术,读者可以在每列的数据上面加上数据的名称,这样就更容易看懂数据,方法是使用列表的一个操作函数Prepend[],它能在表的第一行前面再加一行。

Out[22]显示,新的数据{"frequency","energy"}的确已经加到data里,它出现在Out[23]的第一行里,其他数据读起来就清楚多了。其中用双引号(" ")括起来的部分叫做字符串,可以是任何字符和符号的组合。1.5 表型数据的操作函数

利用Mathematica进行计算,经常需要对表型数据进行操作,为此,Mathematica内建了许多函数以方便用户进行相关的操作,下面选择其中一部分做简单的介绍。1.5.1 造表函数

这类函数有Range、Table、Array、ConstantArray、IdentityMatrix、DiagonalMatrix和SparseArray,分别介绍如下。

函数Range[]用来制造一些简单的数值列表,其格式是

Range[x1,x2,δx]

它制造了一个以x1为首元素、步长为δx、最大元素不超过x2的列表。

函数Table[]通过循环计算一个表达式fun可以制造一维的、二维的甚至多维的列表,同时,循环的方式也有多种,例如一层循环的格式是

Table[fun(x),{x,x1,x2,δx}]

双层循环的格式是

Table[fun(x,y),{x,x1,x2,δx},{y,y1,y2,δy}]

其中,内层是行循环,外层是列循环,先执行行循环,再执行列循环。

在以上两个函数中,自变量的循环部分可以简化,例如,δx=1时可以省略δx;若x1=1,则x1也可以省略。另外,函数Table[]循环变量的取值也可以是另一个列表list的元素,此时的格式为

Table[fun(x),{x,list}]

以下程序演示了这两个函数的作用。

程序第一行产生了以1~5自然数为元素的一维的表list,见Out[24]。list在程序第二行作为循环变量i的取值空间,顺序取值,然后计算了表达式sin(πi/2),以其为元素制造了一个新的列表,见Out[25]。

函数Array[fun,n]通常用来制造序号连续的变量名或者函数名的列表。

函数ConstantArray[c,{i1,i2}]用来制造一个i1×i2的常数矩阵,矩阵元都是c。

函数DiagonalMatrix[list]是以列表list的元素为对角线元素制造一个其余元素为0的对角矩阵。

函数IdentityMatrix[n]用来制造n阶的单位方阵。

这4个函数的用法见下列程序,其中用到了函数的后缀方式“//”。

程序第一行产生了由三个元素组成的列表,见Out[26];第二行制造了一个3×3的零矩阵,见Out[27];第三行使用了这个表的元素作为对角线元素制造了一个对角矩阵,见Out[28];第四行制造了一个3×3的单位矩阵,见Out[29]。

函数SparseArray[]用来制造稀疏矩阵,这在大型矩阵的运算中经常见到,因为那些矩阵只有少数非零的元素,绝大多数元素为零,如果储存了很多非零的元素,就显得浪费内存和硬盘空间,对提高运算速度不利。经过SparseArray[]制造的稀疏矩阵则只保留非零元素,储存起来就节约很多,不影响矩阵的使用。SparseArray[]保存的是非零规则或者非零元素的位置。以下程序给出稀疏矩阵产生和操作的示例。

程序第二行产生了一个5×5的稀疏矩阵m,其非零元素满足两个条件,要么是在对角线上,其值都是-2;要么是在行与列的差值为1的地方,其值都为1。程序辨认非零元素的依据是SparseArray[]内所设计的模式,例如{i_,i_}→-2表示对角线上元素的替换模式,{i_,j_}→x是一般的替换模式,但是程序中{i_,j_}/;Abs[i-j]==1→1则稍微复杂一些,因为它对一般元素施加了限制条件:i-j的绝对值是1的时候(取绝对值函数是Abs[]),才将位置{i,j}上的元素赋予1。限制条件的表达符号是“/;”。

Out[31]给出了稀疏矩阵的基本信息:有13个非零元素,为5×5矩阵。

Out[32]给出了稀疏矩阵的二维表示,它的主副对角线上有非零元素,其余地方为零。

Out[33]是稀疏矩阵的列表形式,要获得其列表,需要用函数Normal[]。

程序还使用了测试列表长度的函数Length[]和测试列表维度的函数Dimensions[],结果见Out[34]和Out[35]。函数Length[]经常使用。

除了使用函数SparseArray[]制造稀疏矩阵,还可以将已经存在的矩阵list转化为稀疏矩阵,格式是SparseArray[list],这对于保存运算中产生的大型稀疏矩阵非常有利。1.5.2 列表元素的操作函数

这类函数很多,现择要介绍如下。

给列表添加新元素的函数,例如Append[]、AppendTo[]、Prepend[]和PrependTo[],前两者是将新元素添加到列表的末尾,后两者是将新元素添加到列表的开头。这些函数的格式都是一样的,例如

AppendTo[list,x]

要注意这些函数的区别:Append[]和Prepend[]在添加元素后不改变原来的列表,只产生一个新的列表,该列表可以被使用;而AppendTo[]和PrependTo[]则是改变了原来的列表,使列表的长度增加。示例详见如下程序,请读者自己分析这些结果。

插入、删除和提取列表元素的函数,例如Insert[]、Delete[]、Take[]和Drop[]等,其中后三者的格式是相同的,例如

Delete[list,n]

它表示要将列表list的第n个元素删除,得到一个新列表,但并不改变list本身。

Take[list,n]和Drop[list,n]分别表示提取或者丢弃list的前n个元素而得到一个新列表,不改变list本身;若n是负整数,则表示从list的末尾向前数n个元素。

Insert[list,x,n]表示要在列表list的第n个位置上插入元素x而得到一个新列表,list本身不改变。

这4个函数的作用演示如下,其中用到了转置运算符“T”,输入方式为ESC tr ESC。

第一段程序的最后语句演示了如何删除矩阵的一列。第二段程序的最后语句演示了如何往矩阵插入一列。第三段程序演示了如何从列表截取一段组成新的列表。这些函数的其他更复杂的使用格式,请参照帮助系统。

按条件提取列表元素的函数,主要是函数Select[]和Cases[],前者按条件提取一些元素组成新的列表,后者是按模式寻找元素,要么提取出来组成新的列表,要么按模式对这些元素进行某种运算,运算的结果再组成新的列表。这两个函数的格式分别如下。

Select[list,crit]

Cases[list,pattern]

其中,crit是一个判断函数,它依次作用在list的元素上,其结果是逻辑值True或False,若是True则将该元素挑选出来。判断函数有多种方式,系统内建的末尾为Q的所有函数,都可以作为判断函数,只取函数名;或者用户构造纯函数作为判断函数。纯函数是没有函数名也不明显包含自变量的函数,它往往是为临时使用而设计的,其格式为

fun[#]&

其中,#是函数自变量的位置;末尾的&是纯函数的标志,不能忽略。

pattern表示模式。Mathematica构造模式一般要用到下划线“_”。模式系统比较复杂,第2章中会有所介绍,这里略举几例。例如,整数模式为_Integer,非整数模式为Except[_Integer],实数模式为_Real,{_,_}表示只有两个元素的列表模式,h[x_]表示head为h的任何表达式,其中head(头)可以理解为函数名。模式是用来匹配表达式的,只有那些在结构上与模式匹配的元素才能被选中。

以下程序分别演示了这两个函数的用法。

在第一段程序里,判断函数有两种,一种是偶数判断函数EvenQ[],只取了它的名字EvenQ;另一种是纯函数#>2&,它表示列表的元素大于2时判断结果为True,将所有满足条件的元素都挑选出来,如果只挑选一部分,要在判断函数后部添加数字。

在第二段程序里,前两个Cases[]要从list中挑选整数和非整数的元素组成新表;第三个Cases[]要挑选head为f的那些元素,并把这些元素替换为f作用的对象,再组成新表;最后一个Cases[]挑选包含两个元素的列表元素,并对两个元素求和(用函数Total[]),用求和结果作为新列表的元素。

合并列表的函数,例如函数Join[]和Union[],前者简单地将几个表的元素按顺序合并为一个表,后者则要将几个表中相同的元素删除只保留一个,再合并为新表。使用函数Join[]可以为矩阵添加一行或者一列,也可以将一个矩阵附加到另一个矩阵的右边或者底部,以扩展矩阵的行和列的长度。见以下演示程序。

程序中第二和第四个Join[]使用了“层”的概念,末尾的2表示合并是在第二“层”进行的。第一“层”是指{a,b}和{1,2}等元素的层,合并结果是{{a,b},{1,2}};第二“层”是指a,b,1,2这些元素所在的层次,合并结果是{a,b,1,2}。以此类推。1.5.3 列表的整体操作函数

这类函数也有多个,例如矩阵转置函数Transpose[],矩阵求逆函数Inverse[],矩阵“压平”函数Flatten[],列表分节函数Partition[],列表排序函数Sort[],将函数作用在列表元素上的函数Map[],等等。其中,Map[]可以使用前缀方式/@,它通常用在非数值运算场合,例如数据绘图。以下两种方式是等价的:

Map[fun,expr]或者fun/@expr

其中,fun是函数名,可为纯函数;expr是表达式,一般是列表。以下是演示程序。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载