8Mathematica编程与例题d.doc_第1页
8Mathematica编程与例题d.doc_第2页
8Mathematica编程与例题d.doc_第3页
8Mathematica编程与例题d.doc_第4页
8Mathematica编程与例题d.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章 Mathematica编程语句与例题8.1全局变量、局部变量、过程8.1.1全局变量我们知道, 变量是在命令或程序执行中其值可以发生变化的,在任何计算机语言中程序中,变量作用是非常重要的。一个变量在没有被赋值之前, 对应的变量名只是数学意义中的符号, 一旦被赋值, 对应的变量名就是被赋值的内容。利用变量可以方便地进行计算和保存中间的计算结果。例如: 在Mathematica的Notebook中键入 In1:= x*x x + 1 Out1=1- x - x2 (*这里x没有被赋值,故它只是一个符号,输入变为一个数学式子 In2: = x = 2+2 (*变量x存放了计算结果4 Out2= 4 In3:= x*x x + 1 (*这里x已经有值4,计算机自动用4代替x参与计算 Out3= 13如果要想使变量还原为一个符号,使用清除变量命令即可。这种在Mathematica中键入的各种命令或在Mathematica的程序语句中, 变量被赋值后, 必须用Mathematica清除变量的命令才能使其还原为符号的变量, 称为全局变量。上面例子中的变量x就是一个全局变量。察看某变量是否为全局变量,可以键入命令:?变量名如果显示结果出现Global变量名说明该变量是全局变量,否则,就不是全局变量。 例如要知道变量w是否为全局变量,可以键入: ? w键入执行命令后,显示结果 Globalw w = 2 说明w是全局变量,且有数值2。如果用户自己定义了函数,Mathematica会把自定义的函数名作为全局变量,此时,如果键入命令: ?自定义函数名可以看到全局变量的说明和该自定义的函数的定义信息。8.1.2 局部变量由于Mathematica中的变量名还可以用作代数中的数学符号,在Mathematica的命令或程序中出现的任何合法的变量名符号,如果该变量名所代表的变量没有被赋值,则它就作为数学算式中的符号参与数学的公式推导和运算;如果该变量被赋值了,则用该变量所赋的值参与对应的数学公式推导和运算。因此,当用户在做符号运算时使用的符号含有被赋了值的变量名,则就会出现察觉不到的错误。为克服这种错误,可以在使用Mathematica的命令之前, 先用Clear 变量1,变量2,将要使用的所有变量名做清除处理, 就可以避免上述错误。不过, 如果使用Mathematica提供的”Module”模块结构,可使Module模块内的一些变量在被赋值后, 既使不作变量清除的处理,也不影响在Module模块之外同名变量, 即:变量的赋值效果只在Module模块内有效。不同于全局变量, 称变量的赋值效果只在某一模块内有效的变量为局部变量。局部变量有利于程序的模块化结构和数据封装, 而且离开Module模块后, 自动释放这些变量在计算机内存的空间。一个好的程序员应该尽量使用局部变量。 Mathematica 中Module模块的命令为:Module变量表, 表达式 这里变量表中出现的每个变量都是局部变量,它们之间用逗号分隔, 而且可以用赋值语句给其赋初值, 这些变量只在该Module模块命令中的表达式有效,表达式可以是用分号隔开的表达式序列,且以最后一个表达式的值作为该Module模块命令的值。例如: 在Mathematica键入 In4:= u=5; In5: = s=Moduleu, v=1, u=1; v=u+v+3 (*Module中的u,v是局部变量, 且v赋值1, 完成的计算是u=1和v=u+v+3,并将v的值赋给s Out5= 5 (*显示Module模块命令的值。 In6:= Printu, , v, ,s (*显示变量u, v, s的值 Out6= 5 v 5 (*说明Module模块命令中的u, v与命令外的u, v不同在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 (*x$1表示是局部变量此时命令中的变量s, u就是局部变量, 它们的值将不会影响随后的命令。 8.1.3 过程 在Mathematica中,一个用分号隔开的表达式序列称为一个复合表达式,它也称为一个过程。由于 Mathematica中的表达式是广义的表达式,除了数学中定义的表达式之外,数字、表、变量、函数、图形、命令、语句等都是Mathematica表达式。因此, Mathematica的一个复合表达式可以起到通常计算机编程语言中过程的作用, 运行Mathematica中的一个过程就是依次执行过程中的每个表达式,且过程中最后一个表达式的值作为该过程的值。例如: In11:=s=1;u=s+3;u*u Out11=16 (*显示u*u的值 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条件控制语句 条件语句在涉及选择问题时经常用到, 它也是编写较复杂程序的主要语句之一。Mathematica涉及条件选择的语句有好几种,这里介绍常用的三种语句: 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 功能:根据条件的成立与否确定执行哪一个语句, 具体执行为:条件成立时,执行语句1,条件不成立时,执行语句2,否则,执行语句3, 并将语句执行结果作为If语句的值。 注意: 命令形式2是最常见的二分支条件语句, 多用于二选一问题, 命令形式3是命令形式2的扩展形式,它除了具有命令形式2的功能外,还可以检查出条件里因为含有没被赋值的变量等一些不能进行条件求值问题。此外,上述命令中的各语句可以是复合表达式。 例题例1. 用Mathematica命令描述下面问题:先产生一个函数0,1内的随机实数,再判断该随机数是否小于0.5, 如果小于0.5, 则将此随机数显示出来,否则显示”*”。解: Mathematica 命令为: In1:= p= Random; Ifp0.5, p, “*” ( 或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, 条件2为x3,则条件2对应的语句2将永远不能执行,当然,我们也可以利用Which语句的这一特点,使其中的一些条件关系式写的更简单些,如:条件1为x1, 条件2为1 x3,则我们就可以把条件2写成更简单的x0时方程有两个实根; 当D0,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,xn),定义一个可以计算如下三中向量范数的函数:解:当x为向量时, Absx表示由x的每个分量都取绝对值后构成的向量, Lengthx表示向量的元素个数,为定义所要函数,选取向量x及指示范数类型的变量p作为函数的变量,规定p=1时,代表|x|1 ,定p=2时,代表|x|2 , p取其他数时,代表|x| ,利用Which命令有: In12:= normx_,p_:=Whichp=1,SumAbsxi,i,1, Lengthx, p=2,SqrtSumAbsxi2,i,1, Lengthx, True,MaxAbsxIn13:=x=3, -4, 0;In14:= normx,1Out14=7In15:= normx,2Out15=5In16:= normx,0Out16=4例6 写出分段函数的Mathematica自定义函数形式,并画出其在0,60上的图形。解: 因此Mathematica 命令为: In17:=fx_:= Whichx=0,0,x=10,10+2x,x=20,30,x=40,30-(x-20)/2, x=50,20,x60,0 In18:= Plotfx,x,0,608.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 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 38.3循环控制语句 循环控制语句在涉及重复执行同一类型操作时经常用到, 它可以使程序简化,提高运行效率,是编写较复杂程序的主要语句之一。Mathematica的循环控制语句有三种语句: Do 语句,For语句,While语句,其中Do语句常用于有固定循环次数的循环问题,而For语句和While语句常用于含有由条件控制执行循环体的循环问题,这些循环控制结构整体的值都是Null。为处理有时需要中途退出循环语句的问题, Mathematica 还提供了在执行循环语句时退出循环体的语句: Returnexpr 退出函数所有过程和循环,返回expr值 Break 结束本层循环 Continue 转向本层For语句或While语句的下一次循环此外,在Mathematica的循环结构中,使用如下表示式,可以达到简洁,快速的目的.k+ 表示赋值关系 k = k+1 , 如: k=1;Tablek+,5获得表1,2,3,4,5+k 表示先处理k的值,再做赋值 k=k+1, 如: k=1;Table+k,5获得表2,3,4,5,6k- 表示赋值关系 k = k-1, 如: k=1;Tablek-,5获得表1, 0, -1, -2, -3-k 表示先处理k的值,再做赋值 k=k-1,如:k=1;Table-k,5获得表0,-1,-2,-3,-4x,y=y,x 表示交换x与y 值x+=k 表示 x = x + kx*=k 表示 x = x * k8.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, jmin, jmax 功能:对循环变量i为imin,imin+1,imin+2,imax每个值, 再按循环变量j的循环执行表达式expr。这是通常所说的二重循环命令,类似的,可以用在Do命令中再加循环范围的方法得到多重循环命令。 注意: 上述命令形式中的表达式expr一般是复合表达式,以便起到可以描述循环体的功能,此外, imin与 imax当有关系imin, imax还可以检查出条件里因为含有没被赋值的变量等一些不能进行条件求值问题。 例题例8 找出300至500之间同时能被3和11整除的自然数。解: Mathematica 命令为: In23:= DoIfModi,13= 0 & Modi,3= 0,Printi,i,300,500 312 351 390 429 Out23= 468例9 找出如下方程在0,100内的整数解。解:从第一个方程解出z=100-x-y,利用x和y值在0,1,100的二重循环, 先计算出z值,带入第二个方程比较是否成立等式,如果成立,则得一组整数解,显示对应的x,y,z值,Mathematica 命令为: In24:= Doz =100 x - y; 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开始到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 语句 命令形式:Forstat,test,incr,body功能:以stat为初值,重复计算incr和body直到test为False终止 。这里start为初始值,test为条件,incr为循环变量修正式,body为循环体,通常由incr项控制test的变化。 注意: 上述命令形式中的start可以是由复合表达式提供的多个初值,如果循环体生成 Break 语句,则退出For循环; 如果循环体生成Continue 语句,则由incr的增量进入For语句的下一次循环。 例题例11 指出语句For i=1;t=x,i*i10,i+,t-;Printt的初始值,条件,循环变量修正式和循环体, 分析执行过程和显示结果。解: 初始值为i=1;t=x, i为循环变量;条件为i*i10;循环变量修正式为i+;循环体为t-;Printt;执行过程为: 先把变量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 语句 命令形式: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|10-12,x2=x1-(x1-x0)*fx1/(fx1-fx0);x0=x1;x1=x2In29:= Nx1,12Out29= -0.487120155928例13 编制20以内整数加法自测程序解:用随机函数RandomInteger,0,10产生0,10内的任意两个整数s和t, 屏幕提示算式t+s=,用户键入一个计算结果y,如果结果正确,显示Good,否则显示Wrong!Try again!,等待重新输入,直到结果正确,每次给出10个算式,相应命令为:In30:=For i=1,i=10,i+, (*i控制循环次数 t=RandomInteger,0,10; s=RandomInteger,0,10; (*产生两个整数 Printt,+,s,=; (*提示算式t+s= y=Input; (*等待用户键入一个计算结果给y 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 Wong!Ttry again!7+3=10 Good例14 韦达(VieTa)在1593年首次给出了如下关于圆周率p的关系式(韦达公式)试用韦达公式来写出计算圆周率p近似值的Mathematica命令。解: 利用Mathematica自定义函数命令可以输入Mathematica命令为:In31:= vietak_:=Moduleu, u=NProductCosPi/2(n+1),n,1,k,20; Return2/u *用Return2/u 返回p的近似值 In32:= Tablen, v=vietan, NPi,20- v ,n,1,10,2 *打印出vieta1,vieta3,vieta9及其对应的误差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 从计算结果可以看出韦达公式随乘积因子的增加收敛于圆周率p的情况。 8.3.4 迭代语句在数值计算中,经常遇到要进行迭代计算,即利用迭代格式: xk+1=j(x k), 已知x 0 来求出迭代序列x 1,x 2,这里迭代函数j为已知函数,Mathematica 有如下几个命令处理这类问题: 命令形式1:Nest迭代函数j, 迭代初值x0,迭代次数n 功能:根据迭代初值x0及迭代格式:xk+1=j(xk), 计算出xn ,并将此值作为Nest语句的值。 命令形式2:NestList迭代函数j, 迭代初值x0,迭代次数n 功能:根据迭代初值x0及迭代格式:xk+1=j(xk), 计算出x 1,x 2,xn ,并将 x 0,x 1,x 2,xn 作为NestList语句的值。 注意: 上述命令中,将如果x0换成一个没有值的变量名x,则产生自复合函数,此外,迭代函数j(x)应该写为 j ,不能写为j(x). 例题例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= l 数学实验:Logistic方程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论