您好,欢迎来到锐游网。
搜索
您的当前位置:首页Mathematica的编程根本

Mathematica的编程根本

来源:锐游网
Mathematica的编程根本

第3讲Mathematica的编程基础

在Mathematica系统中,我们所进⾏的计算和操作实际上都可以认为是在编程,因为编程最简单地说就是⽤⼀系列的语句来描述⼀个适当操作,下⾯讨论⼀些与编程有关的问题。包括描述复杂的计算过程的程序结构,定义局部变量,如何实现程序包等问题。

3.1过程的基本构成

Mathematica中⼀个过程就是⽤分号隔开的表达式序列,也称为复合表达式。在Mathematica的各种结构中,任何⼀个表达式的位置都能放⼀个复合表达式,运⾏时按复合表达式顺序依次求值,输出最后⼀个表达式的值。表达式序列我们习惯也称为语句序列。3.2条件控制结构

Mathematica中提供了If、Which和Switch三种描述条件分⽀的结构语句,这些语句常⽤在程序中,也可⽤于⾏⽂命令In[n]中。3.2.1 If语句的结构

If语句的结构与⼀般程序设计语⾔结构类似。由于Mathematica 的逻辑表达式的值有三个:真(True)、假(False)和⾮真⾮假(通常是⽆法判定)。因此If语句的转向也有三种情况,下列是If结构的三种情况:格式:If[逻辑表达式,表达式1]

功能:逻辑表达式的值为真,计算表达式1,表达式1的值就是整个If结构的值。格式:If[逻辑表达式,表达式1,表达式2]

功能:当逻辑表达式的值为真,计算表达式1的值,并将表达式1的值作为整个If结构的值;当逻辑表达式的值为假时,计算表达式2的值,并将表达式2的值作为整个If结构的值。格式:If[逻辑表达式,表达式1,表达式2,表达式3]

功能:当逻辑表达式的值为真,计算表达式1的值,并将表达式1的值作为整个结构的值;当逻辑表达式的值为假时,计算表达式2的值,并将表达式2的值作为整个结构的值;当逻辑表达式的值⾮真⾮假时,计算表达式3的值,并将表达式3的值作为整个结构的值。3.2.2 Which语句的结构Which语句的⼀般形式:

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

功能:依次计算条件i,计算对应第⼀个条件为True的表达式的值,作为整个While结构的值。所有都为假,值为Null,作为整个结构的值。

3.2.3 Switch语句的⼀般形式

格式:Switch[expr,模式1,表达式1,模式2,表达式2,…]

功能:将表达式expr的值与模式1,模式2,…依次⽐较,给出第⼀个与expr匹配的模式i对应的表达式的值,若⽆匹配的,整个结构的值为Null。3.3循环控制结构

Mathematica有三种描述循环结构的语句,它们是Do、While和For。3.3.1 Do循环

格式: Do[循环体,{循环范围}]格式1:Do[expr, {i,i0,i1,s}]

功能:循环变量i从i0到i1,每次增加s,计算表达式expr。格式2:Do[expr, {i,i1}]功能:同上. 此时,i0=1,s=1 。格式3:Do[expr, {n}]功能:计算表达式expr n次.3.3.2 While 循环格式: While[条件,循环体]

功能:当条件为True时则对循环体表达式求值,重复对条件判断和对循环体求值过程直到条件⾮真时停⽌。3.3.3 For循环

For[初始值,条件,修正循环变量,循环体]执⾏过程:同⼀般的⾼级语⾔的For循环。

在这⾥,初始值往往是赋值语句,条件是逻辑表达式,修正循

环变量是⾃加、⾃减或赋值语句,循环体是复合表达式。值得注意的是与C语⾔不同之处,逗号和分号的作⽤正好相反。3.3.4重复应⽤函数的⽅法

Mathematica提供了⼀些能实现循环和迭代的函数,在计算中更多的⽤系统迭代函数⽽较少⽤到条件语句或循环语句。表3-1是Mathematica的常⽤的迭代函数及其意义:有关迭代函数表3-1

在正常情况下,系统对表达式的求值总是按照规定的顺序和⽅式进⾏。但我们也可以改变这种正常顺序、以⽅便程序设计、使程序流程更加⾃然、或者为了提⾼程序的执⾏效率等等。为此,系统提供了⼀些特殊的函数,见表3-2:程序流程的中断与返回表3-2

1、使⽤条件结构定义分段函数:,并绘制在[-2,3]上的图形。10()0x

x x f x e x +

≥?()f x ⽅法⼀:In[ ]:= f[x_]:= If[x<0,x+1,Exp[x]]Plot[f[x],{x,-2,2}]

⽅法⼆:In[ ]:= f[x_]:=Which[x<0,x+1,x>=0,Exp[x]]Plot[f[x],{x,-2,2}]运⾏如下:

2、编写⼀个显⽰不超过n 的全部素数的函数。

In[ ]:= f[n_]:=Do [If[PrimeQ[i],Print[i] ],{i,2,n}]/;IntegerQ[n]&&n>1注:这⼉/;IntegerQ/&&n>1是对函数中的变量的约定条件。运⾏如下:In[ ]:= f[3]Out[ ]= 23

In[ ]:= f[10]Out[ ]= 23 57

结果是竖着下来的,不是横着排列。如果要横着,则要⽤⽅法⼆的列表的⽅式。⽅法⼆:In[]:=

f[n_]:=(t={};Do[If[PrimeQ[i],AppendTo[t,i]],{i,2,n}];t)/;IntegerQ[n]&&n>1 运⾏如下:In[ ]:= f[2]Out[ ]= {2}In[ ]:= f[10]Out[ ]={2,3,5,7}In[ ]:= f[100]

Out[ ]= {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,,97}3、⽤三种循环函数For,While,Do 来计算10!。答案:For 函数:

(1)In[ ]:= For[n=1;i=1,i<=10,i++,n=n*i];nOut[ ]= 3628800

注意:⼀定要注意For 的格式,⼀共分四个部分,各个部分⽤逗号,隔开,不是C 语⾔中的分号!各部分中,如是各有⼏个语句组成,则要⽤分号;隔开,形成复合语句。第四个部分循环体部分可与循环变量改变量合为⼀体,要注意次序。见⽅法⼆。(2)In[ ]:= For[n=1;i=1,i<=10,n=n*i;i++];nOut[ ]= 3628800

(3)In[ ]:= For[n=1;i=10,i>0,n=n*i;i--];nOut[ ]= 3628800这是倒着下来的。(4)In[ ]:= n=1;For[i=1,i<=10,i++,n=n*i];nOut[ ]= 3628800

这是初值n 放在循环体前(外)的。While 函数:In[ ]:= n=1;i=1;While[i<=10,n=n*i;i++];n Out[ ]= 3628800

注意:While 循环的内部只有两部分,第⼀部分是条件;第⼆部分是循环体,两部分间⽤逗号,隔开。如果循环体不是⼀个语句可以完成的,则要⽤分号隔开,不可⽤逗号隔开!另外,初值不要放在循环体内,以免引起不必要的错误。Do 函数In[ ]:= n=1;Do[n=n*i,{i,1,10}];n Out[ ]= 3628800

Do 循环的内部也是只有两部分:第⼀部分是循环体,第⼆部分是循环次数,⽤{ }表⽰的部分。通常是确定的已知次数的,如100次 ({100}),不可以⽤变量来改变它。4、⼀根绳⼦长32768⽶,每天截去⼀半,问多少天长度⼩于1⽶?要求此题⽤三

种循环函数For,While,Do 来编写。For 函数:In[ ]:= For[n=32768;i=0,n>=1,i++,n=n/2];i Out[ ]= 16In[ ]:= For[n=1,32768>=,n++];n n 2Out[ ]= 16While 函数

In[ ]:= n=32768;i=0;While[n>=1,i++;n=n/2];i Out[ ]= 16In[ ]:= n=0;While[32768>=,n++];n n 2Out[ ]= 16

Do 函数 循环体⼀定要有If 函数配合才能判断,因为这是确定次数的循环.In[ ]:= n=32768;i=0;Do[If[n>=1,i++];n=n/2, {100}];i Out[ ]= 16

说明:由于Do 函数内部只有两部分:循环体与确定次数的控制部分两个部分组成,在循环体内改变的量,不可能反映到控制部分,所以在循环体内就得有IF 语句来⾃⾏控制。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- ryyc.cn 版权所有 湘ICP备2023022495号-3

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务