一、实验目的
了解Mathematica的程序设计功能,能用Mathematica软件设计程序,以解决较大规模的问题。
二、相关知识
本实验介绍数学软件Mathematica的程序设计功能。
(一)自定义函数
在Mathematica中,除了系统定义的常用函数以外,当我们需要使用自己的函数来完成特定的任务时,可以使用自定义函数的方法来定义我们自己所需要的函数。
自定义的方法是:
f[x_]:=包含x的表达式
f[x_ , y_]:=包含x,y的表达式
这里x_可以为实数、向量或矩阵。
系统还允许两个不同类型的函数取相同的函数名。
例1:g[x_]:=x^2+Sin[x]
g[x_ , y_]:=x+y
这时,系统同时接受了这两个同名的函数,并且会根据情况自动调用相应的表达式。但如果我们接着定义g[x_]:=Log[x],则g[x_]的定义就被改变了,而g[x_ , y_]依然存在。
要清除g的全部定义,用Clear[g]。而如果仅仅希望清除g[x_]的定义,则用
g[x_]:=.
来完成。
自定义函数的立即赋值和延迟赋值:
在Mathematica中,定义函数时除了用“:=”外,也可以用“=”来定义,但二者的意义是不同的,我们来看f[x_]:=2x和g[x_]=2x,如果x没有被定义,则它们二者没有什么差异,但如果在定义函数之前,已经定义了x=2,则我们将会发现二者有很大的差异。我们将使用“=”定义的称为立即赋值函数,这种函数在定义时赋值号右边的表达式立即被求值,如果此时右边的变量已经有值,则调用此函数时无法替换;而用“:=”定义的函数称为延迟赋值函数,系统记录的只是一个规则,求值是在调用时才进行的。严格地讲,这才是真正意义的函数。但Mathematica为了某些需要,也允许用“=”来定义函数,例如在利用Plot作出含有计算命令函数的图形时,就有这样的需要。
例2:比较:fun[x_]=D[Sin[x]^2,x]+Integrate[4x^3,x];Plot[fun[x],{x,-1,1}]
和 fun[x_]:=D[Sin[x]^2,x]+Integrate[4x^3,x]; Plot[fun[x],{x,-1,1}]的差异。
解:前者在运行时没有问题,但后者由于调用时没有具体的值而无法进行计算,但也不是一定要用第一钟方法来定义函数,其实这时可采用将Plot语句中的fun[x]改为Evaluate[fun[x]]来实现上面的功能。
例3:定义递归函数。菲波那奇数列是我们熟悉的数列,我们可以通过下面的Mathematica程序来生成该数列:
f[1]=1;f[2]=1;f[x_]:=f[x-1]+f[x-2]
也可以用
f[1]=1;f[2]=1;f[x_]:f[x]=f[x-1]+f[x-2]
来定义,当我们用后者时,只要我们一旦计算了f[n],则对所有小于n的整数i,f[i]均已保留在系统中,而不需要重新计算。
我们可以先计算f[10],再用?f查看内存的情况。
(二)过程
Mathematica中的一个过程就是用分号隔开的表达式序列,一个表达式序列也称为一个复合表达式,在Mathematica的各种结构中,任何一个表达式的位置都能放一个复合表达式。
(三)条件控制语句
Mathematica中提供了If、Which和Switch三种描述条件分支的结构语句,这些条件语句常用在程序中,以增强程序的功能。
1.If语句结构
If结构有下列三种情况:
If[逻辑表达式,表达式1]:当逻辑表达式成立时,计算表达式1,其值就是If结构的值。
If[逻辑表达式,表达式1,表达式2]:当逻辑表达式成立时,计算表达式1,其值作为If结构的值;当逻辑表达式不成立时,计算表达式2,其值作为If结构的值。
If[逻辑表达式,表达式1,表达式2,表达式3]:当逻辑表达式成立时,计算表达式1,其值作为If结构的值;当逻辑表达式不成立时,计算表达式2,其值作为If结构的值;当逻辑表达式既非成立也非不成立时(多数为无法判断时),计算表达式3,并将其值作为If结构的值。
例4:(1)x=1;If [x>0,x]
(2)定义f [x_ , y_]:=If [x>0&&y>0, x+y, x-y]
输入f [3,3],返回6,输入f [2,-2],返回4,
输入f[2,u],返回![]()
(3)定义g [y_]:=If [y>0, “ABC”,“DEF”,“XYZ”]
输入g[Z],返回XYZ (无法判断Z是否>0)
2、Which语句结构
Which语句的一般形式为:
Which [条件1,表达式1,条件2,表达式2,…,条件n,表达式n]
Which [条件1,表达式1,条件2,表达式2,…,条件n,表达式n,True,表达式]
依次计算条件i,计算对应第一个条件为True的表达式的值,作为整个结构的值。如果所有条件的值都为False,则第一种格式不做任何运算,在第二种格式中,以表达式的值作为整个结构的值。
例5:给出函数

的定义,并分别计算
,
,
,
。
解:f [x_]:=Which[x<0,x,x>=0&&x<2,Cos[x],x>=4&&x<6,x^2,True,1]
{f [-1],f [1],f [3],f [5]}
例6:定义:K[x_]:=Which[x>1,u=1,x>3,v=2,x>s,w=3]
则 K[6]=1 (考虑为什么?)
3、Switch语句结构
Switch语句的一般形式为:
Switch [表达式,模式1,表达式1,模式2,表达式2,…,模式n,表达式n]
将表达式与模式1、模式2,…,模式n依次做比较,给出第一个与表达式匹配的模式i对应的表达式i的值,若均不匹配,则返回原式。
例7:g[x_]:=Switch[Mod[x,3],0,a,1,b,2,c]
{g[7],g[8],g[9]}
结果为:{b,c,a}
(四)循环控制结构
Mathematica提供了三种循环控制结构:Do、While和For
1、Do语句结构
Do[表达式,{i,i0,i1,s}]: 循环变量i从i0到i1,每次增加s,计算表达式的值;
Do[表达式,{i,i1}]: i0=1步长为1时的省略形式;
Do[表达式,{n}]: 计算表达式n次;
Do[表达式,{i,i0,i1,is},{j,j0,j1,js}]: i从i0到i1按步长is递增,j从j0到j1按步长js递增,对每个i、j计算表达式。
例8:t=x;Do[t=1/(1+K t);Print[t],{K,2,6,2}]
这里注意K和t之间一定要有空格。
Do[Print[{i,j}],{i,4},{j,i}]
2、While语句结构
While语句的一般形式为:
While[条件,循环体]
例9:用While求1到100的和 i=1 ; s=0;
While[i<100,i=i+1;s=s+i];s
这里注意i的变化范围。
3、For语句结构
For语句的一般形式为:
For[初始值,条件,步长,循环体]
例10:用For求1到100的和:For[i=1;s=0,i<=100,i=i+1,s=s+i];Print[s]
这里注意i的变化范围与用While时的不同。i=1;s=0是一个复合语句作为初始值。
输出乘法口诀表:For[i=1,i<10,i=i+1,For[j=i,j<10,j=j+1,Print[i,“*”,j,“=”,i*j]]]
(五)转向控制
Label[name]:用标识符name标出复合表达式的一个位置;
Goto[name]:转向当前过程中Label[name]位置后继续运行;
Return[表达式]:退出函数中的所有过程和循环,返回表达式的值;
Break[ ]:结果本层循环;
Continue[ ]:转向本层For或While结构中的下一次循环;
后三个函数的意义与C语言相同。具体用法请查看系统帮助。
(六)程序的注释
在Mathematica中用(*注释内容*)来对程序加注释,以增加程序的可读性。
三、实验内容
1、找出100至1000之间的能被3或11整除的自然数。
2、计算
对于具体要计算的
,直到第n项的绝对值小于
,计算
的值。
3、先定义:
然后计算
、
、
。
4、已知
,
,计算![]()
5、已知计算
的牛顿迭代表达式为:
![]()
以
作为初值,计算10次迭代的结果。
6、完成实验报告。