LINDO和LINGO数学建模软件使用文档

更新时间:2024-04-22 00:40:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

六、数学软件

代码中国网 http://www.codechina.net http://www.chinatom.net

1.LINDO、LINGO

http://www.lindo.com/ 一、 软件简介

LINDO是一种专门用于求解数学规划问题的软件包。由于LINDO执行速度很快、易于方便输入、求解和分析数学规划问题。因此在数学、科研和工业界得到广泛应用。LINDO主要用于解线性规划、非线性规划、二次规划和整数规划等问题。也可以用于一些非线性和线性方程组的求解以及代数方程求根等。LINDO中包含了一种建模语言和许多常用的数学函数(包括大量概论函数),可供使用者建立规划问题时调用。

一般用LINDO(Linear Interactive and Discrete Optimizer)解决线性规划(LP—Linear Programming)。整数规划(IP—Integer Programming)问题。其中LINDO 6 .1 学生版至多可求解多达300个变量和150个约束的规划问题。其正式版(标准版)则可求解的变量和约束在1量级以上。

LINDO则用于求解非线性规划(NLP—NON—LINEAR PROGRAMMING)和二次规则(QP—QUARATIC PROGRAMING)其中LINGO 6.0学生版最多可版最多达300个变量和150个约束的规则问题,其标准版的求解能力亦再10^4量级以上。虽然LINDO和LINGO不能直接求解目标规划问题,但用序贯式算法可分解成一个个LINDO和LINGO能解决的规划问题。

要学好用这两个软件最好的办法就是学习他们自带的HELP文件。

下面拟举数例以说明这两个软件的最基本用法。(例子均选自张莹《运筹学基础》) 例1.(选自《运筹学基础》P54.汽油混合问题,线性规划问题)

一种汽油的特性可用两个指标描述:其点火性用“辛烷数”描述,其挥发性用“蒸汽压力”描述。某炼油厂有四种标准汽油,设其标号分别为1,2,3,4,其特性及库存量列于下表1中,将上述标准汽油适量混合,可得两种飞机汽油,某标号为1,2,这两种飞机汽油的性能指标及产量需求列于表2中。

问应如何根据库存情况适量混合各种标准汽油,使既满足飞机汽油的性能指标,而产量又为最高。

表1

标准汽油 1 2 3 4 辛烷数 107.5 93.0 87.0 108.0 蒸汽压力(g/cm^2) 7.11*10^(-2) 11.38*10^(-2) 5.69*10^(-2) 28.45*10^(-2) 库存量 380000 262200 408100 130100 (1 g/cm^2=98Pa)

表2

飞机汽油 1 2 辛烷数 >=91 >=100 蒸汽压力(g/cm^2) 产量需求(L) <=9.96*10越多越好 ^(-2) <=9.96*10>=250000 ^(-2) 建模过程 略(详见《运筹学基础》P54—55) 目标函数:max z=x1+x2+x3+x4 约束条件:x5+x6+x7+x8>=250000 x1+x5<=380000 x2+x6<=265200 x3+x7<=408100 x4+x8<=130100

2.85x1-1.42x2+4.27x3-18.49x4>=0 2.85x5-1.42x6+4.27x7-18.49x8>=0 16.5x1+2.0x2-4.0x3+17x4>=0 7.5x5-7.0x6-13.0x7+8.0x8>=0 xj>=0(j=1,2...,8)

下面我们就用LINDO来解这一优化问题。 输入语句:

max(不区分大小写) x1+x2+x3+x4 ST(大写或写subject to) x5+x6+x7+x8>=250000 x1+x5<=380000 x2+x6<=265200 x3+x7<=408100 x4+x8<=130100

2.85x1-1.42x2+4.27x3-18.49x4>=0 2.85x5-1.42x6+4.27x7-18.49x8>=0 16.5x1+2.0x2-4.0x3+17x4>=0 7.5x5-7.0x6-13.0x7+8.0x8>=0 end

然后再按运算符键即可得结果。

LINDO是规定Xj非负的,我们可发现输入方式与我们的数学书写的形式基本一致,运算后,计算机会问您是否需要灵敏度分析,我们选择是,结果如下: LP OPTIMUM FOUND AT STEP 6 OBJECTIVE FUNCTION VALUE 1) 933400.0

VARIABLE VALUE REDUCED COST X1 161351.734375 0.000000 X2 265200.000000 0.000000 X3 408100.000000 0.000000 X4 98748.265625 0.000000 X5 218648.265625 0.000000

X6 0.000000 0.000000 X7 0.000000 0.000000 X8 31351.734375 0.000000 ROW SLACK OR SURPLUS DUAL PRICES 2) 0.000000 -1.000000 3) 0.000000 1.000000 4) 0.000000 1.000000 5) 0.000000 1.000000 6) 0.000000 1.000000 7) 0.000000 0.000000 8) 43454.000000 0.000000 9) 3239024.250000 0.000000 10) 1890675.875000 0.000000 NO. ITERATIONS= 6

RANGES IN WHICH THE BASIS IS UNCHANGED:

OBJ COEFFICIENT RANGES

VARIABLE CURRENT ALLOWABLE ALLOWABLE COEF INCREASE DECREASE X1 1.000000 0.000000 1.154137 X2 1.000000 INFINITY 0.000000 X3 1.000000 INFINITY 0.000000 X4 1.000000 0.000000 0.000000 X5 0.000000 1.154137 0.000000 X6 0.000000 0.000000 INFINITY

X7 0.000000 0.000000 INFINITY X8 0.000000 0.000000 0.000000 RIGHTHAND SIDE RANGES

ROW CURRENT ALLOWABLE ALLOWABLE RHS INCREASE DECREASE 2 250000.000000 186222.062500 234752.984375 3 380000.000000 234752.984375 15247.017578 4 265200.000000 30601.410156 265200.000000 5 408100.000000 156685.250000 10176.581055 6 130100.000000 2350.135254 36184.207031 7 0.000000 43454.000000 669046.000000 8 0.000000 43454.000000 INFINITY 9 0.000000 3239024.250000 INFINITY 10 0.000000 1890675.875000 INFINITY 下面给出其结果的一般解释:

“LP OPTIMUM FOUND AT STEP 6”表示LINDO在(用单纯形法)6次迭代或旋转后得到最优解。

“OBJECTIVE FUNCTION VALUE 1)933400.0”表示最优目标值为933400。 “VALUE”给出最优解中各变量的值。

“SLACK OR SURPLUS”给出松弛变量的值。上例中SLK 2= 第二行松弛变量=0(模型第一行表示目标函数,所以第二行对应第一个约束)

“REDUCE COST”列出最优单纯形表中判别数所在行的变量的系数,表示当变量有微小变动时,目标函数的变化率,其中基变量的reduce cost 值应为0,对于非基变量Xj相应的reduce cost值表示Xj增加一个单位(此时假定其他非基变量保持不变)时目标函数减小的量(max 型问题)。上例中:X1 对应的 reduce cost 值为0,表示当X1=1 时,目标函数值不变。

“DUAL PRICE”(对偶价格)列出最优单纯形表中判别数所在行的松弛变量的系数,表示当对应约束有微小变动时,目标函数的变化率,输出结果中对应每一个约束有一个对偶价格。若其数值为X,表示对应约束中不等式右端项若增加一个单位,目标函数将增加X个单位(max 型问题)。上例中:第二行对应的对偶价格值应为-1表示当约束 2)X5 + X6 + X7 + X8>250000变为 2)X5 + X6 + X7 + X8>250001时,

目标函数值=933400-1=933399

当REDUCE COST 或DUAL PRICE 的值为0。表示当微小扰动不影响目标函数。有时,通过分析DUAL PRICE,也可对产生不可行问题的原因有所了解。 灵敏度分析:如果做敏感性分析,则系统报告当目标函数的费用系数和约束右端项在什么范围变化(此时假定其他系数保持不变)时,最优基保持不变。报告中INFINITY表示正无穷,如上例:目标函数中X1的变量系数为1,当它在[1-1.154137,1-0]=

[-0.154137,1] 变化时,最优基保持不变 。

第一个约束右端项为250000,当它在

[250000-234752.984375,250000+186222.0625]=[15247.015625,436222.0625] 范围变化时,最优基保持不变 。

当您要判断表达式输入是否有错误时,也可以使用菜单“Reports“的”Picture“选项。

若想获得灵敏度分析,可用“Reports“的”Rang“选项。 若需显示单纯形表,可执行“Reports“的”Tab lean“选项。 注意事项:

1) 目标函数及各约束条件之间一定要有“Subject to (ST) ”分开。 2) 变量名不能超过8个字符。

3) 变量与其系数间可以有空格,单不能有任何运算符号(如乘号“*”等)。 4) 要输入<=或>=约束,相应以<或>代替即可。

5) 一般LINDO中不能接受括号“()“和逗号“,“,例:400(X1+X2) 需写成400X1+400X2;10,000需写成10000。

6) 表达式应当已经过简化。不能出现 2 X1+3 X2-4 X1,而应写成-2X1+3 X2。 例2.(选自《运》P94习题2.4;整数规则)

有四个工人,要分别指派他们完成四项不同的工作,每个人做各项工作所消耗的时间如表。问应该如何指派,才能使总的消耗时间为最小?

A 工作 所耗 时间 工人 甲 乙 丙 丁 15 19 26 19 B C D 18 23 17 21 21 22 16 23 24 18 19 17 这是一道典型的整数规则问题。 我们记派第I去做工作记为Xij

注意到每人只能做一项工作。每项工作一人做。我们得到目标函数为约束条件: min

15x11+19x21+26x31+19x41+18x12+23x22+17x32+21x42+24x13+22x23+16x33+23x43+24x14+18x24+19x34+17x44 ST

x11+x12+x13+x14=1 x21+x22+x23+x24=1 x31+x32+x33+x34=1 x41+x42+x43+x44=1 x11+x21+x31+x41=1 x12+x22+x32+x42=1 x13+x23+x33+x43=1 x14+x24+x34+x44=1 end

int 16

运行后我们可得到最优目标值为70

当 ,其余为0时。(具体的Reports 我们略去)

在用LINDO解整数规划(IP)问题时,只要在END后加上标识即可,其中解0/1规划的用命令。

INT name 或 INT n (n 指前n 个变量标识为0/1型)解混合型整数规划则用GIN来标识。

LINDO解整数规划对变量的限制为50个。(指LINDO 6.1学生版)。所以说,尽管LINDO对整数规划问题是很有威力。要有效地使用还是需要一定技术的。这是因为,人们很容易将一个本质上很简单的问题列成一个输入模型。从而有可能会导致一个冗长的分支定界计算。 例3 用LINDO解目标规划

由于LINDO不能直接求解目标规划问题,这是否就意味着LINDO失去了效力呢?不是的。

由求解目标规划问题的有效算法——序贯式算法可知其实目标规划我们常采取分解成前面二种办法而已。

例如算:min a=((d1_+d1),(2d2+d3)) G1:x1-10x2+d1_-d1=50 G2:3x1+5x2+d2_-d2=20 G3:8x1+6x2+d3_-d3=100 xi(i=1,2),dj_,dj(j=1,2,3)>=0 先求目标函数的最优值 min d1_+d1 ST

x1-10x2+d1_-d1=50 3x1+5x2+d2_-d2=20 end

求得D1_+D1 的最优值为0 然后再求 min 2d2+d3 ST

x1-10x2+d1_-d1=50 3x1+5x2+d2_-d2=20 8x1+6x2+d3_-d3=100 d1_+d1=0 end

即可算得第二级最优值2d2+d3

例4 LINDO虽亦可求解二次规划问题。(但我认为它在输入对不如用LINGO方便,用LINDO输入时要先作偏导数计算不如LINGO哪样可直接输入。(选自《运筹学基础》P190.习题4.10 min f(x)=(x1-1)^2+(x2-2)^2 x2-x1=1 x1+x2<=2 x1>=0,x2>=0

先来说一说如何使用LINGO

一般来说LINGO多用于解决大规模数学规划。 用时要注意以下几点:

(1) 每条语句后必须使用分号“;”结束。问题模型必须由MODEL命令开始,END结束。

(2) 用MODEL命令来作为输入问题模型的开始,格式为MODEL:statement (语句)。

(3) 目标函数必须由“min =”或“max =”开头。 则上面的例子的输入就为

modul:

min=(x1-1)^2+(x2-2)^2; x2-1=1; x1+x2<=2; end

我们即可得到最优值0.5。当X1=0.5,X2=1.5,及灵敏度分析。我们还可得作图分析。

对于大规模规划求解请参见LINGO的HELP文件。

二.Matlab

三.Mathematica 四.统计软件SAS

五.运筹学软件及教程 (LINDO,LINGO)

MATLAB简介

http://www.mathworks.com/

1. MATLAB的概况

MATLAB是矩阵实验室(Matrix Laboratory)之意。除具备卓越的数值计算能力外,它还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能。 MATLAB的基本数据单位是矩阵,它的指令表达式与数学,工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完相同的事情简捷得多. 当前流行的MATLAB 5.3/Simulink 3.0包括拥有数百个内部函数的主包和三十几种工具包(Toolbox).工具包又可以分为功能性工具包和学科工具包.功能工具包用来扩充MATLAB的符号计算,可视化建模仿真,文字处理及实时控制等功能.学科工具包是专业性比较强的工具包,控制工具包,信号处理工具包,通信工具包等都属于此类.

开放性使MATLAB广受用户欢迎.除内部函数外,所有MATLAB主包文件和各种工具包都是可读可修改的文件,用户通过对源程序的修改或加入自己编写程序构造新的专用工具包.

2. MATLAB产生的历史背景

在70年代中期,Cleve Moler博士和其同事在美国国家科学基金的资助下开发了调用EISPACK和LINPACK的FORTRAN子程序库.EISPACK是特征值求解的FOETRAN程序

库,LINPACK是解线性方程的程序库.在当时,这两个程序库代表矩阵运算的最高水平. 到70年代后期,身为美国New Mexico大学计算机系系主任的Cleve Moler,在给学生讲授线性代数课程时,想教学生使用EISPACK和LINPACK程序库,但他发现学生用FORTRAN编写接口程序很费时间,于是他开始自己动手,利用业余时间为学生编写EISPACK和LINPACK的接口程序.Cleve Moler给这个接口程序取名为MATLAB,该名为矩阵(matrix)和实验室(labotatory)两个英文单词的前三个字母的组合.在以后的数年里,MATLAB在多所大学里作为教学辅助软件使用,并作为面向大众的免费软件广为流传.

1983年春天,Cleve Moler到Standford大学讲学,MATLAB深深地吸引了工程师John Little.John Little敏锐地觉察到MATLAB在工程领域的广阔前景.同年,他和Cleve Moler,Steve Bangert一起,用C语言开发了第二代专业版.这一代的MATLAB语言同时具备了数值计算和数据图示化的功能.

1984年,Cleve Moler和John Little成立了Math Works公司,正式把MATLAB推向市场,并继续进行MATLAB的研究和开发.

在当今30多个数学类科技应用软件中,就软件数学处理的原始内核而言,可分为两大类.一类是数值计算型软件,如MATLAB,Xmath,Gauss等,这类软件长于数值计算,对处理大批数据效率高;另一类是数学分析型软件,Mathematica,Maple等,这类软件以符号计算见长,能给出解析解和任意精确解,其缺点是处理大量数据时效率较低.MathWorks公司顺应多功能需求之潮流,在其卓越数值计算和图示能力的基础上,又率先在专业水平上开拓了其符号计算,文字处理,可视化建模和实时控制能力,开发了适合多学科,多部门要求的新一代科技应用软件MATLAB.经过多年的国际竞争,MATLAB以经占据了数值软件市场的主导地位.

在MATLAB进入市场前,国际上的许多软件包都是直接以FORTRANC语言等编程语言开发的。这种软件的缺点是使用面窄,接口简陋,程序结构不开放以及没有标准的基库,很难适应各学科的最新发展,因而很难推广。MATLAB的出现,为各国科学家开发学科软件提供了新的基础。在MATLAB问世不久的80年代中期,原先控制领域里的一些软件包纷纷被淘汰或在MATLAB上重建。

MathWorks公司1993年推出了MATLAB 4。0版,1995年推出4。2C版(for win3。X)1997年推出5。0版。1999年推出5。3版。MATLAB 5。X较MATLAB 4。X无论是界面还是内容都有长足的进展,其帮助信息采用超文本格式和PDF格式,在Netscape 3。0或IE 4。0及以上版本,Acrobat Reader中可以方便地浏览。

时至今日,经过MathWorks公司的不断完善,MATLAB已经发展成为适合多学科,多种工作平台的功能强大大大型软件。在国外,MATLAB已经经受了多年考验。在欧美等高校,MATLAB已经成为线性代数,自动控制理论,数理统计,数字信号处理,时间序列分析,动态系统仿真等高级课程的基本教学工具;成为攻读学位的大学生,硕士生,博士生必须掌握的基本技能。在设计研究单位和工业部门,MATLAB被广泛用于科学研究和解决各种具体问题。在国内,特别是工程界,MATLAB一定会盛行起来。可以说,无论你从事工程方面的哪个学科,都能在MATLAB里找到合适的功能。

2.MATLAB的语言特点

一种语言之所以能如此迅速地普及,显示出如此旺盛的生命力,是由于它有着不同于其他语言的特点,正如同FORTRAN和C等高级语言使人们摆脱了需要直接对计算机硬件资源进行操作一样,被称作为第四代计算机语言的MATLAB,利用其丰富的函数资源,使

编程人员从繁琐的程序代码中解放出来。MATLAB最突出的特点就是简洁。MATLAB用更直观的,符合人们思维习惯的代码,代替了C和 FORTRAN语言的冗长代码。MATLAB给用户带来的是最直观,最简洁的程序开发环境。以下简单介绍一下MATLAB的主要特点。 1)。语言简洁紧凑,使用方便灵活,库函数极其丰富。MATLAB程序书写形式自由,利用起丰富的库函数避开繁杂的子程序编程任务,压缩了一切不必要的编程工作。由于库函数都由本领域的专家编写,用户不必担心函数的可靠性。可以说,用MATLAB进行科技开发是站在专家的肩膀上。

具有FORTRAN和C等高级语言知识的读者可能已经注意到,如果用FORTRAN或C语言去编写程序,尤其当涉及矩阵运算和画图时,编程会很麻烦。例如,如果用户想求解一个线性代数方程,就得编写一个程序块读入数据,然后再使用一种求解线性方程的算法(例如追赶法)编写一个程序块来求解方程,最后再输出计算结果。在求解过程中,最麻烦的要算第二部分。解线性方程的麻烦在于要对矩阵的元素作循环,选择稳定的算法以及代码的调试动不容易。即使有部分源代码,用户也会感到麻烦,且不能保证运算的稳定性。解线性方程的程序用FORTRAN和C这样的高级语言编写,至少需要四百多行,调试这种几百行的计算程序可以说很困难。以下用MATLAB编写以上两个小程序的具体过程。

MATLAB求解下列方程,并求解矩阵A的特征值。 Ax=b,其中:

A= 32 13 45 67 23 79 85 12 43 23 54 65 98 34 71 35 b= 1 2 3 4

解为:x=A\\b;设A的特征值组成的向量e,e=eig(A)。

可见,MATLAB的程序极其简短。更为难能可贵的是,MATLAB甚至具有一定的智能水平,比如上面的解方程,MATLAB会根据矩阵的特性选择方程的求解方法,所以用户根本不用怀疑MATLAB的准确性。

2)运算符丰富。由于MATLAB是用C语言编写的,MATLAB提供了和C语言几乎一样多的运算符,灵活使用MATLAB的运算符将使程序变得极为简短。

3)MATLAB既具有结构化的控制语句(如for循环,while循环,break语句和if语句),又有面向对象编程的特性。

4)程序限制不严格,程序设计自由度大。例如,在MATLAB里,用户无需对矩阵预

定义就可使用。

5)程序的可移植性很好,基本上不做修改就可以在各种型号的计算机和操作系统上运行。

6)MATLAB的图形功能强大。在FORTRAN和C语言里,绘图都很不容易,但在MATLAB里,数据的可视化非常简单。MATLAB还具有较强的编辑图形界面的能力。 7)MATLAB的缺点是,它和其他高级程序相比,程序的执行速度较慢。由于MATLAB的程序不用编译等预处理,也不生成可执行文件,程序为解释执行,所以速度较慢。 8)功能强大的工具箱是MATLAB的另一特色。MATLAB包含两个部分:核心部分和各种可选的工具箱。核心部分中有数百个核心内部函数。其工具箱又分为两类:功能性工具箱和学科性工具箱。功能性工具箱主要用来扩充其符号计算功能,图示建模仿真功能,文字处理功能以及与硬件实时交互功能。功能性工具箱用于多种学科。而学科性工具箱是专业性比较强的,如control,toolbox,signl proceessing toolbox,commumnication toolbox等。这些工具箱都是由该领域内学术水平很高的专家编写的,所以用户无需编写自己学科范围内的基础程序,而直接进行高,精,尖的研究。

9)源程序的开放性。开放性也许是MATLAB最受人们欢迎的特点。除内部函数以外,所有MATLAB的核心文件和工具箱文件都是可读可改的源文件,用户可通过对源文件的修改以及加入自己的文件构成新的工具箱。

MATLAB入门教程

1.MATLAB的基本知识

1-1、基本运算与函数

在MATLAB下进行基本数学运算,只需将运算式直接打入提示号(>>)之後,并按入Enter键即可。例如: >> (5*2+1.3-0.8)*10/25 ans =4.2000

MATLAB会将运算结果直接存入一变数ans,代表MATLAB运算後的答案(Answer)并显示其数值於萤幕上。

小提示: \是MATLAB的提示符号(Prompt),但在PC中文视窗系统下,由於编码方式不同,此提示符号常会消失不见,但这并不会影响到MATLAB的运算结果。 我们也可将上述运算式的结果设定给另一个变数x: x = (5*2+1.3-0.8)*10^2/25 x = 42

此时MATLAB会直接显示x的值。由上例可知,MATLAB认识所有一般常用到的加(+)、

减(-)、乘(*)、除(/)的数学运算符号,以及幂次运算(^)。

小提示: MATLAB将所有变数均存成double的形式,所以不需经过变数宣告(Variable declaration)。MATLAB同时也会自动进行记忆体的使用和回收,而不必像C语言,必须由使用者一一指定.这些功能使的MATLAB易学易用,使用者可专心致力於撰写程式,而不必被软体枝节问题所干扰。

若不想让MATLAB每次都显示运算结果,只需在运算式最後加上分号(;)即可,如下例: y = sin(10)*exp(-0.3*4^2);

若要显示变数y的值,直接键入y即可: >>y y =-0.0045

在上例中,sin是正弦函数,exp是指数函数,这些都是MATLAB常用到的数学函数。 下表即为MATLAB常用的基本数学函数及三角函数: 小整理:MATLAB常用的基本数学函数 abs(x):纯量的绝对值或向量的长度 angle(z):复 数z的相角(Phase angle) sqrt(x):开平方 real(z):复数z的实部 imag(z):复数z的虚 部 conj(z):复数z的共轭复数 round(x):四舍五入至最近整数 fix(x):无论正负,舍去小数至最近整数 floor(x):地板函数,即舍去正小数至最近整数 ceil(x):天花板函数,即加入正小数至最近整数 rat(x):将实数x化为分数表示 rats(x):将实数x化为多项分数展开 sign(x):符号函数 (Signum function)。 当x<0时,sign(x)=-1;

当x=0时,sign(x)=0; 当x>0时,sign(x)=1。

> 小整理:MATLAB常用的三角函数 sin(x):正弦函数 cos(x):馀弦函数 tan(x):正切函数 asin(x):反正弦函数 acos(x):反馀弦函数 atan(x):反正切函数

atan2(x,y):四象限的反正切函数 sinh(x):超越正弦函数 cosh(x):超越馀弦函数 tanh(x):超越正切函数 asinh(x):反超越正弦函数 acosh(x):反超越馀弦函数 atanh(x):反超越正切函数

变数也可用来存放向量或矩阵,并进行各种运算,如下例的列向量(Row vector)运算: x = [1 3 5 2]; y = 2*x+1 y = 3 7 11 5

小提示:变数命名的规则

1.第一个字母必须是英文字母 2.字母间不可留空格 3.最多只能有19个字母,MATLAB会忽略多馀字母

我们可以随意更改、增加或删除向量的元素: y(3) = 2 % 更改第三个元素 y =3 7 2 5

y(6) = 10 % 加入第六个元素 y = 3 7 2 5 0 10

y(4) = [] % 删除第四个元素, y = 3 7 2 0 10

在上例中,MATLAB会忽略所有在百分比符号(%)之後的文字,因此百分比之後的文字均可视为程式的注解(Comments)。MATLAB亦可取出向量的一个元素或一部份来做运算: x(2)*3+y(4) % 取出x的第二个元素和y的第四个元素来做运算 ans = 9

y(2:4)-1 % 取出y的第二至第四个元素来做运算 ans = 6 1 -1

在上例中,2:4代表一个由2、3、4组成的向量

若对MATLAB函数用法有疑问,可随时使用help来寻求线上支援(on-line help):help linspace 小整理:MATLAB的查询命令

help:用来查询已知命令的用法。例如已知inv是用来计算反矩阵,键入help inv即可得知有关inv命令的用法。(键入help help则显示help的用法,请试看看!) lookfor:用来寻找未知的命令。例如要寻找计算反矩阵的命令,可键入 lookfor inverse,MATLAB即会列出所有和关键字inverse相关的指令。找到所需的命令後 ,即可用help进一步找出其用法。(lookfor事实上是对所有在搜寻路径下的M档案进行关键字对第一注解行的比对,详见後叙。) 将列向量转置(Transpose)後,即可得到行向量(Column vector): z = x' z = 4.0000 5.2000 6.4000 7.6000 8.8000 10.0000

不论是行向量或列向量,我们均可用相同的函数找出其元素个数、最大值、最小值等:

length(z) % z的元素个数 ans = 6

max(z) % z的最大值 ans = 10

min(z) % z的最小值 ans = 4

小整理:适用於向量的常用函数有: min(x): 向量x的元素的最小值 max(x): 向量x的元素的最大值 mean(x): 向量x的元素的平均值 median(x): 向量x的元素的中位数 std(x): 向量x的元素的标准差 diff(x): 向量x的相邻元素的差

sort(x): 对向量x的元素进行排序(Sorting) length(x): 向量x的元素个数

norm(x): 向量x的欧氏(Euclidean)长度 sum(x): 向量x的元素总和 prod(x): 向量x的元素总乘积 cumsum(x): 向量x的累计元素总和 cumprod(x): 向量x的累计元素总乘积 dot(x, y): 向量x和y的内 积

cross(x, y): 向量x和y的外积 (大部份的向量函数也可适用於矩阵,详见下述。)

若要输入矩阵,则必须在每一列结尾加上分号(;),如下例: A = [1 2 3 4; 5 6 7 8; 9 10 11 12];

A = 1 2 3 4 5 6 7 8 9 10 11 12

同样地,我们可以对矩阵进行各种处理: A(2,3) = 5 % 改变位於第二列,第三行的元素值 A = 1 2 3 4 5 6 5 8 9 10 11 12

B = A(2,1:3) % 取出部份矩阵B B = 5 6 5

A = [A B'] % 将B转置後以行向量并入A A =

1 2 3 4 5 5 6 5 8 6 9 10 11 12 5

A(:, 2) = [] % 删除第二行(:代表所有列) A = 1 3 4 5 5 5 8 6 9 11 12 5

A = [A; 4 3 2 1] % 加入第四列 A =

1 3 4 5 5 5 8 6

9 11 12 5 4 3 2 1

A([1 4], :) = [] % 删除第一和第四列(:代表所有行) A =

5 5 8 6 9 11 12 5

这几种矩阵处理的方式可以相互叠代运用,产生各种意想不到的效果,就看各位的巧思和创意。

小提示:在MATLAB的内部资料结构中,每一个矩阵都是一个以行为主(Column-oriented )的阵列(Array)因此对於矩阵元素的存取,我们可用一维或二维的索引(Index)来定址。举例来说,在上述矩阵A中,位於第二列、第三行的元素可写为A(2,3) (二维索引)或A(6)(一维索引,即将所有直行进行堆叠後的第六个元素)。 此外,若要重新安排矩阵的形状,可用reshape命令: B = reshape(A, 4, 2) % 4是新矩阵的列数,2是新矩阵的行数 B = 5 8 9 12 5 6 11 5

小提示: A(:)就是将矩阵A每一列堆叠起来,成为一个行向量,而这也是MATLAB变数的内部储存方式。以前例而言,reshape(A, 8, 1)和A(:)同样都会产生一个8x1的矩阵。 MATLAB可在同时执行数个命令,只要以逗号或分号将命令隔开: x = sin(pi/3); y = x^2; z = y*10, z = 7.5000

若一个数学运算是太长,可用三个句点将其延伸到下一行: z = 10*sin(pi/3)* ... sin(pi/3);

若要检视现存於工作空间(Workspace)的变数,可键入who:

who

Your variables are: testfile x

这些是由使用者定义的变数。若要知道这些变数的详细资料,可键入: whos

Name Size Bytes Class A 2x4 64 double array B 4x2 64 double array ans 1x1 8 double array x 1x1 8 double array y 1x1 8 double array z 1x1 8 double array

Grand total is 20 elements using 160 bytes 使用clear可以删除工作空间的变数: clear A A

??? Undefined function or variable 'A'.

另外MATLAB有些永久常数(Permanent constants),虽然在工作空间中看不 到,但使用者可直接取用,例如: pi

ans = 3.1416

下表即为MATLAB常用到的永久常数。 小整理:MATLAB的永久常数 i或j:基本虚数单位 eps:系统的浮点(Floating-point)精确度

inf:无限大, 例如1/0 nan或NaN:非数值(Not a number) ,例如0/0 pi:圆周率 p(= 3.1415926...) realmax:系统所能表示的最大数值

realmin:系统所能表示的最小数值 nargin: 函数的输入引数个数 nargin: 函数的输出引数个数 1-2、重复命令

最简单的重复命令是for圈(for-loop),其基本形式为: for 变数 = 矩阵; 运算式; end

其中变数的值会被依次设定为矩阵的每一行,来执行介於for和end之间的运算式。因此,若无意外情况,运算式执行的次数会等於矩阵的行数。

举例来说,下列命令会产生一个长度为6的调和数列(Harmonic sequence): x = zeros(1,6); % x是一个16的零矩阵 for i = 1:6, x(i) = 1/i; end

在上例中,矩阵x最初是一个16的零矩阵,在for圈中,变数i的值依次是1到6,因此矩阵x的第i个元素的值依次被设为1/i。我们可用分数来显示此数列: format rat % 使用分数来表示数值 disp(x)

1 1/2 1/3 1/4 1/5 1/6

for圈可以是多层的,下例产生一个16的Hilbert矩阵h,其中为於第i列、第j行的元素为 h = zeros(6); for i = 1:6, for j = 1:6, h(i,j) = 1/(i+j-1); end end

disp(h)

1 1/2 1/3 1/4 1/5 1/6 1/2 1/3 1/4 1/5 1/6 1/7 1/3 1/4 1/5 1/6 1/7 1/8 1/4 1/5 1/6 1/7 1/8 1/9 1/5 1/6 1/7 1/8 1/9 1/10 1/6 1/7 1/8 1/9 1/10 1/11

小提示:预先配置矩阵 在上面的例子,我们使用zeros来预先配置(Allocate)了一个适当大小的矩阵。若不预先配置矩阵,程式仍可执行,但此时MATLAB需要动态地增加(或减小)矩阵的大小,因而降低程式的执行效率。所以在使用一个矩阵时,若能在事前知道其大小,则最好先使用zeros或ones等命令来预先配置所需的记忆体(即矩阵)大小。

在下例中,for圈列出先前产生的Hilbert矩阵的每一行的平方和: for i = h,

disp(norm(i)^2); % 印出每一行的平方和 end

1299/871 282/551 650/2343 524/2933 559/4431 831/8801

在上例中,每一次i的值就是矩阵h的一行,所以写出来的命令特别简洁。 令一个常用到的重复命令是while圈,其基本形式为: while 条件式; 运算式; end

也就是说,只要条件示成立,运算式就会一再被执行。例如先前产生调和数列的例子,我们可用while圈改写如下:

x = zeros(1,6); % x是一个16的零矩阵 i = 1; while i <= 6, x(i) = 1/i; i = i+1; end format short

1-3、逻辑命令

最简单的逻辑命令是if, ..., end,其基本形式为: if 条件式; 运算式; end

if rand(1,1) > 0.5,

disp('Given random number is greater than 0.5.'); end

Given random number is greater than 0.5.

1-4、集合多个命令於一个M档案

若要一次执行大量的MATLAB命令,可将这些命令存放於一个副档名为m的档案,并在 MATLAB提示号下键入此档案的主档名即可。此种包含MATLAB命令的档案都以m为副档名,因此通称M档案(M-files)。例如一个名为test.m的M档案,包含一连串的MATLAB命令,那麽只要直接键入test,即可执行其所包含的命令: pwd % 显示现在的目录 ans =

D:\\MATLAB5\\bin

cd c:\\data\\mlbook % 进入test.m所在的目录 type test.m % 显示test.m的内容 % This is my first test M-file. % Roger Jang, March 3, 1997 fprintf('Start of test.m!\\n'); for i = 1:3,

fprintf('i = %d ---> i^3 = %d\\n', i, i^3); end

fprintf('End of test.m!\\n'); test % 执行test.m Start of test.m! i = 1 ---> i^3 = 1 i = 2 ---> i^3 = 8 i = 3 ---> i^3 = 27 End of test.m!

小提示:第一注解行(H1 help line) test.m的前两行是注解,可以使程式易於了解与管理。特别要说明的是,第一注解行通常用来简短说明此M档案的功能,以便lookfor能以关键字比对的方式来找出此M档案。举例来说,test.m的第一注解行包含test这个字,因此如果键入lookfor test,MATLAB即可列出所有在第一注解行包含test的M档案,因而test.m也会被列名在内。

严格来说,M档案可再细分为命令集(Scripts)及函数(Functions)。前述的test.m即为命令集,其效用和将命令逐一输入完全一样,因此若在命令集可以直接使用工作空间的变数,而且在命令集中设定的变数,也都在工作空间中看得到。函数则需要用到输入引数(Input arguments)和输出引数(Output arguments)来传递资讯,这就像是C语言的函数,或是FORTRAN语言的副程序(Subroutines)。举例来说,若要计算一个正整数的阶乘 (Factorial),我们可以写一个如下的MATLAB函数并将之存档於fact.m: function output = fact(n)

% FACT Calculate factorial of a given positive integer. output = 1; for i = 1:n, output = output*i;

end

其中fact是函数名,n是输入引数,output是输出引数,而i则是此函数用到的暂时变数。要使用此函数,直接键入函数名及适当输入引数值即可: y = fact(5) y = 120

(当然,在执行fact之前,你必须先进入fact.m所在的目录。)在执行fact(5)时, MATLAB会跳入一个下层的暂时工作空间(Temperary workspace),将变数n的值设定为5,然後进行各项函数的内部运算,所有内部运算所产生的变数(包含输入引数n、暂时变数i,以及输出引数output)都存在此暂时工作空间中。运算完毕後,MATLAB会将最後输出引数output的值设定给上层的变数y,并将清除此暂时工作空间及其所含的所有变数。换句话说,在呼叫函数时,你只能经由输入引数来控制函数的输入,经由输出引数来得到函数的输出,但所有的暂时变数都会随着函数的结束而消失,你并无法得到它们的值。

小提示:有关阶乘函数 前面(及後面)用到的阶乘函数只是纯粹用来说明MATLAB的函数观念。若实际要计算一个正整数n的阶乘(即n!)时,可直接写成prod(1:n),或是直接呼叫gamma函数:gamma(n-1)。

MATLAB的函数也可以是递式的(Recursive),也就是说,一个函数可以呼叫它本身。 举例来说,n! = n*(n-1)!,因此前面的阶乘函数可以改成递式的写法: function output = fact(n)

% FACT Calculate factorial of a given positive integer recursively. if n == 1, % Terminating condition output = 1; return; end

output = n*fact(n-1);

在写一个递函数时,一定要包含结束条件(Terminating condition),否则此函数将会一再呼叫自己,永远不会停止,直到电脑的记忆体被耗尽为止。以上例而言,n==1即满足结束条件,此时我们直接将output设为1,而不再呼叫此函数本身。

1-5、搜寻路径

在前一节中,test.m所在的目录是d:\\mlbook。如果不先进入这个目录,MATLAB就找不到你要执行的M档案。如果希望MATLAB不论在何处都能执行test.m,那麽就必须将d:\\mlbook加入MATLAB的搜寻路径(Search path)上。要检视MATLAB的搜寻路径,键入path即

可: path

MATLABPATH

d:\\matlab5\\toolbox\\matlab\\general d:\\matlab5\\toolbox\\matlab\\ops d:\\matlab5\\toolbox\\matlab\\lang d:\\matlab5\\toolbox\\matlab\\elmat d:\\matlab5\\toolbox\\matlab\\elfun d:\\matlab5\\toolbox\\matlab\\specfun d:\\matlab5\\toolbox\\matlab\\matfun d:\\matlab5\\toolbox\\matlab\\datafun d:\\matlab5\\toolbox\\matlab\\polyfun d:\\matlab5\\toolbox\\matlab\\funfun d:\\matlab5\\toolbox\\matlab\\sparfun d:\\matlab5\\toolbox\\matlab\\graph2d d:\\matlab5\\toolbox\\matlab\\graph3d d:\\matlab5\\toolbox\\matlab\\specgraph d:\\matlab5\\toolbox\\matlab\\graphics d:\\matlab5\\toolbox\\matlab\%uitools d:\\matlab5\\toolbox\\matlab\\strfun d:\\matlab5\\toolbox\\matlab\\iofun d:\\matlab5\\toolbox\\matlab\\timefun d:\\matlab5\\toolbox\\matlab\\datatypes d:\\matlab5\\toolbox\\matlab\\dde d:\\matlab5\\toolbox\\matlab\\demos d:\\matlab5\\toolbox\\tour

d:\\matlab5\\toolbox\\simulink\\simulink

d:\\matlab5\\toolbox\\simulink\\blocks d:\\matlab5\\toolbox\\simulink\\simdemos d:\\matlab5\\toolbox\\simulink\\dee d:\\matlab5\\toolbox\\local

此搜寻路径会依已安装的工具箱(Toolboxes)不同而有所不同。要查询某一命令是在搜寻路径的何处,可用which命令: which expo

d:\\matlab5\\toolbox\\matlab\\demos\\expo.m

很显然c:\\data\\mlbook并不在MATLAB的搜寻路径中,因此MATLAB找不到test.m这个M档案: which test

c:\\data\\mlbook\\test.m

要将d:\\mlbook加入MATLAB的搜寻路径,还是使用path命令: path(path, 'c:\\data\\mlbook');

此时d:\\mlbook已加入MATLAB搜寻路径(键入path试看看),因此MATLAB已经\看\得到 test.m: which test

c:\\data\\mlbook\\test.m

现在我们就可以直接键入test,而不必先进入test.m所在的目录。

小提示:如何在其启动MATLAB时,自动设定所需的搜寻路径? 如果在每一次启动MATLAB後都要设定所需的搜寻路径,将是一件很麻烦的事。有两种方法,可以使MATLAB启动後 ,即可载入使用者定义的搜寻路径:

1.MATLAB的预设搜寻路径是定义在matlabrc.m(在c:\\matlab之下,或是其他安装MATLAB 的主目录下),MATLAB每次启动後,即自动执行此档案。因此你可以直接修改matlabrc.m ,以加入新的目录於搜寻路径之中。

2.MATLAB在执行matlabrc.m时,同时也会在预设搜寻路径中寻找startup.m,若此档案存在,则执行其所含的命令。因此我们可将所有在MATLAB启动时必须执行的命令(包含更改搜寻路径的命令),放在此档案中。 每次MATLAB遇到一个命令(例如test)时,其处置程序为: 1.将test视为使用者定义的变数。

2.若test不是使用者定义的变数,将其视为永久常数 。

3.若test不是永久常数,检查其是否为目前工作目录下的M档案。 4.若不是,则由搜寻路径寻找是否有test.m的档案。

5.若在搜寻路径中找不到,则MATLAB会发出哔哔声并印出错误讯息。 以下介绍与MATLAB搜寻路径相关的各项命令。

1-6、资料的储存与载入

有些计算旷日废时,那麽我们通常希望能将计算所得的储存在档案中,以便将来可进行其他处理。MATLAB储存变数的基本命令是save,在不加任何选项(Options)时,save会将变数以二进制(Binary)的方式储存至副档名为mat的档案,如下述: save:将工作空间的所有变数储存到名为matlab.mat的二进制档案。

save filename:将工作空间的所有变数储存到名为filename.mat的二进制档案。 save filename x y z :将变数x、y、z储存到名为filename.mat的二进制档案。 以下为使用save命令的一个简例: who % 列出工作空间的变数 Your variables are: B h j y ans i x z

save test B y % 将变数B与y储存至test.mat dir % 列出现在目录中的档案

. 2plotxy.doc fact.m simulink.doc test.m ~$1basic.doc .. 3plotxyz.doc first.doc temp.doc test.mat 1basic.doc book.dot go.m template.doc testfile.dat delete test.mat % 删除test.mat

以二进制的方式储存变数,通常档案会比较小,而且在载入时速度较快,但是就无法用普通的文书软体(例如pe2或记事本)看到档案内容。若想看到档案内容,则必须加上-ascii选项,详见下述:

save filename x -ascii:将变数x以八位数存到名为filename的ASCII档案。

Save filename x -ascii -double:将变数x以十六位数存到名为filename的ASCII档案。 另一个选项是-tab,可将同一列相邻的数目以定位键(Tab)隔开。

小提示:二进制和ASCII档案的比较 在save命令使用-ascii选项後,会有下列现象:save命令就不会在档案名称後加上mat的副档名。

因此以副档名mat结尾的档案通常是MATLAB的二进位资料档。 若非有特殊需要,我们应该尽量以二进制方式储存资料。 load命令可将档案载入以取得储存之变数:

load filename:load会寻找名称为filename.mat的档案,并以二进制格式载入。若找不到filename.mat,则寻找名称为filename的档案,并以ASCII格式载入。load filename -ascii:load会寻找名称为filename的档案,并以ASCII格式载入。

若以ASCII格式载入,则变数名称即为档案名称(但不包含副档名)。若以二进制载入,则可保留原有的变数名称,如下例: clear all; % 清除工作空间中的变数 x = 1:10;

save testfile.dat x -ascii % 将x以ASCII格式存至名为testfile.dat的档案 load testfile.dat % 载入testfile.dat who % 列出工作空间中的变数 Your variables are: testfile x

注意在上述过程中,由於是以ASCII格式储存与载入,所以产生了一个与档案名称相同的变数testfile,此变数的值和原变数x完全相同。

1-7、结束MATLAB

有三种方法可以结束MATLAB: 1.键入exit 2.键入quit

3.直接关闭MATLAB的命令视窗(Command window)

数 值 函 数

N[expr]表达式的机器精度近似值

N[expr, n] 表达式的n位近似值,n为任意正整数 NSolve[lhs==rhs, var] 求方程数值解

NSolve[eqn, var, n] 求方程数值解,结果精度到n位 NDSolve[eqns, y, {x, xmin, xmax}]微分方程数值解 NDSolve[eqns, {y1,y2,...}, {x, xmin, xmax}] 微分方程组数值解

FindRoot[lhs==rhs, {x,x0}] 以x0为初值,寻找方程数值解 FindRoot[lhs==rhs, {x, xstart, xmin, xmax}]

NSum[f, {i,imin,imax,di}] 数值求和,di为步长 NSum[f, {i,imin,imax,di}, {j,..},..] 多维函数求和 NProduct[f, {i, imin, imax, di}]函数求积 NIntegrate[f, {x, xmin, xmax}] 函数数值积分

优化函数:

FindMinimum[f, {x,x0}] 以x0为初值,寻找函数最小值 FindMinimum[f, {x, xstart, xmin, xmax}] ConstrainedMin[f,{inequ},{x,y,..}]

inequ为线性不等式组,f为x,y..之线性函数,得到最小值及此时的x,y..取值 ConstrainedMax[f, {inequ}, {x, y,..}]同上

LinearProgramming[c,m,b] 解线性组合c.x在m.x>=b&&x>=0约束下的 最小值,x,b,c为向量,m为矩阵

LatticeReduce[{v1,v2...}] 向量组vi的极小无关组

数据处理:

Fit[data,funs,vars]用指定函数组对数据进行最小二乘拟和 data可以为{{x1,y1,..f1},{x2,y2,..f2}..}多维的情况 emp: Fit[{10.22,12,3.2,9.9}, {1, x, x^2,Sin[x]}, x] Interpolation[data]对数据进行差值,

data同上,另外还可以为{{x1,{f1,df11,df12}},{x2,{f2,.}..}指定各阶导数 InterpolationOrder默认为3次,可修改

ListInterpolation[array]对离散数据插值,array可为n维 ListInterpolation[array,{{xmin,xmax},{ymin,ymax},..}] FunctionInterpolation[expr,{x,xmin,xmax}, {y,ymin,ymax},..] 以对应expr[xi,yi]的为数据进行插值 Fourier[list] 对复数数据进行付氏变换 InverseFourier[list] 对复数数据进行付氏逆变换 Min[{x1,x2...},{y1,y2,...}]得到每个表中的最小值 Max[{x1,x2...},{y1,y2,...}]得到每个表中的最大值

Select[list, crit] 将表中使得crit为True的元素选择出来 Count[list, pattern] 将表中匹配模式pattern的元素的个数 Sort[list] 将表中元素按升序排列

Sort[list,p] 将表中元素按p[e1,e2]为True的顺序比较list 的任两个元素e1,e2,实际上Sort[list]中默认p=Greater 集合论:

Union[list1,list2..] 表listi的并集并排序 Intersection[list1,list2..] 表listi的交集并排序

Complement[listall,list1,list2...]从全集listall中对listi的差集

九、虚数函数

Re[expr] 复数表达式的实部 Im[expr] 复数表达式的虚部 Abs[expr] 复数表达式的模 Arg[expr] 复数表达式的辐角 Conjugate[expr] 复数表达式的共轭

十、数的头及模式及其他操作 Integer _Integer 整数 Real _Real 实数 Complex _Complex 复数 Rational_Rational 有理数

(*注:模式用在函数参数传递中,如MyFun[Para1_Integer,Para2_Real] 规定传入参数的类型,另外也可用来判断If[Head[a]==Real,...]*) IntegerDigits[n,b,len] 数字n以b近制的前len个码元 RealDigits[x,b,len] 类上

FromDigits[list] IntegerDigits的反函数

Rationalize[x,dx] 把实数x有理化成有理数,误差小于dx

Chop[expr, delta] 将expr中小于delta的部分去掉,dx默认为10^-10 Accuracy[x] 给出x小数部分位数,对于Pi,E等为无限大 Precision[x] 给出x有效数字位数,对于Pi,E等为无限大 SetAccuracy[expr, n] 设置expr显示时的小数部分位数 SetPrecision[expr, n] 设置expr显示时的有效数字位数

十一、区间函数

Interval[{min, max}] 区间[min, max](* Solve[3 x+2==Interval[{-2,5}],x]*) IntervalMemberQ[interval, x] x在区间内吗? IntervalMemberQ[interval1,interval2] 区间2在区间1内吗? IntervalUnion[intv1,intv2...] 区间的并 IntervalIntersection[intv1,intv2...] 区间的交

十二、矩阵操作

a.b.c 或 Dot[a, b, c] 矩阵、向量、张量的点积 Inverse[m] 矩阵的逆 Transpose[list] 矩阵的转置

Transpose[list,{n1,n2..}]将矩阵list 第k行与第nk列交换 Det[m] 矩阵的行列式 Eigenvalues[m] 特征值 Eigenvectors[m] 特征向量

Eigensystem[m] 特征系统,返回{eigvalues,eigvectors} LinearSolve[m, b] 解线性方程组m.x==b

NullSpace[m] 矩阵m的零空间,即m.NullSpace[m]==零向量 RowReduce[m] m化简为阶梯矩阵

Minors[m, k] m的所有k*k阶子矩阵的行列式的值(伴随阵,好像是) MatrixPower[mat, n] 阵mat自乘n次

Outer[f,list1,list2..] listi中各个元之间相互组合,并作为f的参数的到的矩阵 Outer[Times,list1,list2]给出矩阵的外积

SingularValues[m] m的奇异值,结果为{u,w,v}, m=Conjugate[Transpose[u]].DiagonalMatrix[w].v

PseudoInverse[m] m的广义逆 QRDecomposition[m] QR分解 SchurDecomposition[m] Schur分解 LUDecomposition[m] LU分解

Mathematica函数大全--运算符及特殊符号

一、运算符及特殊符号

Line1; 执行Line,不显示结果 Line1,line2 顺次执行Line1,2,并显示结果 ?name 关于系统变量name的信息 ??name 关于系统变量name的全部信息 !command 执行Dos命令 n! N的阶乘

!!filename 显示文件内容 <> filename 打开文件写

Expr>>>filename 打开文件从文件末写

() 结合率 [] 函数 {} 一个表

<*Math Fun*> 在c语言中使用math的函数 (*Note*) 程序的注释

#n 第n个参数 ## 所有参数

rule& 把rule作用于后面的式子 % 前一次的输出 %% 倒数第二次的输出 %n 第n个输出 var::note 变量var的注释 \ 字符串 Context ` 上下文

a+b 加 a-b 减 a*b或a b 乘 a/b 除 a^b 乘方

base^^num 以base为进位的数 lhs&&rhs 且 lhs||rhs 或 !lha 非

++,-- 自加1,自减1 +=,-=,*=,/= 同C语言 >,<,>=,<=,==,!= 逻辑判断(同c) lhs=rhs 立即赋值 lhs:=rhs 建立动态赋值

lhs:>rhs 建立替换规则 lhs->rhs 建立替换规则 expr//funname 相当于filename[expr] expr/.rule 将规则rule应用于expr

expr//.rule 将规则rule不断应用于expr知道不变为止 param_ 名为param的一个任意表达式(形式变量) param__ 名为param的任意多个任意表达式(形式变量)

二、系统常数

Pi 3.1415....的无限精度数值 E 2.17828...的无限精度数值 Catalan 0.915966..卡塔兰常数 EulerGamma 0.5772....高斯常数 GoldenRatio 1.61803...黄金分割数 Degree Pi/180角度弧度换算 I 复数单位 Infinity 无穷大 -Infinity 负无穷大 ComplexInfinity 复无穷大 Indeterminate 不定式

三、代数计算

Expand[expr] 展开表达式 Factor[expr] 展开表达式 Simplify[expr] 化简表达式

FullSimplify[expr] 将特殊函数等也进行化简 PowerExpand[expr] 展开所有的幂次形式 ComplexExpand[expr,{x1,x2...}] 按复数实部虚部展开 FunctionExpand[expr] 化简expr中的特殊函数 Collect[expr, x] 合并同次项 Collect[expr, {x1,x2,...}] Together[expr] Apart[expr] Apart[expr, var] Cancel[expr] ExpandAll[expr] ExpandAll[expr, patt] FactorTerms[poly] FactorTerms[poly, x] FactorTerms[poly, {x1,x2...}] Coefficient[expr, form] Coefficient[expr, form, n] Exponent[expr, form] Numerator[expr] Denominator[expr] ExpandNumerator[expr] ExpandDenominator[expr]

TrigExpand[expr] TrigFactor[expr] 合并x1,x2,...的同次项 通分

部分分式展开 对var的部分分式展开 约分 展开表达式 展开表达式

提出共有的数字因子 提出与x无关的数字因子 提出与xi无关的数字因子 多项式expr中form的系数 多项式expr中form^n的系数 表达式expr中form的最高指数 表达式expr的分子 表达式expr的分母 展开expr的分子部分 展开expr的分母部分 展开表达式中的三角函数 给出表达式中的三角函数因子

TrigFactorList[expr] 给出表达式中的三角函数因子的表 TrigReduce[expr] 对表达式中的三角函数化简 TrigToExp[expr] 三角到指数的转化 ExpToTrig[expr] 指数到三角的转化

RootReduce[expr] ToRadicals[expr]

Mathematica入门教程

Mathematica的基本语法特征

如果你是第一次使用Mathematica,那么以下几点请你一定牢牢记住: Mathematica中大写小写是有区别的,如Name、name、NAME等是不同的变量名或函数名。

系统所提供的功能大部分以系统函数的形式给出,内部函数一般写全称,而且一定是以大写英文字母开头,如Sin[x],Conjugate[z]等。

乘法即可以用*,又可以用空格表示,如2 3=2*3=6 ,x y,2 Sin[x]等;乘幂可以用“^”表示,如x^0.5,Tan[x]^y。

自定义的变量可以取几乎任意的名称,长度不限,但不可以数字开头。 当你赋予变量任何一个值,除非你明显地改变该值或使用Clear[变量名]或“变量名=.”取消该值为止,它将始终保持原值不变。

一定要注意四种括号的用法:()圆括号表示项的结合顺序,如

(x+(y^x+1/(2x)));[]方括号表示函数,如Log[x],BesselJ[x,1];{}大括号表示一个“表”(一组数字、任意表达式、函数等的集合),如{2x,Sin[12

Pi],{1+A,y*x}};[[]]双方括号表示“表”或“表达式”的下标,如a[[2,3]]、{1,2,3}[[1]]=1。

Mathematica的语句书写十分方便,一个语句可以分为多行写,同一行可以写多个语句(但要以分号间隔)。当语句以分号结束时,语句计算后不做输出(输出语句除外),否则将输出计算的结果。

一.数的表示及计算

1.在Mathematica中你不必考虑数的精确度,因为除非你指定输出精度,Mathematica总会以绝对精确的形式输出结果。例如:你输入

In[1]:=378/123,系统会输出Out[1]:=126/41,如果想得到近似解,则应输入 In[2]:=N[378/123,5],即求其5位有效数字的数值解,系统会输出Out[2]:=3.073

2,另外Mathematica还可以根据你前面使用的数字的精度自动地设定精度。 Mathematica与众不同之处还在于它可以处理任意大、任意小及任意位精度的数值,如100^7000,2^(-2000)等数值可以很快地求出,但在其他语言或系统中这是不可想象的,你不妨试一试N[Pi,1000]。

Mathematica还定义了一些系统常数,如上面提到的Pi(圆周率的精确值),还有E(自然对数的底数)、I(复数单位),Degree(角度一度,Pi/180),Infinity(无穷大)等,不要小看这些简单的符号,它们包含的信息远远大于我们所熟知的它们的近似值,它们的精度也是无限的。 二.“表”及其用法

“表”是Mathematica中一个相当有用的数据类型,它即可以作为数组,又可以作为矩阵;除此以外,你可以把任意一组表达式用一个或一组{}括起来,进行运算、存储。可以说表是任意对象的一个集合。它可以动态地分配内存,可以方便地进行插入、删除、排序、翻转等等几乎所有可以想象到的操作。 如果你建立了一个表,你可以通过下表操作符[[]](双方括号)来访问它的每一个元素,如我们定义table={2,Pi,Sin[x],{aaa,A*I}}为一个表,那么

table[[1]]就为2,table[[2]]就是Pi,而table[[3,1]]表示嵌套在table中的子表{aaa,A*I}的第一个元素即aaa,table[[3,2]]表示{aaa,A*I}第二个元素即A*I。总之,表每一层次上并列的部分用逗号分割,表可以无穷嵌套。 你可以通过Append[表,表达式]或Prepend[表,表达式]把表达式添加到表的最前面或最后面,如Append[{1,2,3},a]表示{1,2,3,a}。你还可以通过Union[表1,表2,......],Jion[表1,表2,......]来把几个表合并为一个表,二者不同在于Union在合并时删除了各表中重复的元素,而后者仅是简单的合并;你还可以使用Flatten[表]把表中所有子表\抹平\合并成一个表,而Patition[表,整数n]把表按每n个元素分段作为子表,集合成的表。如

Flatten[{1,2,{Sin[x],dog},{{y}}}]表示{1,2,Sin[x],y},而

Partition[{1,2,Sin[x],y},2]把表每两个分段,结果为{{1,2},{Sin[x],y}};还可以通过Delete[表,位置]、Insert[表,位置]来向表中按位置插入或删除元素,如要删除上面提到的table中的aaa,你可以用Delete[table,{3,1}]来实现;Sort[表]给出了表中各元素的大小顺序,Reverse[表]、RotateLeft[表,整数n]、RotateRight[表,整数n]可以分别将一个表进行翻转、左转n个元素、右转n个元素等操作,Length[表]给出了表第一个层次上的元素个数,

Position[表,表达式]给出了表中出现该表达式的位置,Count[表,表达式]则给出表达式出现的次数。各种表的操作函数还有很多,这里就不再一一介绍了。

三.图形函数

Mathematica的图形函数十分丰富,用寥寥几句就可以画出复杂的图形,而且可以通过变量和文件存储和显示图形,具有极大的灵活性。

图形函数中最有代表性的函数为Plot[表达式,{变量,下限,上限},可选项],(其中表达式还可以是一个\表达式表\,这样可以在一个图里画多个函数);变量为自变量;上限和下限确定了作图的范围;可选项可要可不要,不写系统会按默认值作图,它表示对作图的具体要求。例如

Plot[Sin[x],{x,0,2*Pi},AspectRatio-1]表示在0

.

二维函数作图

Plot[函数f,{x,xmin,xmax},选项]

在区间{x,xmin,xmax}上,按选项的要求画出函数f的图形 Plot[{函数1,函数2},{x,xmin,xmax},选项]

在区间{x,xmin,xmax}上,按选项的要求画出几个函数的图形

图一.用Plot生成x*Sin[1/x]的图形

.

二维参数画图函数

ParametricPlot[{x[t],y[t]},{t,t0,t1},选项] 画一个X轴,Y轴坐标为{x[t],y[t]},参变量t在[t0,t1]中的参数曲线

图二.用ParametricPlot生成的图形

.

三维函数作图

Plot3D[f[x,y],{x,x0,x1},{y,y0,y1},选项] 在区域

上,画出空间曲面f[x,y].

图3.用Plot3D生成的Sin[x]*Cos[y]的三维图形

除Plot,二维参数方程作图的ParametricPlot[{x(t),y(t)},{t,下限,上限},可选项]、三维作图的Plot3D[二维函数表达式,{变量1,下限,上限}, {变量2,下限,上限},可选项}]、三维参数方程作图的

ParametricPlot3D[{x(u,v),y(u,v),z(u,v)},{u,下限,上限},{v,下限,上限},可选项]外,还有画二维等高线图ContourPlot[二元表达式,{变量1,下限,上限}, {变量2,下限,上限},可选项}]、画二维密度图的DensityPlot[二元表达式,{变量1,下限,上限}, {变量2,下限,上限},可选项}]等等不一而足。

除使用上述函数作图以外,Mathematica还可以象其他语言一样使用图形元语言作图,如画点函数Point[x,y],画线函数Line[x1,y1,x2,y2],画圆的

Circle[x,y,r],画矩形和多边形的Rectangle和Polygon,字符输出的Text[字符串,输出坐标],还有颜色函数RGBColor[red,green,blue]、

Hue[],GrayLevel[gray]来描述颜色的亮度、灰度、饱和度,用PointSize[相对尺度]、Thickness[相对尺度]来表示点和线的宽度。总之Mathematica可以精确地调节图形的每一个特征。

四.数学函数的用法

Mathematica系统内核提供了丰富的数学计算的函数,包括极限、积分、微分、最值、极值、统计、规划等数学的各个领域,复杂的数学问题简化为对函数的调用,极大地提高了解决问题的效率。

Mathematica提供了所有的三角、反三角、双曲、反双曲、各种特殊函数(如贝塞尔函数系、椭圆函数等),各种复数函数(如Im[z],Re[z],Conjugate[z], Abs[z],Arg[z]),各种随机函数(如Random[n]可以通过不同的参数产生任意范围内整型、实型任意分布的随机数),矩阵运算函数(如求特征值特征向量的EigenVector[],EigenValue[],求逆的Inverse[]等)。 Mathematica还提供了大量数学操作的函数,如取极限的

Limit[f[x],{x,a}],求微分的D[f[x],x],全微分的Dt[f[x],x],不定积分的Integrate[f[x],x]和定积分的Integrate[f[x],{x,a,b}],解任意方程的

Solve[lhs=rhs,x]及微分方程的DSolve[lhs=rhs,x],解幂级数和付立叶展开的Series[f[x]],Fourier[f[x]]及其逆变化InverseSeries,InverseFourier, 求和函数Sum[],求积函数Product[],以上函数均可以适用于多维函数或多维方程。

Mathematica中还有相当数量的数值计算函数,最常用的是N[表达式,整数]可以求出表达式精确到指定有效数字的数值解,还有如数值求积分的NIntegrate[],求方程数值根的NSolve[]和NDSolve[],最小、最大值的NFindMinimum[]和NFindMaximum[]等等。 Mathematica还有各种表达式操作的函数,如取分子、分母的 Numerator[expr] , Denormator[expr],取系数的Coefficient[expr],因式分解的Factor[expr],以及展开的Expand[expr]和ExpandAll[expr],表达式化简的Simplify[expr]等。expr代表一个任意的表达式。

.

求极限

的一般形式是:

计算函数极限

Limit[expr,x->x0] x->x0时函数的极限 Limit[expr,x->x0,Direction->-1] x->Limit[expr,x->x0, Direction->1] x->

In[1]:=

时函数的极限 时函数的极限

Out[1]:=1

.

微商和微分

在Mathematica中能方便地计算任何函数表达式的任意阶微商(导数).如果f是一元函数,D[f,x]表示常用形式如下:

;如果f是多元函数,D[f,x]表示

.微商函数的

D[f,x]

In[1]:=D[x^x,x]

Out[1]:=

下面列出全微分函数Dt的常用形式及其意义:

Dt[f] 全微分 Dt[f,x] 全导数

Dt[f,x1,x2,?] 多重全导数

In[1]:=Dt[x^2+y^2] Out[1]:=

.

不定积分和定积分

1. 不定积分

Integreate函数主要计算只含有1“简单函数”的被积函数. “简单函数”包括有理函数、指数函数、对数函数和三角函数与反三角函数。不定积分一般形式如下:

Integrate[f,x] 计算不定积分 Integrate[f,x,y] 计算不定积分 Integrate[f,x,y,z] 计算不定积分

In[1]:=

Out[1]:= In[2]:=

Out[2]:= 2.定积分

计算定积分的命令和计算不定积分是同一个Integrate函数,在计算定积分时,除了要给出变量外还要给出积分的上下限。当定积分算不出准确结果时,用N[%]命令总能得到其数值解.Nintegrate也是计算定积分的函数,其使用方法和形式和Integrate函数相同.用Integrate函数计算定积分得到的是准确

解,Nintegrate函数计算定积分得到的是近似数值解.计算多重积分时,第一个自变量相应于最外层积分放在最后计算.

Integrate[f,{x,a,b}] 计算定积分NIntegrate[f,{x,a,b}] 计算定积分

Integrate[f,{x,a,b},{y,c,d}] 计算定积分NIntegrate[f,{x,a,b},{y,c,d}] 计算定积分

In[1]:= Out[1]:= In[2]:= Out[2]:= In[3]:= Out[3]:=

.

幂级数

幂级数展开函数Series的一般形式:

Series[expr,{x,x0,n}] 将expr在x=x0点展开到n阶的级数

Series[expr,{x,x0,n},{y,y0,m}] 先对y展开到m阶再对x展开n阶幂级数

用Series展开后,展开项中含有截断误差In[1]:=

Out[1]:= In[2]:=

Out[2]:= In[3]:= Out[3]:=

.

常微分方程

求解常微分方程和常微分方程组的函数的一般形式如下:

Dsolve[eqns,y[x],x] 解y(x)的微分方程或方程组eqns,x为变量 Dsolve[eqns,y,x] 在纯函数的形式下求解

NDsolve[eqns,y[x],x,{xmin,xmax}] 在区间{xmin,xmax}上求解变量x的数的形式下求解常微分方程和常微分方程组eqns的数值解 In[1]:= Out[1]:= In[2]:= Out[2]:= In[3]:=

Out[3]:=

.线性代数

1. 定义向量和矩阵函数

定义一个矩阵,可用函数Table或Array.当矩阵元素能用一个函数表达式时,用函数Table在定义矩阵大小的同时也给每个矩阵元素定义确定的值.

用函数Range只能定义元素为数值的向量.Array只能用于定义向量、矩阵和张量,并规定矩阵和张量的元素下标从1开始.Array的一般形式: Array[向量元素名,n,f] 定义下标从f开始的有n个元素的向量,当f是1时可省略. Array[矩阵元素名,{m,n}] 定义m行n列的矩阵.其中:矩阵元素名是一个标识符,表示矩阵元素的名称,当循环范围是{u,v,w}时定义一个张量. Table[表达式f,循环范围] 表达式f表示向量或矩阵元素的通项公式;循环范围定义矩阵的大小. 循环范围的一般形式:{循环变量名,循环初值,循环终值,循环步长}. 在Array或Table的循环范围表示方法略有区别.请在下面的实例中注意观察. In[1]:= Out[1]:= 对{}括起来*) In[2]:= Out[2]:= In[3]:= Out[3]:= In[4]:= *) Out[4]:= In[5]:= m*) Out[5]:=

(*TableForm[m]或MatrixForm[m]按矩阵形式输出

(*IndentityMatrix[n]生成n维矩阵*)

(*生成对角元素为表元素的对角矩阵

(*矩阵每一行元素用一

一个矩阵可用一个变量表示,如In[2]所示U是一个矩阵,则U[[I]]表示U的第I行的N个元素;Transpose[U][[j]]表示U的第J行的M个元素;U[[I,j]]或a[I,j]表示U的第I行第J列元

素;U[[{i1,i2,?,ip},{j1,j2,?,jq}]]表示由行为{i1,i2,?,ip}和列为{j1,j2,?,jq}组成的子矩阵.

2. 矩阵的运算符号和函数

表达式 意义

A+c A为矩阵,c为标量,c与A中的每一个元素相加 A+B A,B为同阶矩阵或向量,A与B的对应元素相加 cA A为矩阵,c为标量,c与A中的每个元素相乘 U.V 向量U与V的内积 A.B 矩阵A与矩阵B相乘,要求A的列数等于B的行数 Det[M] 计算矩阵M的行列式的值 Transepose[M] M的转置矩阵(或) Inverse[M] 计算矩阵M的逆矩阵() Eigenvalus[A] 计算矩阵A的全部(准确解)特征值 Eigenvalus[N[A]] 计算矩阵A的全部(数值解)特征值 Eigenvectors[A] 计算矩阵A的全部(准确解)特征向量 Eigenvectors[N[A]] 计算矩阵A的全部(数值解)特征向量 Eigensystem[A] 计算矩阵A的所有(准确解)特征值和特征向量 Eigensystem[N[A]] 计算矩阵A的所有(数值解)特征值和特征向量 3. 方程组求解函数

在Mathematica中用LinerSolve[A,B],求解满足AX=B的一个解.如果A的行列式不为零,那么这个解是方程组的唯一解; 如果A的行列式是零,那么这个解是

方程组的一个特解,方程组的全部解由基础解系向量的线性组合加上这个特解组成. NullSpace[A]计算方程组AX=0的基础解系的向量表,用LinerSolve[A,B]和NullSpace[A]联手解出方程组AX=B的全部解. Mathematica中还有一个美妙的函数RowReduce[A],它对A的行向量作化间成梯形的初等线性变换.用

RowReduce可计算矩阵的秩,判断向量组是线性相关还是线性无关和计算极大线性无关组等工作. 解方程组函数 RowReduce[A] LinerSolve[A,B] NullSpace[A] 意义 作行的线性组合化简A,A为m行n列的矩阵 求解满足AX=B的一个解,A为方阵 求解方程组AX=0的基础解系的向量表, A为方阵 例:已知A=,计算A的秩,计算AX=0的基础解系.

In[1]:=

Out[2]:= 2*)

In[2]:=

(*显然,A的秩是

In[3]:=

Out[3]:= (*A的两个线性无关解*)

五.程序流程控制

循环语句有For[赋初值,循环条件,增量语句,语句块]表示如果满足循环条件,则执行语句块和增量语句,直到不满足条件为止,While[test,block]表明如果满足条件test则反复执行语句块block,否则跳出循环,

Do[block,{i,imin,imax,istep}]与前者功能是相同的。还有Goto[lab],

Label[lab]提供了程序中无条件跳转,Continue[]和Break[]提供了继续循环或

跳出循环的控制,Catch[语句块1]和Throw[语句块2]提供了运算中对异常情况的处理。另外,在程序中书写注释可以用一对\ *)\括起来,注释可以嵌套。

六.其他

1. 使用帮助,Mathematica的帮助文件提供了Mathematica内核的基本用法的说明,十分详细,可以参照学习。

2. 你可以使用\符号名\或\符号名\来获得关于该符号(函数名或其他)的粗略或详细介绍。符号名中还可以使用通配符,例如?M*,则系统将给出所有以M开头的关键词和函数名,再如??For将会得到关于For语句的格式和用法的详细情况。

3. 在Mathematica的编辑界面中输入语句和函数,确认光标处于编辑状态(不断闪烁),然后按Insert键来对这一段语句进行求值。如果语句有错,系统将用红色字体给出 出错信息,你可以对已输入的语句进行修改,再运行。如果运行时间太长,你可以通过Alt+.(Alt+句号)来中止求值。

4. 对函数名不确定的,可先输入前面几个字母(开头一定要大写),然后按Ctrl+K,系统会自动补全该函数名。

七.应用例子

量子一维、二维简谐振子问题

量子一维简谐振子图像

本文来源:https://www.bwwdw.com/article/yoop.html

Top