实验二十  Mathematica程序设计

 

一、实验目的

了解Mathematica的程序设计功能,能用Mathematica软件设计程序,以解决较大规模的问题。

 

二、相关知识

本实验介绍数学软件Mathematica的程序设计功能。

(一)自定义函数

Mathematica中,除了系统定义的常用函数以外,当我们需要使用自己的函数来完成特定的任务时,可以使用自定义函数的方法来定义我们自己所需要的函数。

自定义的方法是:

f[x_]:=包含x的表达式

f[x_ , y_]:=包含xy的表达式

这里x_可以为实数、向量或矩阵。

系统还允许两个不同类型的函数取相同的函数名。

1g[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_]:=2xg[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的整数if[i]均已保留在系统中,而不需要重新计算。

我们可以先计算f[10],再用?f查看内存的情况。

(二)过程

Mathematica中的一个过程就是用分号隔开的表达式序列,一个表达式序列也称为一个复合表达式,在Mathematica的各种结构中,任何一个表达式的位置都能放一个复合表达式。

(三)条件控制语句

Mathematica中提供了IfWhichSwitch三种描述条件分支的结构语句,这些条件语句常用在程序中,以增强程序的功能。

1If语句结构

If结构有下列三种情况:

If[逻辑表达式,表达式1]:当逻辑表达式成立时,计算表达式1,其值就是If结构的值。

If[逻辑表达式,表达式1,表达式2]:当逻辑表达式成立时,计算表达式1,其值作为If结构的值;当逻辑表达式不成立时,计算表达式2,其值作为If结构的值。

If[逻辑表达式,表达式1,表达式2,表达式3]:当逻辑表达式成立时,计算表达式1,其值作为If结构的值;当逻辑表达式不成立时,计算表达式2,其值作为If结构的值;当逻辑表达式既非成立也非不成立时(多数为无法判断时),计算表达式3,并将其值作为If结构的值。

例4:(1x=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

2Which语句结构

Which语句的一般形式为:

Which [条件1,表达式1,条件2,表达式2…,条件n,表达式n]

Which [条件1,表达式1,条件2,表达式2…,条件n,表达式nTrue,表达式]

依次计算条件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  (考虑为什么?)

3Switch语句结构

Switch语句的一般形式为:

Switch [表达式,模式1,表达式1,模式2,表达式2…,模式n,表达式n]

将表达式与模式1、模式2…,模式n依次做比较,给出第一个与表达式匹配的模式i对应的表达式i的值,若均不匹配,则返回原式。

7g[x_]:=Switch[Mod[x,3],0,a,1,b,2,c]

{g[7],g[8],g[9]}

结果为:{b,c,a}

(四)循环控制结构

Mathematica提供了三种循环控制结构:DoWhileFor

1Do语句结构

Do[表达式,{i,i0,i1,s}] 循环变量ii0i1,每次增加s,计算表达式的值;

Do[表达式,{i,i1}]    i0=1步长为1时的省略形式;

Do[表达式,{n}]      计算表达式n次;

Do[表达式,{i,i0,i1,is}{j,j0,j1,js}] ii0i1按步长is递增,jj0j1按步长js递增,对每个ij计算表达式。

8t=x;Do[t=1/(1+K t);Print[t],{K,2,6,2}]

这里注意Kt之间一定要有空格。

Do[Print[{i,j}],{i,4},{j,i}]

2While语句结构

While语句的一般形式为:

    While[条件,循环体]

9:用While1100的和 i=1 ; s=0;

While[i<100,i=i+1;s=s+i];s

这里注意i的变化范围。

3For语句结构

For语句的一般形式为:

    For[初始值,条件,步长,循环体]

10:用For1100的和: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[ ]:转向本层ForWhile结构中的下一次循环;

后三个函数的意义与C语言相同。具体用法请查看系统帮助。

(六)程序的注释

Mathematica中用(*注释内容*)来对程序加注释,以增加程序的可读性。

 

三、实验内容

1、找出1001000之间的能被311整除的自然数。

2、计算对于具体要计算的,直到第n项的绝对值小于,计算的值。

3、先定义:

                   

然后计算

4、已知,计算

5、已知计算的牛顿迭代表达式为:

                              

作为初值,计算10次迭代的结果。

6、完成实验报告。