241525第八章+Mathematica编程语句与例题.ppt
第八章第八章 Mathematica编程语句与例题编程语句与例题 北京交通大学北京交通大学8.1全局变量、局部变量、过程全局变量、局部变量、过程 8.1.1全局变量全局变量 在Mathematica中键入的各种命令或在Mathematica的程序语句中,变量被赋值后,必须用Mathematica清除变量的命令才能使其还原为符号的变量,称为全局变量全局变量。察看某变量是否为全局变量,可以键入命令:?变量名变量名Global变量名变量名 说明该变量是全局变量,否则,就不是全局变量。例如例如:要知道变量w是否为全局变量,可以键入:?w键入执行命令后,显示结果 Globalw w=2 说明w是全局变量,且有数值2。8.1.2 局部变量局部变量o在在Mathematica的命令或程序中出现的任何合法的变量名的命令或程序中出现的任何合法的变量名符号,如果该变量名所代表的变量没有被赋值,则它就作为符号,如果该变量名所代表的变量没有被赋值,则它就作为数学算式中的符号参与数学的公式推导和运算;如果该变量数学算式中的符号参与数学的公式推导和运算;如果该变量被赋值了,则用该变量所赋的值参与对应的数学公式推导和被赋值了,则用该变量所赋的值参与对应的数学公式推导和运算。因此,当用户在做符号运算时使用的符号含有被赋了运算。因此,当用户在做符号运算时使用的符号含有被赋了值的变量名,则就会出现察觉不到的错误。为克服这种错误,值的变量名,则就会出现察觉不到的错误。为克服这种错误,可以在使用可以在使用Mathematica的命令之前的命令之前,先用先用Clear 变量变量1,变量变量2,将要使用的所有变量名做清除处理将要使用的所有变量名做清除处理,就可以避就可以避免上述错误。免上述错误。o不同于全局变量不同于全局变量,称变量的赋值效果只在某一模块内有效的称变量的赋值效果只在某一模块内有效的变量为变量为局部变量局部变量。Mathematica 中中Module模块的命令为模块的命令为:Module变量表变量表,表达式表达式 例如例如:在Mathematica键入 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的值将会影响随后的命令的值将会影响随后的命令,如果写成如果写成 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个元素的一个数表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条件控制语句条件控制语句lMathematica涉及条件选择的语句有好几种,这里介绍常用的三种语句:if 语句语句,Which 语句语句,Switch 语句语句。8.2.1 If 语句语句lIf 语句的一般形式为语句的一般形式为:If 条件条件,语句或语句列语句或语句列具体形式有l 命令形式命令形式1:If 条件条件,语句语句1 功能:功能:如果条件成立,则执行对应的语句1,并将语句执行结果作为If语句的值,如果条件不成立,不执行语句1。l 命令形式命令形式2:If 条件条件,语句语句1,语句语句2 功能:功能:根据条件的成立与否确定执行哪一个语句,具体执行为:条件成立时,执行语句1,否则,执行语句2,并将语句执行结果作为If语句的值。l 命令形式命令形式3:If 条件条件,语句语句1,语句语句2,语句语句3功能:功能:根据条件的成立与否确定执行哪一个语句,具体执行为:条件成立时,执行语句1,条件不成立时,执行语句2,否则,执行语句3,并将语句执行结果作为If语句的值。例例1:用用Mathematica命令描述下面问题命令描述下面问题:先产生一个函数先产生一个函数0,1内的内的随机实数随机实数,再判断该随机数是否小于再判断该随机数是否小于0.5,如果小于如果小于0.5,则将此则将此随机数显示出来随机数显示出来,否则显示否则显示”*”。n解解:Mathematica 命令为:In1:=p=Random;Ifp0.5,p,“*”Out1=0.202857In2:=If(p=Random)0.5,p,“*”)Out2=*例例2:写出分段函数的Mathematica自定义函数形式,并画出其在3,3上的图形n解解:因此Mathematica 命令为:In3:=fx_:=Ifx1,x+Sinx,x*Cosx (或或fx_:=Ifx0时方程有两个实根;当0,two real roots,0,two real roots,w0,two complex w0,two complex roots,wroots,w=0,duplicate roots)=0,duplicate roots)In9:=g0,1,2In9:=g0,1,2Out9=two real rootsOut9=two real rootsIn10:=g3,1,2In10:=g3,1,2Out10=two complex rootsOut10=two complex rootsIn11:=g3,0,0In11:=g3,0,0Out11=duplicate rootsOut11=duplicate roots 例例5 任给向量x=(x1,x2,xn),定义一个可以计算如下三中向量范数的函数:n解解:n In12:=normx_,p_:=Whichp=1,SumAbsxi,i,1,Lengthx,p=2,SqrtSumAbsxi2,i,1,Lengthx,True,MaxAbsx In13:=x=3,-4,0;In14:=normx,1 Out14=7 In15:=normx,2 Out15=5 In16:=normx,0 Out16=4例例6:写出分段函数的Mathematica自定义函数形式,并画出其在0,60上的图形。n解解:因此Mathematica 命令为:In17:=fx_:=Whichx=0,0,x=10,10+2x,x=20,30,x=40,30-(x-20)/2,x=50,20,x60,0 nIn18:=Plotfx,x,0,60 8.2.3 Switch 语句语句l命令形式:命令形式:Switch表达式表达式,模式模式1,语句语句1,模式模式2,语句语句2,.模式模式n,语句语句n l功能功能:先计算表达式,然后按模式1,模式2,的顺序依次比较与表达式结果相同的模式,找到的第一个相同的模式,则将此模式对应的语句计算计算结果作为Switch语句的结果。Switch语句是根据表达式的执行结果来选择对应的执行语句,它类似于一般计算机语言的Case语句 例例7:用函数描述如下结果:任给一个整数x,显示它被3除的余数。解解:MathematicaMathematica自定义函数自定义函数:lIn19:=In19:=fxfx_:=SwitchModx,3,_:=SwitchModx,3,0,Print0 is the remainder on division of,x,by 3,0,Print0 is the remainder on division of,x,by 3,1,Print1 is the remainder on division of,x,by 3,1,Print1 is the remainder on division of,x,by 3,2,Print2 is the remainder on division of,x,by 3 2,Print2 is the remainder on division of,x,by 3 lIn20:=f126 In20:=f126 lOut20=0 is the remainder on division of 126 by 3Out20=0 is the remainder on division of 126 by 3lIn21:=f346 In21:=f346 lOut21=1 is the remainder on division of 346 by 3Out21=1 is the remainder on division of 346 by 3lIn22:=f599 In22:=f599 lOut22=2 is the remainder on division of 599 by 3Out22=2 is the remainder on division of 599 by 38.3循环控制语句循环控制语句lMathematica的循环控制语句有三种语句的循环控制语句有三种语句:Do 语句语句,For语句语句,While语句语句。为处理有时需要中途退出循环语句的问题为处理有时需要中途退出循环语句的问题,Mathematica 还提供了在执还提供了在执行循环语句时退出循环体的语句行循环语句时退出循环体的语句:l Returnexpr 退出函数所有过程和循环退出函数所有过程和循环,返回返回expr值值l Break 结束本层循环结束本层循环l Continue 转向本层转向本层For语句或语句或While语句的下一次循环语句的下一次循环在在Mathematica的循环结构中的循环结构中,使用如下表示式使用如下表示式,可以达到简洁可以达到简洁,快速的目的快速的目的.lk+表示赋值关系表示赋值关系 k=k+1,l+k 表示先处理表示先处理k的值的值,再做赋值再做赋值 k=k+1lk-表示赋值关系表示赋值关系 k=k-1l-k 表示先处理表示先处理k的值的值,再做赋值再做赋值 k=k-1 lx,y=y,x 表示交换表示交换x与与y 值值lx+=k 表示表示 x=x+klx*=k 表示表示 x=x*k8.3.1 Do 语句语句Do 语句的一般形式为 Do循环体循环体,循环范围循环范围具体形式有l命令形式命令形式1:Doexpr,n 功能:功能:循环执行n次表达式expr。l命令形式命令形式2:Doexpr,i,imin,imax 功能:功能:按循环变量i 为imin,imin+1,imin+2,imax循环执行imax-imin+1次表达式expr。l命令形式命令形式3:Doexpr,i,imin,imax,d 功能:功能:按循环变量i 为imin,imin+d,imin+2d,imin+nd,循环执行(imax-imin)/d+1次表达式expr。l命令形式命令形式4:Doexpr,i,imin,imax,j,jmin,jmax 功能:功能:对循环变量i为imin,imin+1,imin+2,imax每个值,再按循环变量j的循环执行表达式expr。这是通常所说的二重循环命令,类似的,可以用在Do命令中再加循环范围的方法得到多重循环命令。例例8 找出300至500之间同时能被3和11整除的自然数。n解解:Mathematica 命令为:In23:=DoIfModi,13=0&Modi,3=0,Printi,i,300,500 312 351 390 429 Out23=468n例例9 找出方程在0,100内的整数解。n解解:nIn24:=Doz=100 x-y;If5x+3y+z/3=100,Printx=,x,y=,y,z=,z,x,0,100,y,0,100n得解x=0 y=25 z=75x=4 y=18 z=78x=8 y=11 z=81x=12 y=4 z=84例例10 对自然数对自然数k从从1开始到开始到10,取取s=1做赋值做赋值s=s*k,并显示对应的值并显示对应的值,直到直到s的值的值5终止。终止。解解:In25:=s=1;Dos*=k;Prints;Ifs5,Break,k,1,10 1 2 68.3.2 For 语句语句 l命令形式:命令形式:Forstat,test,incr,bodyl功能功能:以stat为初值,重复计算incr和body直到test为False终止。这里start为初始值,test为条件,incr为循环变量修正式,body为循环体,通常由incr项控制test的变化。l注意注意:上述命令形式中的start可以是由复合表达式提供的多个初值,如果循环体生成 Break 语句,则退出For循环;如果循环体生成Continue 语句,则由incr的增量进入For语句的下一次循环。l n例例11 指出语句指出语句For i=1;t=x,i*i10,i+,t-;Printt的初始值的初始值,条件条件,循环变量修正式和循环体循环变量修正式和循环体,分析执行过分析执行过程和显示结果。程和显示结果。n解解:初始值为初始值为i=1;t=x,i为循环变量;条件为为循环变量;条件为i*i10;循;循环变量修正式为环变量修正式为i+;n循环体为循环体为t-;Printt;执行过程为;执行过程为:n 先把变量先把变量i赋初值赋初值1,变量变量t赋初值赋初值x,因为因为1*110满足满足i*i10,故执行故执行i+,t-;Printt的操作的操作,i+对对i做加做加1操操作作,使使i取值为取值为2,执行循环体执行循环体t-后后,t值变为值变为x-1,Printt的显示结果为的显示结果为“-1+x”。进入第二次循环时。进入第二次循环时,先判别条先判别条件是否成立件是否成立,因为有因为有2*210满足条件满足条件i*i10不满足条件i*i10,故退出For循环。8.3.3 While 语句语句 l命令形式:命令形式:Whiletest,bodyl功能:功能:当当test为True时,计算body,重复对test的判断和body的计算,直到test不为True时终止。这里test为条件,body为循环体,通常由body控制test值的变化。如果test不为True,则循环体不做任何工作l注意注意:上述命令中,如果循环体生成 Break 语句,则退出While循环。例例12:12:用割线法求解方程x3-2x2+7x+4=0的根,要求误差|xk-xk-1|10-12,x2=x1-(x1-In28:=WhileAbsx0-x110-12,x2=x1-(x1-x0)*fx1/(fx1-fx0);x0=x1;x1=x2x0)*fx1/(fx1-fx0);x0=x1;x1=x2lIn29:=Nx1,12In29:=Nx1,12lOut29=-0.487120155928Out29=-0.487120155928例例1313 编制编制2020以内整数加法自测程序以内整数加法自测程序解解:In30:=For i=1,i=10,i+,In30:=For i=1,i=10,i+,t=RandomInteger,0,10;t=RandomInteger,0,10;s=RandomInteger,0,10;s=RandomInteger,0,10;Printt,+,sPrintt,+,s,=;,=;y=Input;y=Input;WhileyWhiley!=!=t+st+s,Printt,+,sPrintt,+,s,=,y,Wong!Try again!;,=,y,Wong!Try again!;Printt,+,sPrintt,+,s,=;y=Input;,=;y=Input;Printt,+,sPrintt,+,s,=,y,Good,=,y,Good l执行结果为执行结果为3+0=3+0=3+0=3 Good3+0=3 Good7+3=12 7+3=12 Wong!TtryWong!Ttry again!again!7+3=10 Good7+3=10 Good例例14 韦达(韦达(VieTa)在)在1593年首次给出了如下关于圆周率年首次给出了如下关于圆周率 的关系式(韦达公式)的关系式(韦达公式)n试用韦达公式来写出计算圆周率试用韦达公式来写出计算圆周率 近似值的近似值的Mathematica命令。命令。解解:n利用利用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,10,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),已知已知x 0 来求出迭代序列来求出迭代序列x 1,x 2,这里迭代函数这里迭代函数 为已知函数为已知函数,Mathematica 有有如下几个命令处理这类问题如下几个命令处理这类问题:l命令形式命令形式1:Nest迭代函数迭代函数,迭代初值迭代初值x0,迭代次数迭代次数n 功能:根据迭代初值功能:根据迭代初值x0及迭代格式及迭代格式:xk+1=(xk),计算出计算出xn,并将此值作并将此值作为为 Nest语句的值。语句的值。l命令形式命令形式2:NestList迭代函数迭代函数,迭代初值迭代初值x0,迭代次数迭代次数n 功能:根据迭代初值功能:根据迭代初值x0及迭代格式及迭代格式:xk+1=(xk),计算出计算出x 1,x 2,xn,并将并将 x 0,x 1,x 2,xn 作为作为NestList语句的值。语句的值。例例1515 根据迭代格式根据迭代格式:x:xk+1k+1=lg(x=lg(xk k+2),+2),及迭代初值及迭代初值x0=1.0,x0=1.0,(1)(1)计算出计算出x7,x7,(2)(2)显示显示 x0,x1,x2,x0,x1,x2,x7,x7(3)(3)显示显示lg(x+2)lg(x+2)的的1,21,2次自复合函数次自复合函数l解解:MathematicaMathematica命令为命令为In33:=In33:=qxqx_:=Log10,x+2 _:=Log10,x+2 In34:=Nestq,1.,7In34:=Nestq,1.,7Out34=0.375816 Out34=0.375816 In35:=NestListq,1.,7In35:=NestListq,1.,7Out35=1.,0.477121,0.393947,0.379115,0.376415,Out35=1.,0.477121,0.393947,0.379115,0.376415,0.375922,0.375832,0.3758160.375922,0.375832,0.375816In36:=In36:=NestListqNestListq,x,2 ,x,2 Out36=Out36=读写 Mathematica 文件 l当使用基于文本的 Mathematica 界面时,就需要经常读写含有定义和结果的文件.读文件 l显示文件 factors 的内容 lIn1:=l读入一个文件,返回值是文件的最后一个表达式 lIn2:=lOut2=l当 Mathematica 找不到所要文件时,它显示一个信息,返回值为$Failed lIn3:=lOut3=$Failed lMathematica 的输入文件可以包含任意数目的表达式.每个表达式必须从新的一行开始,它 可以占有许多行.在交互式的 Mathematica 对话中,当表达式完成后 就进行处理.但是在一个文件中,可以在任何位置插入一个空行,这不产生任何影响.l用 file 时,Mathematica 把新表达式加在文件之后,而用 expr file 时,Mathematica 清除文件中所有内容,然后把 expr 写入文件.当用 或 向文件写入表达式时,这些表达式一般是用输入形式,以便再将他们读入 Mathematica.有时需要用别的形式保存表达式,这可以通过将这些表达式包含在 OutputForm 等格式指令中来实现.l这是按输出形式将一个表达式写入文件 tmplIn8:=l此时 tmp 文件中的表达式是输出形式lIn9:=l使用文件的最常用目的是保存 Mathematica 对象的定义,以便在随后的 Mathematica 对话中再读入它们.算符 和 将表达式保存在文件中.也可以用函数 Save 按适当的形式去保存 Mathematica 对象的完整定义以便在随后 的 Mathematica 对话中执行.写出定义 l给符号 a 指定一个值 lIn10:=lOut10=l用 Save 将a的定义写入文件lIn11:=l这是在文件中保存的定义lIn12:=l在 Mathematica 中定义一个对象时,该定义常常依赖于前面定义的其它对象.如果要在后面的 Mathematica 对话中重新构造这个对象的定义,这就需要保存该定义 本身和与它有关的其它对象的定义.函数 Save 检查要保存的定义,自动地保存 与它们有关的定义.但为了不存入太多不必要的内容,Save 不包含属性为 Protected 的符号的定义.它认为这些符号的定义是内部给出的.为了照顾 这些定义,在一个新的 Mathematica 对话中读入从 Save 产生的输出时,必须保证对象的定义与以前的完全一致.l函数 Save 利用输出形式 Definition 和 FullDefinition,它们显示 Mathematica 符号的定义.有时直接用这些输出形式是很方便的.输出形式 Definitionf 是 f 的定义序列l建立 Mathematica 输入文件时,通常文件仅包含可直接阅读和修改的文本,有时还需要对文件编码,使得它们不能直接阅读和修改,但还要求此文件 能调入 Mathematica 内.这可以用 Mathematica 函数 Encode 实现.l产生和读入代码文件l将表达式按简明文本形式写入文件 tmplIn18:=l将文件 tmp 的代码形式写入文件 tmp.xlIn19:=l这里是代码文件的内容,能识别的部分仅是在开头的 Mathematica 注解lIn20:=l l即使代码文件,也可以用 读入 Mathematica lIn21:=lOut21=l按 Mathematica 内部格式保存定义l在必须读入很大或很复杂的定义时,按 Mathematica 内部格式保存比 按文本保存方便.这可以用 DumpSave 实现.l按 Mathematica 内部格式保存f的定义lIn22:=lOut22=f l仍可用 去读入这个定义 l当一个文件含有 Mathematica 内部定义时,能识别它并进行相应的操作.Mathematica 内部格式在不同的计算机系统有细微的差异.于是在一个计算机上 产生的.mx 一般不能在别的计算机上读入.用 DumpSavepackage,.时,Mathematica 就将定义写到名为 package.mx/system/package.mx 等文件中,其中 system 指明所使用的 计算机系统.l这里产生的文件名反映了所使用的计算机系统lIn24:=lOut24=f l 自动选择名称与所用计算机系统相关的文件lIn25:=l保存Mathematica的完整状态第8章结束谢谢!