第六章 Maple程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章Maple程序设计
教学目的:学习并掌握计算机代数系统Maple下的算法设计和程序设计原理和方法,包括基本程序结构、子程序求值、程序的嵌套以及程序的调试。
教学要求:掌握算法设计和程序设计原理和基本方法。
重点内容:算法设计,程序设计。
难点内容:算法设计,程序设计。
前面, 我们使用的是Maple 的交互式命令环境. 所谓交互式命令环境, 就是一次输入一条或几条命令, 然后按回车, 这些命令就被执行了, 执行的结果显示在同一个可执行块中. 对于大多数用户来说, 利用交互式命令环境解决问题已经足够了, 但如果要解决一系列同一类型的问题或者希望利用Maple 编写需要的解决特定问题的函数和程序, 以期更加充分地利用Maple 的强大功能, 提高大规模问题的计算效率, 进行一定的程序设计是必要的.
程序设计主要包括两个方面: 行为特性的设计与结构特性的设计. 所谓行为特性的设计, 通常是指将解决问题的过程的每一个细节准确地加以定义, 并且还应当将全部的解题过程用某种工具完整地描述出来, 这一过程也称为算法的设计. 而结构特性设计是指为问题的解决确定合适的数据结构.
幸运的是, Maple 自身提供了一套编程工具, 即Maple 语言. Maple 语言实际上是由Maple 各种命令以及一些简单的过程控制语句组成的.
1编程基础
1.1算子
所谓算子, 是从一个抽象空间到另一个抽象空间的函数. 在数学上算子的含义通常是函数到函数的映射. 在Maple 中, 算子常用“箭头”记号定义(也称箭头操作符): > f:=x->a*x*exp(x);
:= f → x a x e x
> g:=(x,y)->a*x*y*exp(x^2+y^2);
:= g → (),x y a x y e () + x 2y 2
另外, 函数unapply 也可以从表达式建立算子:
> unapply(x^2+1,x);
→ x + x 21
> unapply(x^2+y^2,x,y);
→ (),x y + x 2y 2
当我们依次把算子f 作用到参数0, a, x^2+a 时即可得平常意义上的函数值:
> f:=t->t*sin(t);
:= f → t t ()sin t
> f(0);
> f(a);
a ()sin a
> f(x^2+a);
() + x 2a ()sin + x 2a
上述结果是函数作用的例子. 而最后一个结果)sin()(22a x a x ++实际上是算子f 与算子g:=t->t^2+a 复合后再作用到参数x 的结果.
从数学上讲, 作用与复合是不同的,它们产生的结果是有区别的, 但在使用它们时, 两者还是有些重叠的. 在Maple 中, 可以依赖于语法把它们区分开:
(1) 当复合两个算子时, 结果仍是算子, 两个算子的定义域必须是相容的;
(2) 当把一个算子作用于一个参数(参数必须在算子的定义域中)时, 结果是一个表
达式;
(3) 在Maple 中,函数作用的语法是使用括号( ),如函数f 作用到参数u 写作f(u). 而
复合算子的符号是@,多重复合时使用符号@@.
通过进一步的例子可以清楚区分作用与复合的功能: f 和g 复合的结果是算子))((:t g f t g f =, 而把这个算子作用到参数x 得到表达式f (g (x )). 例如, )exp(),sin(u u g t t f =+=ϕ, 则))sin(exp(:ϕ+=z z g f 是一个算子, 而))sin(exp()((ϕ+=x x g f 是一个表达式, 因为x 是一个实数. 试比较下述两例: > D(g@f);
()@()()D g f ()D f
> D(g*h);
+ ()D g h g ()D h
另外一个应引起注意的问题是算子(函数)与表达式的异同,在第一章2.2.2中曾探讨过函数与表达式的区别,这里再通过几个例子说明其中的微妙差异:
> f1:=x^2+1;
> f2:=y^2+1;
:= f1 + x 21
:= f2 + y 21
> f3:=f1+f2;
:= f3 + + x 22y 2
再看下面的例子:
> g1:=x->x^2+1;
> g2:=y->y^2+1;
:= g1 → x + x 21
:= g2 → y + y 21
> g3:=g1+g2;
:= g3 + g1g2
与前面例子不同的是,两个算子(函数)g1, g2相加的结果依然是函数名g3,出现这个问题的主要原因是g1与g2分别为x ,y 的函数,Maple 认为它们的定义域不相容. 要得到与前例的结果,只需稍作改动:
> g3:=g1(x)+g2(y);
:= g3 + + x 22y 2
下面的例子想说明生成Maple 函数的两种方式“箭头操作符”及“unapply ”之间微妙的差异:
> restart: a:=1: b:=2: c:=3:
> a*x^2+b*x+c;
+ + x 22x 3
> f:=unapply(a*x^2+b*x+c,x);
:= f → x + + x 22x 3
> g:=x->a*x^2+b*x+c;
:= g → x + + a x 2b x c
由此可见,f 中的a,b,c 已经作了代换,而g 中则显含a,b,c 。再看下面实验: > f(x); g(x);
+ + x 22x 3
+ + x 22x 3
f 与
g 两者相同,再对其微分:
> D(f); D(g);