收藏 分享(赏)

Mathematica编程语句与例题.ppt

上传人:tkhy51908 文档编号:7973088 上传时间:2019-06-01 格式:PPT 页数:44 大小:1.08MB
下载 相关 举报
Mathematica编程语句与例题.ppt_第1页
第1页 / 共44页
Mathematica编程语句与例题.ppt_第2页
第2页 / 共44页
Mathematica编程语句与例题.ppt_第3页
第3页 / 共44页
Mathematica编程语句与例题.ppt_第4页
第4页 / 共44页
Mathematica编程语句与例题.ppt_第5页
第5页 / 共44页
点击查看更多>>
资源描述

1、第八章 Mathematica编程语句与例题,北京交通大学,8.1全局变量、局部变量、过程 8.1.1全局变量,在Mathematica中键入的各种命令或在Mathematica的程序语句中, 变量被赋值后, 必须用Mathematica清除变量的命令才能使其还原为符号的变量, 称为全局变量。察看某变量是否为全局变量,可以键入命令: ?变量名 Global变量名说明该变量是全局变量,否则,就不是全局变量。 例如:要知道变量w是否为全局变量,可以键入: ? w 键入执行命令后,显示结果Globalww = 2 说明w是全局变量,且有数值2。,8.1.2 局部变量,在Mathematica的命令或

2、程序中出现的任何合法的变量名符号,如果该变量名所代表的变量没有被赋值,则它就作为数学算式中的符号参与数学的公式推导和运算;如果该变量被赋值了,则用该变量所赋的值参与对应的数学公式推导和运算。因此,当用户在做符号运算时使用的符号含有被赋了值的变量名,则就会出现察觉不到的错误。为克服这种错误,可以在使用Mathematica的命令之前, 先用Clear 变量1,变量2,将要使用的所有变量名做清除处理, 就可以避免上述错误。不同于全局变量, 称变量的赋值效果只在某一模块内有效的变量为局部变量。,Mathematica 中Module模块的命令为: Module变量表, 表达式 例如: 在Mathem

3、atica键入In4:= u=5; In5: = s=Moduleu, v=1, u=1; v=u+v+3 Out5= 5 In6:= Printu, “ “, v, “ “ ,s Out6= 5 v 5,在Mathematica中使用局部变量很简单, 只要把涉及到的局部变量用大括弧 括起来, 放在Module模块命令的变量表位置, 并把相应的语句写成语句序列放在Module模块命令的表达式位置即可。 例如: Mathematica中有如下命令In7:=s=Sinx;In8:=u= Cosx;In9:=Ds*u, x Out9= Cos2x - Sin2x命令中的变量s, u的值将会影响随后的

4、命令, 如果写成In10:= Modules, u, x, s=Sinx;u= Cosx; Ds*u, x Out10= Cos2x$1 - Sin2x$1此时命令中的变量s, u就是局部变量, 它们的值将不会影响随后的命令。,8.1.3 过程,在Mathematica中,一个用分号隔开的表达式序列称为一个复合表达式,它也称为一个过程。例如:In11:=s=1;u=s+3;u*u Out11=16 Mathematica的过程可以作为Module模块命令的表达式,如果不关心局部变量问题,可以把一个过程用小括号括起来构成一个整体,这样可以用由小括号括起来的过程来定义一个函数。例如:已知有n个元素

5、的一个数表x=a1,a2,an,定义一个计算此类数表最大数与最小数平方差的函数,用过程来定义可以写为:In12:=gx_:=(m =Maxx;n = Minx;m*m - n*n) 如果不用小括号括起来,而是写为In13:=gx_:=m =Maxx;n = Minx;m*m-n*n 则In13定义的gx实际上是Maxx,不是数表最大数与最小数平方差函数,应该注意过程加小括号与不加括号的区别。本例题还可以用模块来定义函数: In14:=gx_:=Modulem, n, m =Maxx;n = Minx;m*m-n*n,8.2条件控制语句,Mathematica涉及条件选择的语句有好几种,这里介绍

6、常用的三种语句: if 语句, Which 语句,Switch 语句。8.2.1 If 语句 If 语句的一般形式为: If 条件, 语句或语句列 具体形式有命令形式1:If 条件, 语句1功能:如果条件成立,则执行对应的语句1,并将语句执行结果作为If语句的值,如果条件不成立,不执行语句1。命令形式2:If 条件, 语句1, 语句2功能:根据条件的成立与否确定执行哪一个语句,具体执行为:条件成立时,执行语句1,否则,执行语句2,并将语句执行结果作为If语句的值。命令形式3:If 条件, 语句1, 语句2, 语句3 功能:根据条件的成立与否确定执行哪一个语句, 具体执行为:条件成立时,执行语句

7、1,条件不成立时,执行语句2,否则,执行语句3, 并将语句执行结果作为If语句的值。,例1:用Mathematica命令描述下面问题:先产生一个函数0,1内的随机实数,再判断该随机数是否小于0.5, 如果小于0.5, 则将此随机数显示出来,否则显示”*”。 解: Mathematica 命令为: In1:= p= Random; Ifp0.5, p, “*” Out1=0.202857 In2:= If(p=Random)0.5, p, “*”) Out2= *例2: 写出分段函数的Mathematica自定义函数形式,并画出其在3,3上的图形 解: 因此Mathematica 命令为: In

8、3:= fx_:=Ifx1, x+Sinx, x*Cosx(或fx_:=Ifx1, x+Sinx,x*Cosx,”err” ) In4:= Plotfx,x,-3, 3,例3 定义一个函数描述下面问题:任给一个函数y(x),如果y(x)的一阶导数为零,则输出符号#,否则,输出y (x)+ 5解: Mathematica 命令为: In5:=fy_,x_:=Modules,s=Dy,x;Ifs=0,Return“#”; s =s+5;Returns In6:= f3,x Out6= # In7:= fTanx,x Out7=5 + Sec2x,8.2.2 Which 语句,命令形式1:Which

9、条件1,语句1,条件2,语句2, . ,条件n,语句n 功能:由条件1开始按顺序依次判断相应的条件是否成立,若第一个成立的条件为条件k,则执行对应的语句k。命令形式2:Which条件1,语句1,条件2,语句2, . ,条件n,语句n,True,“字符串“ 功能:由条件1开始按顺序依次判断相应的条件是否成立,若第一个成立的条件为条件k,则执行对应的语句k,若直到条件n都不成立时,则返回符号字符串。,例4:写出一元二次方程ax2 + bx + c = 0判别根的类型的Mathematica自定义函数形式。 解:一元二次方程根的判别式为 =b2 -4ac,当0时方程有两个实根; 当0,“two re

10、al roots“,w0,“two complex roots“,w = 0,“duplicate roots“ ) In9:=g0,1,2 Out9= two real roots In10:=g3,1,2 Out10= two complex roots In11:=g3,0,0 Out11=duplicate roots,例5 任给向量x=(x1,x2,xn),定义一个可以计算如下三中向量范数的函数:解:In12:= normx_,p_:=Whichp=1,SumAbsxi,i,1,Lengthx,p=2,SqrtSumAbsxi2,i,1, Lengthx,True,MaxAbsxIn

11、13:=x=3, -4, 0;In14:= normx,1Out14=7In15:= normx,2Out15=5In16:= normx,0Out16=4,例6: 写出分段函数的Mathematica自定义函数形式,并画出其在0,60上的图形。 解: 因此Mathematica 命令为: In17:=fx_:= Whichx60,0 In18:= Plotfx,x,0,60,8.2.3 Switch 语句,命令形式:Switch表达式, 模式1,语句1,模式2,语句2, . 模式n,语句n 功能: 先计算表达式,然后按模式1,模式2,的顺序依次比较与表达式结果相同的模式,找到的第一个相同的模

12、式,则将此模式对应的语句计算计算结果作为Switch语句的结果。 Switch语句是根据表达式的执行结果来选择对应的执行语句,它类似于一般计算机语言的Case语句,例7: 用函数描述如下结果:任给一个整数x, 显示它被3除的余数。 解: Mathematica自定义函数: In19:=fx_:=SwitchModx,3,0, Print“0 is the remainder on division of“ ,x ,“by 3“,1, Print“1 is the remainder on division of“ ,x ,“by 3“,2, Print“2 is the remainder o

13、n division of“ ,x ,“by 3“ In20:= f126 Out20= 0 is the remainder on division of 126 by 3 In21:= f346 Out21= 1 is the remainder on division of 346 by 3 In22:= f599 Out22= 2 is the remainder on division of 599 by 3,8.3循环控制语句,Mathematica的循环控制语句有三种语句: Do 语句,For语句,While语句。为处理有时需要中途退出循环语句的问题, Mathematica 还

14、提供了在执行循环语句时退出循环体的语句:Returnexpr 退出函数所有过程和循环,返回expr值Break 结束本层循环Continue 转向本层For语句或While语句的下一次循环在Mathematica的循环结构中,使用如下表示式,可以达到简洁,快速的目的. k+ 表示赋值关系 k = k+1 , +k 表示先处理k的值,再做赋值 k=k+1 k- 表示赋值关系 k = k-1 -k 表示先处理k的值,再做赋值 k=k-1 x,y=y,x 表示交换x与y 值 x+=k 表示 x = x + k x*=k 表示 x = x * k,8.3.1 Do 语句,Do 语句的一般形式为Do循环

15、体,循环范围 具体形式有 命令形式1:Doexpr, n 功能:循环执行n次表达式expr 。命令形式2:Doexpr, i, imin, imax 功能:按循环变量i 为imin,imin+1,imin+2,imax循环执行imax-imin+1次表达式expr。命令形式3:Doexpr, i, imin, imax,d 功能:按循环变量i 为imin,imin+d,imin+2d,imin+nd,循环执行(imax-imin)/d +1次表达式expr。命令形式4:Doexpr, i, imin, imax, j, jmin, jmax 功能:对循环变量i为imin,imin+1,imin

16、+2,imax每个值, 再按循环变量j的循环执行表达式expr。这是通常所说的二重循环命令,类似的,可以用在Do命令中再加循环范围的方法得到多重循环命令。,例8 找出300至500之间同时能被3和11整除的自然数。 解: Mathematica 命令为: In23:= DoIfModi,13= 0 If5x+3y+z/3=100,Print“x= “,x,“ y=“,y,“ z=“,z,x,0,100,y,0,100 得解 x= 0 y= 25 z= 75 x= 4 y= 18 z= 78 x= 8 y= 11 z= 81 x= 12 y= 4 z= 84,例10 对自然数k从1开始到10,取

17、s=1做赋值s =s*k,并显示对应的值,直到s的值5终止。 解: In25:= s=1;Dos*=k;Prints;Ifs5,Break, k,1,10 126,8.3.2 For 语句,命令形式:Forstat,test,incr,body 功能:以stat为初值,重复计算incr和body直到test为False终止 。这里start为初始值,test为条件,incr为循环变量修正式,body为循环体,通常由incr项控制test的变化。 注意: 上述命令形式中的start可以是由复合表达式提供的多个初值,如果循环体生成 Break 语句,则退出For循环; 如果循环体生成Continu

18、e 语句,则由incr的增量进入For语句的下一次循环。,例11 指出语句For i=1;t=x,i*i10不满足条件i*i10,故退出For循环。,8.3.3 While 语句,命令形式:Whiletest,body 功能:当test为True时,计算body,重复对test的判断和body的计算,直到test不为True时终止 。这里test为条件, body为循环体,通常由body控制test值的变化。如果test不为True,则循环体不做任何工作 注意: 上述命令中,如果循环体生成 Break 语句,则退出While循环。,例12: 用割线法求解方程x3-2x2+7x+4=0的根,要求

19、误差|xk-xk-1|10-12,x2=x1-(x1-x0)*fx1/(fx1-fx0);x0=x1;x1=x2 In29:= Nx1,12 Out29= -0.487120155928,例13 编制20以内整数加法自测程序 解:In30:=For i=1,i=10,i+, t=RandomInteger,0,10; s=RandomInteger,0,10; Printt,“+“,s,“=“; y=Input; Whiley!=t+s, Printt,“+“,s,“=“,y,“ Wong !Try again!“; Printt,“+“,s,“=“; y=Input ; Printt,“+“

20、,s,“=“,y,“ Good“ 执行结果为 3+0= 3+0=3 Good 7+3=12 Wong!Ttry again! 7+3=10 Good,例14 韦达(VieTa)在1593年首次给出了如下关于圆周率的关系式(韦达公式)试用韦达公式来写出计算圆周率近似值的Mathematica命令。 解: 利用Mathematica自定义函数命令可以输入Mathematica命令为: In31:= vietak_:=Moduleu,u=NProductCosPi/2(n+1),n,1,k,20; Return2/u In32:= Tablen, v=vietan, NPi,20- v ,n,1,1

21、0,2 Out32= 1, 3.0614674589207181738, 0.0801251946690750646, 3, 3.1365484905459392638, 0.0050441630438539746, 5, 3.1412772509327728681, 0.0003154026570203704,7, 3.1415729403670913841, 0. 0000197132227018543,9, 3.141591421511199974, 1.232078593264 10-6 ,8.3.4 迭代语句,在数值计算中,经常遇到要进行迭代计算,即利用迭代格式:xk+1=(x k)

22、, 已知x 0 来求出迭代序列x 1,x 2,这里迭代函数为已知函数,Mathematica 有如下几个命令处理这类问题: 命令形式1:Nest迭代函数, 迭代初值x0,迭代次数n功能:根据迭代初值x0及迭代格式:xk+1=(xk), 计算出xn ,并将此值作为 Nest语句的值。命令形式2:NestList迭代函数, 迭代初值x0,迭代次数n功能:根据迭代初值x0及迭代格式:xk+1=(xk), 计算出x 1,x 2,xn ,并将 x 0,x 1,x 2,xn 作为NestList语句的值。,例15 根据迭代格式:xk+1=lg(xk+2),及迭代初值x0=1.0, (1)计算出x7 , (

23、2)显示 x0,x1,x2,x7 (3)显示lg(x+2)的1,2次自复合函数 解: Mathematica命令为 In33:=qx_:=Log10,x+2 In34:=Nestq,1.,7 Out34=0.375816 In35:=NestListq,1.,7 Out35=1.,0.477121, 0.393947, 0.379115, 0.376415, 0.375922, 0.375832, 0.375816 In36:=NestListq, x, 2 Out36=,读写 Mathematica 文件,当使用基于文本的 Mathematica 界面时,就需要经常读写含有定义和结果的文件.

24、,读文件,显示文件 factors 的内容 In1:= 读入一个文件,返回值是文件的最后一个表达式 In2:= Out2=,当 Mathematica 找不到所要文件时,它显示一个信息,返回值为 $Failed In3:= Out3= $Failed Mathematica 的输入文件可以包含任意数目的表达式. 每个表达式必须从新的一行开始,它 可以占有许多行. 在交互式的 Mathematica 对话中,当表达式完成后 就进行处理. 但是在一个文件中,可以在任何位置插入一个空行, 这不产生任何影响.,用 file 读入文件时,Mathematica 返回值为文件中的最后一个表达式, 为了不让

25、此结果显示,可以在文件的最后一个表达式中用分号,或者直接 在最后加 Null. 当 Mathematica 读入文件时发现语法错误,它就报告此错误,忽略文件余下的部分, 返回值为 $Failed. 但如果语法错误发生在使用 BeginPackage 和其它上下文操作函数 的程序包中,Mathematica 就尽量恢复读入程序包以前的状态.,向文件中写表达式,将一个表达式写入文件 In4:= tmp 这是该文件的内容 In5:= 在同一文件中加了另一 In6:=,表达式此时文件中有两个表达式 In7:= 用 expr file 时,Mathematica 把新表达式加在文件之后,而用 expr

26、file 时,Mathematica 清除文件中所有内容,然后把 expr 写入文件. 当用 或 向文件写入表达式时,这些表达式一般是用输入形式,以便再将他们读入 Mathematica. 有时需要用别的形式保存表达式,这可以通过将这些表达式包含在 OutputForm 等格式指令中来实现.,这是按输出形式将一个表达式写入文件 tmp In8:= 此时 tmp 文件中的表达式是输出形式 In9:=,使用文件的最常用目的是保存 Mathematica 对象的定义,以便在随后的 Mathematica 对话中再读入它们. 算符 和 将表达式保存在文件中. 也可以用函数 Save 按适当的形式去保存

27、 Mathematica 对象的完整定义以便在随后 的 Mathematica 对话中执行.,写出定义,给符号 a 指定一个值 In10:= Out10= 用 Save 将a的定义写入文件 In11:= 这是在文件中保存的定义 In12:=,在 Mathematica 中定义一个对象时,该定义常常依赖于前面定义的其它对象. 如果要在后面的 Mathematica 对话中重新构造这个对象的定义,这就需要保存该定义 本身和与它有关的其它对象的定义. 函数 Save 检查要保存的定义,自动地保存 与它们有关的定义. 但为了不存入太多不必要的内容,Save 不包含属性为 Protected 的符号的定

28、义.它认为这些符号的定义是内部给出的. 为了照顾 这些定义,在一个新的 Mathematica 对话中读入从 Save 产生的输出时, 必须保证对象的定义与以前的完全一致. 函数 Save 利用输出形式 Definition 和 FullDefinition,它们显示 Mathematica 符号的定义. 有时直接用这些输出形式是很方便的.输出形式 Definitionf 是 f 的定义序列,建立 Mathematica 输入文件时,通常文件仅包含可直接阅读和修改的文本, 有时还需要对文件编码,使得它们不能直接阅读和修改,但还要求此文件 能调入 Mathematica 内.这可以用 Mathe

29、matica 函数 Encode 实现.,产生和读入代码文件 将表达式按简明文本形式写入文件 tmp In18:= 将文件 tmp 的代码形式写入文件 tmp.x In19:= 这里是代码文件的内容,能识别的部分仅是在开头的 Mathematica 注解 In20:=,即使代码文件,也可以用 读入 Mathematica In21:= Out21=,按 Mathematica 内部格式保存定义 在必须读入很大或很复杂的定义时,按 Mathematica 内部格式保存比 按文本保存方便. 这可以用 DumpSave 实现. 按 Mathematica 内部格式保存f的定义 In22:= Out2

30、2= f 仍可用 去读入这个定义,当一个文件含有 Mathematica 内部定义时, 能识别它并进行相应的操作. Mathematica 内部格式在不同的计算机系统有细微的差异. 于是在一个计算机上 产生的 .mx 一般不能在别的计算机上读入. 用 DumpSave“package“, . 时,Mathematica 就将定义写到名为 package.mx/system/package.mx 等文件中,其中 system 指明所使用的 计算机系统. 这里产生的文件名反映了所使用的计算机系统 In24:= Out24= f , 自动选择名称与所用计算机系统相关的文件 In25:=保存Mathematica的完整状态,第8章结束 谢谢!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报