收藏 分享(赏)

第六章-maple程序设计.doc

上传人:cjc2202537 文档编号:222259 上传时间:2018-03-24 格式:DOC 页数:53 大小:432KB
下载 相关 举报
第六章-maple程序设计.doc_第1页
第1页 / 共53页
第六章-maple程序设计.doc_第2页
第2页 / 共53页
第六章-maple程序设计.doc_第3页
第3页 / 共53页
第六章-maple程序设计.doc_第4页
第4页 / 共53页
第六章-maple程序设计.doc_第5页
第5页 / 共53页
点击查看更多>>
资源描述

1、第六章 Maple 程序设计教学目的:学习并掌握计算机代数系统 Maple 下的算法设计和程序设计原理和方法,包括基本程序结构、子程序求值、程序的嵌套以及程序的调试。教学要求:掌握算法设计和程序设计原理和基本方法。重点内容:算法设计,程序设计。难点内容:算法设计,程序设计。前面, 我们使用的是 Maple 的交互式命令环境. 所谓交互式命令环境, 就是一次输入一条或几条命令, 然后按回车 , 这些命令就被执行了, 执行的结果显示在同一个可执行块中. 对于大多数用户来说 , 利用交互式命令环境解决问题已经足够了 , 但如果要解决一系列同一类型的问题或者希望利用 Maple 编写需要的解决特定问题

2、的函数和程序, 以期更加充分地利用 Maple 的强大功能, 提高大规模问题的计算效率, 进行一定的程序设计是必要的. 程序设计主要包括两个方面: 行为特性的设计与结构特性的设计. 所谓行为特性的设计, 通常是指将解决问题的过程的每一个细节准确地加以定义, 并且还应当将全部的解题过程用某种工具完整地描述出来, 这一过程也称为算法的设计. 而结构特性设计是指为问题的解决确定合适的数据结构. 幸运的是, Maple 自身提供了一套编程工具 , 即 Maple 语言 . Maple 语言实际上是由Maple 各种命令以及一些简单的过程控制语句组成的.1 编程基础1.1 算子所谓算子, 是从一个抽象空

3、间到另一个抽象空间的函数. 在数学上算子的含义通常是函数到函数的映射. 在 Maple 中, 算子常用“箭头”记号定义(也称箭头操作符) : f:=x-a*x*exp(x); :=fxaex g:=(x,y)-a*x*y*exp(x2+y2); :g(),y()x2y另外, 函数 unapply 也可以从表达式建立算子: unapply(x2+1,x); x21 unapply(x2+y2,x,y); (),y2当我们依次把算子 f 作用到参数 0, a, x2+a 时即可得平常意义上的函数值: f:=t-t*sin(t); :=ft()sint f(0); 0 f(a); a()sin f(

4、x2+a); (x2i2上述结果是函数作用的例子. 而最后一个结果 实际上是算子 f)sin()(2ax与算子 g:=t-t2+a 复合后再作用到参数 x 的结果. 从数学上讲, 作用与复合是不同的,它们产生的结果是有区别的, 但在使用它们时, 两者还是有些重叠的. 在 Maple 中, 可以依赖于语法把它们区分开: (1) 当复合两个算子时, 结果仍是算子, 两个算子的定义域必须是相容的;(2) 当把一个算子作用于一个参数( 参数必须在算子的定义域中)时, 结果是一个表达式; (3) 在 Maple 中,函数作用的语法是使用括号( ),如函数 f 作用到参数 u 写作 f(u). 而复合算子

5、的符号是,多重复合时使用符号.通过进一步的例子可以清楚区分作用与复合的功能: f 和 g 复合的结果是算子, 而把这个算子作用到参数 x 得到表达式 f(g(x). 例如, )(tgftf, 则 是一个算子, 而)exp(sinu )sin(ep:zzgf是一个表达式, 因为 x 是一个实数. 试比较下述两例:)(exp)(f D(gf); ()Dgf( D(g*h); h另外一个应引起注意的问题是算子(函数) 与表达式的异同,在第一章 2.2.2 中曾探讨过函数与表达式的区别,这里再通过几个例子说明其中的微妙差异: f1:=x2+1; f2:=y2+1; :=f1x2y f3:=f1+f2;

6、 :=f3x2y再看下面的例子: g1:=x-x2+1; g2:=y-y2+1; :g1x21=y g3:=g1+g2; :g312与前面例子不同的是,两个算子(函数) g1, g2 相加的结果依然是函数名 g3,出现这个问题的主要原因是 g1 与 g2 分别为 x,y 的函数,Maple 认为它们的定义域不相容. 要得到与前例的结果,只需稍作改动: g3:=g1(x)+g2(y); :=g32下面的例子想说明生成 Maple 函数的两种方式“箭头操作符”及“unapply”之间微妙的差异: restart: a:=1: b:=2: c:=3: a*x2+b*x+c; x23 f:=unapp

7、ly(a*x2+b*x+c,x); :=f2 g:=x-a*x2+b*x+c; :gxa2bxc由此可见,f 中的 a,b,c 已经作了代换,而 g 中则显含 a,b,c。再看下面实验: f(x); g(x); x23f 与 g 两者相同,再对其微分: D(f); D(g);x2ab再改变常数 c 的值,观察 f 与 g 的变化: c := 15; :=c15 f(x); g(x); x2315由此可见,在利用 Maple 进行函数研究时,对同一问题应该用不同方法加以校验,而这一切的支撑是数学基础!1.2 编程初体验利用算子可以生成最简单的函数单个语句的函数, 但严格意义上讲它并非程序设计,

8、它所生成的数据对象是子程序. 所谓子程序,简单地说 , 就是一组预先编好的函数命令, 我们由下面的简单程序来看看 Maple 程序的结构: plus:=proc(x,y)x+y;end;这个程序只有 2 个参数, 在程序内部它的名称是 x, y, 这是 Maple 最简单的程序结构, 仅仅在 proc( )和 end 中间加上在计算中需要的一条或者多条命令即可, Maple 会把最后一个语句的结果作为整个子程序的返回结果, 这一点需要引起注意. 再看下例: P:=proc(x,y)x-y;x*y;x+y; end: P(3,4); 7显然, 尽管程序 P 有三条计算命令,但返回的只是最后一个语

9、句 x+y;的结果. 要想输出所有的计算结果,需要在程序中增加 print 语句: P:=proc(x,y)print(x-y);print(x*y);print(x+y); end: P(3,4); -127再看下面几个例子: for i from 2 to 6 do expand(x+y)i );od; x2y233x4y6x24y4510335x5x6yx42y1246y6 F:=proc(n:integer)if n mod 12=0 then trueelse falsefiend: F(123123), F(12345678909);,falsetru从上面几个简单的例子可以看出

10、Maple 子程序主要包含以下一些内容:(i) 把定义的子程序赋值给程序名 procname, 以后就可以用子程序名 procname 来调用程序;(ii) 子程序一律以 proc( )开头, 括号里是程序的输入参数,如果括号中什么都没有, 表示这个子程序没有任何输入参数;(iii) 子程序中的每一个语句都用分号( 或冒号)分开( 这一点不是主要的, 程序设计时, 在可能的时候过程当中的最后一个语句、for-循环、if 语句中的最后一个语句省略终结标点也是允许的, 这并不是为了懒惰, 而是因为在终结语句后面插入一个语句产生的影响要比仅仅执行一个新语句产生的影响大);(iv) 在定义完子程序之后

11、, Maple 会显示它对该子程序的解释 (除非在 end 后用冒号结束), 它的解释和你的定义是等价的 , 但形式上不一定完全相同;(v) Maple 会自动地把除了参数以外的变量都作为局部变量(local variable), 这就是说, 它们仅仅在这个子程序的定义中有效, 和子程序以外的任何同名变量无关. 在定义了一个子程序以后, 执行它的方法和执行任何 Maple 系统子程序一样程序名再加上一对圆括号( ), 括号中包含要调用的参数 , 如果子程序没有参数, 括号也是不能省略的. 除了上面给出的程序设计方法外,在 Maple 中还可以直接由“-” (箭头)生成程序, 如下例: f:=x

12、-if x0 then x else -x fi;:=fproc() end procxtin;,peratowifthenlsif0xx f(-5),f(5); ,5甚至于程序名也可以省略,这种情况通常会在使用函数 map 时遇到: map(x-if x0 then x else -x fi,-4,-3,-2,0,1);,43201如果需要察看一个已经定义好的子程序的过程, 用 eval 命令, 查看 Maple 中源程序(如 factor 函数 )使用下述组合命令:interface(verboseproc=2);print(factor);1.3 局部变量和全局变量Maple 中的全局变

13、量, 是指那些在交互式命令环境中定义和使用的变量, 前面所使用的变量几乎都属于全局变量. 而在编写子程序时, 需要定义一些只在子程序内部使用的变量, 称其为局部变量. 当 Maple 执行子程序时, 所有和局部变量同名的全局变量都保持不变, 而不管在子程序中给局部变量赋予了何值. 如果要把局部变量定义为全局变量, 需要用关键词 global 在程序最开始加以声明, 而局部变量则用 local 声明, 虽然这是不必要的, 但在程序设计时, 声明变量是有一定好处的. 下面通过实例演示局部变量与全局变量的不同. 为了更清楚地观察子程序对全局变量的影响, 在子程序外先设定一个变量 a 的值: a:=1

14、; :=a1 f:=proc( )local a;a:=12345678/4321;evalf(a/2);end; f(); 1428.56730 a; g:=proc( )global a;a:=12345678/4321;evalf(a/2);end; g(); 1428.56730 a;显然, 在前一个程序中, 由于在子程序外已经赋值给 a, a 是全局变量, 它的值不受子程序中同名局部变量的影响;而在后一个子程序中, 由于重新把 a 定义为全局变量, 所以子程序外的 a 随着子程序中的 a 值的变化而变化. 子程序中的输入参数, 它既不是全局的, 也不是局部的. 在子程序内部, 它是形

15、式参数, 也就是说, 它的具体取值尚未被确定, 它在程序调用时会被替换成真正的参数值. 而在子程序外部, 它们仅仅表示子程序接受的参数的多少, 而对于具体的参数值没有关系. 1.4 变量 nargs, args 与 procname在所有程序中都有三个有用的变量:nargs, args 与 procname. 前两个给出关于调用参量的信息: nargs 变量是调用的实际参量的个数 , args 变量是包含参量的表达式序列, args 的子序列通过范围或数字的参量选取. 例如, 第 i 个参量被调用的格式为: argsi. nargs, args 变量通常在含有可选择参量的程序中使用 . 下面看

16、一个例子: p:=proc( )local i;RETURN(nargs,seq(i3,i=args)end proc: p(1,2,3,4,5,6,7,8,9,10);,10 ,8276415312790该程序利用 Maple 函数 RETURN 返回了输入参量的个数以及参量序列的立方列表, RETURN 函数使用时必须在其后加圆括号,即使无结果返回时也得如此。下面是一个关于求任意序列最大值的复杂程序: maximum:=proc( ) local r, i;r:=args1;for i from 2 to nargs do if argsir then r:=argsi end if en

17、d do;r;end proc: maximum(124,57,693,104+4.9*1000);328509如果变量 procname (程序被调用的名字)存在的话,它可以用来直接访问该程序, 通常用 procname(args) 完成调用: f:=proc(a)if a0 then RETURN(a(1/2)else RETURN(procname(args)end ifend proc: f(100-36),f(102+90-9*4); ,()f-6291542 基本程序结构所有的高级程序设计语言都具有程序结构, 因为为了完成一项复杂的任务, 仅仅按照语句顺序依次执行是远远不够的, 更

18、需要程序在特定的地方能够跳转、分叉、循环, , 与此同时, 程序结构就产生了. 2.1 分支结构(条件语句)所谓分支结构, 是指程序在执行时 , 依据不同的条件, 分别执行两个或多个不同的程序块, 所以常常称为条件语句. if 条件结构的语法为:if 逻辑表达式 1(条件 1) then 程序块 1elif 逻辑表达式 2(条件 2) then 程序块 2else 程序块 3fi;其中, fi 是条件语句的结束标志, 也可以写作 end if. 下面是一个判断两个数中较大者的例子: bigger:= proc(a,b) if a=b then a else b fiend;再如下例: ABS:=proc(x)if x ABS:=proc(x)if type(x,numeric) thenif x0 then -x else x;fi;else ABS(x);fi;end:这里, 我们用到一个 if 语句的嵌套 , 也就是一个 if 语句处于另一个 if 语句当中. 这样的结构可以用来判断复杂的条件. 我们还可以用多重嵌套的条件结构来构造更为复杂

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 教育学

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报