在Mathematica中编制程序时,必须使程序中的各个部分尽可能
的独立,这样程序才便于读懂、维护和修改。确保程序各部分不相干的主要方法是设置具有一定作用域的变量。在Mathematica中有两种限制变量作用域的基本方法:模块(Module)和块(Block)。我们在书写实际程序中,模块比块更具普遍性。然而在交互式计算中需要定义作用域时,块更实用。
Module[vars,body]所要做的是把执行模块时表达式body的形
式看成Mathematica程序的“代码”。然而当“代码”中直接出现变量vats时,这些vars都将被看作局部的。Block[vats,body]并不查看表达式body的形式,而在整个计算Body的过程中,实用vars的局部值。
下例中我们根据i定义m:
ln[12]:=m=i^2 ’ Out[12]:=i
2
在计算i+m的整个过程中使用块中i的局部值:
h[13]:=BlockI(i;a),!+m]
Out[13]=a+a2
而对于下面的例子,只有直接出现在i+m中的i,才被看作局部变量:
In[14]:=Module[{i=a},i+m]
Out[14]=a+i‘
8.2.1 条件结构 我们在用计算机语言进行编程时,常用到条件语句。在Mathematica中也提供了多种设置条件的方法,并规定只有在该条件满足时才计算表达式。 下面条件结构的常用形式。 lhs:=rhsl/:test If[test,then,else] 当test为真时使用定义 如test为真计算then,反之计算else 依次计算testl,给出对应的第一个为which[test1,value1,test2,...] 真的值 expr与每一个formi相比较,给出第Switch[expr,forml,value1,form2,...] 一个相匹配的值 Switch[expr,form1, value1,form2,?,用def为系统默认值 _,def] 1.If命令
下面的test为真,故返回第一表达式的值:
ln[1]:=If [1>0,1+2,2+3] Out[1]=3 用Mathematica编程时,不可避免的要在单个或多个定义之间进行选择。单个定义的右边包含多个由If函数控制的分支,多个定义是用/;condition来表示的。运用多个定义进行编程你常能得到结构很好的程序。下面定义了一个阶跃函数,即当x>O时值为1,反之值为-1:
ln[2]:=If[x>0,1,-1] 下面运用/;condition形式分别定义阶跃函数的正数和负数部分:
ln[3]:g=1/:x>0 ln[4]:g=-1/:x<0 用“?”显示用/:condition定义的函数g的完整信息:
ln[5]:=?g Global`g g[x_]:=1/:x>O g[x_]:=-1/:x 2.Which命令 对于一般情况函数If提供一个两者择一的方法。然而,有时条件多于两个,在这种情况下可用If函数的嵌套方式来处理,但在这种情 况下使用Whitch或Switch函数将更合适。下面用Which定义具有三个条件的函数,调用这个函数: 用Switch定义一个与模的余数有关的函数: Mod[17,3]=2,因此运用了Switch中的第三种情况: 3 符号条件 在Mathemahca中,有一种可能的情况就是你给出的条件结果既不是真也不为假。下面测试的结果既不是真也不是假,因此If的两个分支保持不变: ln[1]:=If[x==y,a,b] Out[1]:If[x==y,a,b] 你可以给If加上第三个条件结果,这允许你测试的结果既不是真也不是假的情况下使用它: ln[2]:=If[x==y,a,b,c] Out[2]=c 下面给出处理符号条件的函数。因x=x,故Mathematica给出结果为真: 但Mathematica在下面情况下以符号等式输出: ln[4]:=x==y Out[4]:=x==y 除非表达式能得出真,否则都被假设为假: ln[5]:=TrueQ[x==x] Out[5]=True ln[6]:=TrueQ[x==y] Out[6]=false 我们用“===”可直接测试两个表达式的等同性: In[7]:x===y Out[7]:=False 一般情况下,“===”返回值为真(Truee)或假(False),而“==”为符号形式输出,表示一个符号等式。在特殊情况下可用“===”测试一个