《Mathematica编程.ppt》由会员分享,可在线阅读,更多相关《Mathematica编程.ppt(28页珍藏版)》请在三一办公上搜索。
1、第十讲 Mathematica编程,8.1全局变量、局部变量、过程 8.1.1全局变量,在Mathematica中键入的各种命令或在Mathematica的程序语句中,变量被赋值后,必须用Mathematica清除变量的命令才能使其还原为符号的变量,称为全局变量。察看某变量是否为全局变量,可以键入命令:?变量名Global变量名 说明该变量是全局变量,否则,就不是全局变量。例如:要知道变量w是否为全局变量,可以键入:?w键入执行命令后,显示结果 Globalw w=2 说明w是全局变量,且有数值2。,8.1.2 局部变量,在Mathematica的命令或程序中出现的任何合法的变量名符号,如果该
2、变量名所代表的变量没有被赋值,则它就作为数学算式中的符号参与数学的公式推导和运算;如果该变量被赋值了,则用该变量所赋的值参与对应的数学公式推导和运算。因此,当用户在做符号运算时使用的符号含有被赋了值的变量名,则就会出现察觉不到的错误。为克服这种错误,可以在使用Mathematica的命令之前,先用Clear 变量1,变量2,将要使用的所有变量名做清除处理,就可以避免上述错误。不同于全局变量,称变量的赋值效果只在某一模块内有效的变量为局部变量。,Mathematica 中Module模块的命令为:Module变量表,表达式 例如:在Mathematica键入 In4:=u=5;In5:=s=Mo
3、duleu,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=Cosx2-Sinx2命令中的变量s,u的值将会影响随后的命令,如果写成 In10:=Modules,u,x,s=Sinx;u=Cosx;Ds*u,x Out10=Cosx
4、$12-Sin x$12 此时命令中的变量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=Ma
5、xx;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涉及条件选择的语句有好几种,这里介绍常用的三种语句:if 语句,Which 语句,Switch 语句。8.2.1 If 语句If 语句的一般形式为:If 条件,语句或语句列具体形式有 命令形式1:If
6、 条件,语句1 功能:如果条件成立,则执行对应的语句1,并将语句执行结果作为If语句的值,如果条件不成立,不执行语句1。命令形式2:If 条件,语句1,语句2 功能:根据条件的成立与否确定执行哪一个语句,具体执行为:条件成立时,执行语句1,否则,执行语句2,并将语句执行结果作为If语句的值。命令形式3:If 条件,语句1,语句2,语句3 功能:根据条件的成立与否确定执行哪一个语句,具体执行为:条件成立时,执行语句1,条件不成立时,执行语句2,否则,执行语句3,并将语句执行结果作为If语句的值。,例1:用Mathematica命令描述下面问题:先产生一个函数0,1内的随机实数,再判断该随机数是否
7、小于0.5,如果小于0.5,则将此随机数显示出来,否则显示”*”。解:Mathematica 命令为:In1:=If(p=Random)0.5,p,*Out1=0.202857In2:=If(p=Random)0.5,p,*Out2=*例2:写出分段函数的Mathematica自定义函数形式,并画出其在3,3上的图形解:因此Mathematica 命令为:In3:=fx_:=Ifx1,x+Sinx,x*Cosx(或fx_:=Ifx1,x+Sinx,x*Cosx,err)In4:=Plotfx,x,-3,3,例3 定义一个函数描述下面问题:任给一个函数y(x),如果y(x)的一阶导数为零,则输出
8、符号#,否则,输出y(x)+5解:Mathematica 命令为:In5:=fy_,x_:=Modules,s=Dy,x;Ifs=0,Return#;s=s+5;ReturnsIn6:=f3,xOut6=#In7:=fTanx,xOut7=5+Sec2x,8.2.2 Which 语句,命令形式1:Which条件1,语句1,条件2,语句2,.,条件n,语句n功能:由条件1开始按顺序依次判断相应的条件是否成立,若第一个成立的条件为条件k,则执行对应的语句k。命令形式2:Which条件1,语句1,条件2,语句2,.,条件n,语句n,True,字符串功能:由条件1开始按顺序依次判断相应的条件是否成立,
9、若第一个成立的条件为条件k,则执行对应的语句k,若直到条件n都不成立时,则返回符号字符串。,例4:写出一元二次方程ax2+bx+c=0判别根的类型的Mathematica自定义函数形式。解:一元二次方程根的判别式为=b2-4ac,当0时方程有两个实根;当0,two real roots,w0,two complex roots,w=0,duplicate roots)In9:=g0,1,2Out9=two real rootsIn10:=g3,1,2Out10=two complex rootsIn11:=g3,0,0Out11=duplicate roots,例5 任给向量x=(x1,x2,
10、xn),定义一个可以计算如下三中向量范数的函数:解: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上的图形。解:因此Mathematica 命令为:In17:=fx_:=Whichx60,0 In18:=Plotfx,x,0,6
11、0,8.2.3 Switch 语句,命令形式:Switch表达式,模式1,语句1,模式2,语句2,.模式n,语句n 功能:先计算表达式,然后按模式1,模式2,的顺序依次比较与表达式结果相同的模式,找到的第一个相同的模式,则将此模式对应的语句计算计算结果作为Switch语句的结果。Switch语句是根据表达式的执行结果来选择对应的执行语句,它类似于一般计算机语言的Case语句,例7:用函数描述如下结果:任给一个整数x,显示它被3除的余数。解:Mathematica自定义函数:In19:=fx_:=SwitchModx,3,0,Print0 is the remainder on division
12、 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 In20:=f126 Out20=0 is the remainder on division of 126 by 3In21:=f346 Out21=1 is the remainder on division of 346 by 3In22:=f599 Out22=2 is the remainder on division of 599 by 3,8.3循环控制语句,Mathe
13、matica的循环控制语句有三种语句:Do 语句,For语句,While语句。为处理有时需要中途退出循环语句的问题,Mathematica 还提供了在执行循环语句时退出循环体的语句:Returnexpr 退出函数所有过程和循环,返回expr值 Break 结束本层循环 Continue 转向本层For语句或While语句的下一次循环在Mathematica的循环结构中,使用如下表示式,可以达到简洁,快速的目的.k+表示赋值关系 k=k+1,+k 表示先处理k的值,再做赋值 k=k+1k-表示赋值关系 k=k-1-k 表示先处理k的值,再做赋值 k=k-1 x,y=y,x 表示交换x与y 值x+
14、=k 表示 x=x+kx*=k 表示 x=x*k,8.3.1 Do 语句,Do 语句的一般形式为 Do循环体,循环范围具体形式有命令形式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,
15、jmin,jmax 功能:对循环变量i为imin,imin+1,imin+2,imax每个值,再按循环变量j的循环执行表达式expr。这是通常所说的二重循环命令,类似的,可以用在Do命令中再加循环范围的方法得到多重循环命令。,例8 找出300至500之间同时能被3和11整除的自然数。解:Mathematica 命令为:In23:=DoIfModi,13=0 If5x+3y+z/3=100,Printx=,x,y=,y,z=,z,x,0,100,y,0,100得解x=0 y=25 z=75x=4 y=18 z=78x=8 y=11 z=81x=12 y=4 z=84,例10 对自然数k从1开始到
16、10,取s=1做赋值s=s*k,并显示对应的值,直到s的值5终止。解:In25:=s=1;Dos*=k;Prints;Ifs5,Break,k,1,10 1 2 6,8.3.2 For 语句,命令形式:Forstat,test,incr,body功能:以stat为初值,重复计算incr和body直到test为False终止。这里start为初始值,test为条件,incr为循环变量修正式,body为循环体,通常由incr项控制test的变化。注意:上述命令形式中的start可以是由复合表达式提供的多个初值,如果循环体生成 Break 语句,则退出For循环;如果循环体生成Continue 语句
17、,则由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的根,要求误差|xk-xk-1
18、|10(-12),x2=x1-(x1-x0)*fx1/(fx1-fx0);x0=x1;x1=x2In29:=Nx1,12Out29=-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,+,s,=,y,Good 执行结果为3+0=3+0=3 Good7+3=12 Wro
19、ng!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,10,2,8.3.4 迭代语句,在数值计算中,经常遇到要进行迭代计算,即利用迭代格式:xk+1=(x k),已知x 0
20、来求出迭代序列x1,x2,这里迭代函数为已知函数,Mathematica 有如下几个命令处理这类问题:命令形式1:Nest迭代函数,迭代初值x0,迭代次数n 功能:根据迭代初值x0及迭代格式:xk+1=(xk),计算出xn,并将此值作为 Nest语句的值。命令形式2:NestList迭代函数,迭代初值x0,迭代次数n 功能:根据迭代初值x0及迭代格式:xk+1=(xk),计算出x1,x2,xn,并将 x0,x1,x2,xn 作为NestList语句的值。,例15 根据迭代格式:xk+1=lg(xk+2),及迭代初值x0=1.0,(1)计算出x7,(2)显示 x0,x1,x2,x7(3)显示lg(x+2)的1,2次自复合函数解:Mathematica命令为In33:=qx_:=Log10,x+2 In34:=Nestq,1.,7Out34=0.375816 In35:=NestListq,1.,7Out35=1.,0.477121,0.393947,0.379115,0.376415,0.375922,0.375832,0.375816In36:=NestListq,x,2 Out36=,第十讲结束谢谢!,