QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 17491|回复: 7
打印 上一主题 下一主题

maple基础

[复制链接]
字体大小: 正常 放大

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

自我介绍
爱学习
跳转到指定楼层
1#
发表于 2012-6-12 16:53 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

7 {- l+ _' a* D( J8 u1 F; @第一章  Maple基础: \) d- d+ l* D: W

: p8 A; p, c' K4 B* a2 w- c4 U1 初识计算机代数系统Maple0 {- Y5 e) x) }; r1 [
1.1 Maple简说
* n! A) D; P' J) D( t1980年9月, 加拿大Waterloo大学的符号计算机研究小组成立, 开始了符号计算在计算机上实现的研究项目, 数学软件Maple是这个项目的产品. 目前, 这仍是一个正在研究的项目.
( p" {# \4 C) G: PMaple的第一个商业版本是1985年出版的. 随后几经更新, 到1992年, Windows系统下的Maple 2面世后, Maple被广泛地使用, 得到越来越多的用户. 特别是1994年, Maple 3出版后, 兴起了Maple热. 1996年初, Maple 4问世, 1998年初, Maple 5正式发行. 目前广泛流行的是Maple 7以及2002年5月面市的Maple 8. 9 v- k  ~; C  z: e4 G9 D- O
Maple是一个具有强大符号运算能力、数值计算能力、图形处理能力的交互式计算机代数系统(Computer Algebra System). 它可以借助键盘和显示器代替原来的笔和纸进行各种科学计算、数学推理、猜想的证明以及智能化文字处理. 3 l) E7 z! z0 W: U
Maple这个超强数学工具不仅适合数学家、物理学家、工程师, 还适合化学家、生物学家和社会学家, 总之, 它适合于所有需要科学计算的人.
- V2 \, R' m( v1.2 Maple结构$ E; X# ^" Q9 P
Maple软件主要由三个部分组成: 用户界面(Iris)、代数运算器(Kernel)、外部函数库(External library). 用户界面和代数运算器是用C语言写成的, 只占整个软件的一小部分, 当系统启动时, 即被装入, 主要负责输入命令和算式的初步处理、显示结果、函数图象的显示等. 代数运算器负责输入的编译、基本的代数运算(如有理数运算、初等代数运算等)以及内存的管理. Maple的大部分数学函数和过程是用Maple自身的语言写成的, 存于外部函数库中. 当一个函数被调用时, 在多数情况下, Maple会自动将该函数的过程调入内存, 一些不常用的函数才需要用户自己调入, 如线性代数包、统计包等, 这使得Maple在资源的利用上具有很大的优势, 只有最有用的东西才留驻内存, 这保证了Maple可以在较小内存的计算机上正常运行. 用户可以查看Maple的非内存函数的源程序, 也可以将自己编的函数、过程加到Maple的程序库中, 或建立自己的函数库.
- ~. M( g$ g" R, g0 |2 @1.3 Maple输入输出方式
8 E3 m7 x" K$ S) E0 b; H为了满足不同用户的需要, Maple可以更换输入输出格式: 从菜单“Options | Input Display和Out Display下可以选择所需的输入输出格式.
0 ?2 d0 e* y( D' ?' T' J+ {+ UMaple 7有2种输入方式: Maple语言(Maple Notation)和标准数学记法(Standard Math Notation). Maple语言是一种结构良好、方便实用的内建高级语言, 它的语法和Pascal或C有一定程度的相似, 但有很大差别. 它支持多种数据操作命令, 如函数、序列、集合、列表、数组、表, 还包含许多数据操作命令, 如类型检验、选择、组合等. 标准数学记法就是我们常用的数学语言. - X& k0 {+ C) V
启动Maple, 会出现新建文档中的“[>”提示符, 这是Maple中可执行块的标志, 在“>”后即可输入命令, 结束用“;”(显示输出结果)或者“:”(不显示输出结果). 但是, 值得注意的是, 并不是说Maple的每一行只能执行一句命令, 而是在一个完整的可执行块中健入回车之后, Maple会执行当前执行块中所有命令(可以是若干条命令或者是一段程序). 如果要输入的命令很长, 不能在一行输完, 可以换行输入, 此时换行命令用“shift+Enter”组合键, 而在最后一行加入结束标志“;”或“:”, 也可在非末行尾加符号“\”完成. % U( B% A9 w0 g: ?% L8 h
Maple 7有4种输出方式: Maple语言、格式化文本(Character Notation)、固定格式记法(Typeset Notation)、标准数学记法(Standard Math Notation). 通常采用标准数学记法.
6 _3 s% m! z. r4 F& mMaple会认识一些输入的变量名称, 如希腊字母等. 为了使用方便, 现将希腊字母表罗列如下,输入时只需录入相应的英文,要输入大写希腊字母, 只需把英文首字母大写:   1 h+ O' ^+ ~# x6 f1 O% K# _; C

' ^& \: o/ z3 l9 v3 m & \/ v$ @4 o* K3 @8 g

1 w" W" Q4 B) _0 U0 f 9 u1 M- c0 S+ q" W% y: L) e& E) s

# z) a* U4 ~- [" E
7 Y; _4 o+ m( q) Z: B9 y$ j$ F% y/ i 3 w: B  R/ J. ~. h' t1 v" d6 ]1 Z
6 x+ T4 ^3 y' ]) i  B; W) r
7 D. V7 p6 D0 f; K6 U( O3 E5 ?
2 }: p# ]* S- T5 ]& k3 Z: O! q5 h
# p; ^& x# F; ]$ S+ k' K
) e, Y) |, z9 `

  w8 u  ^! e7 p; L2 U) R8 g$ W0 Yalpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu
5 p/ q. ?1 d7 c3 a% E' I - g$ {2 x( V" ?! ~5 ]

) B0 e) B0 L. C& m* f
+ V1 I" \" d& K+ I4 e. q
# ~+ r  l* [- I& } 9 e/ }1 D5 R7 H4 W# G: t
  \, s- h, O' U# O
) O+ K( @! w' k1 t. }
3 Z( o4 n' V  D  f) Q1 P! ]/ j2 A

9 P" {3 H1 o% e  H* D1 H7 T 4 [. {8 b) \  C, L3 z9 `

1 c% G) h5 R* V. E 5 Y5 Y* e% T' G: {( t
4 m* E% \( {) T$ i# b- V
nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega* H$ S2 u- ]& |* b
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:6 U+ G, ^+ J  @3 i" ?/ D
> for i to 10 do
: V* s: M3 G+ ?( v3 ?0 rprintf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));
/ T% E0 W, s% R0 W6 l6 Hod;
1 }* [. \( P: y6 U) q4 O# ji=+1 and i^(1/2)=+1.000i=+2 and i^(1/2)=+1.414i=+3 and i^(1/2)=+1.732i=+4 and i^(1/2)=+2.000i=+5 and i^(1/2)=+2.236i=+6 and i^(1/2)=+2.449i=+7 and i^(1/2)=+2.646i=+8 and i^(1/2)=+2.828i=+9 and i^(1/2)=+3.000i=+10 and i^(1/2)=+3.162# u! f0 T+ Q# c; D4 `9 R  r8 B
+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:
  ~  p/ F2 u) Z* W- X# R> for i to 10 do
: P# q! B, T: q) T) Y0 |printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));/ T1 R9 |: f" Q( n+ o1 L
od;* W( R2 N; K9 Z9 ~0 j; v
i=+1 and i^(1/2)=+1.000) {+ ]0 e4 r% g% x
i=+2 and i^(1/2)=+1.414
) P* I5 r5 P1 |/ zi=+3 and i^(1/2)=+1.732& Z& ~, ?7 ]/ D) G/ S: Y
i=+4 and i^(1/2)=+2.000
1 Y' ?+ ^: C% S" g0 g$ L( Wi=+5 and i^(1/2)=+2.236
7 R0 F4 @9 Y; r  s, ^9 Z8 F9 ~3 u2 [i=+6 and i^(1/2)=+2.449
) v4 ~# w0 k) L9 O) r# p  H# a) i6 Gi=+7 and i^(1/2)=+2.646
, V% d: E* O2 {9 y" y3 ii=+8 and i^(1/2)=+2.828( f8 ]& s: l6 W2 S$ m
i=+9 and i^(1/2)=+3.000
6 @% L1 s9 l0 O% W% `1 J  m4 li=+10 and i^(1/2)=+3.162% b/ X0 ?% v; g! Y0 k, O
再看下例:将输入的两个数字用特殊形式打印:
9 F% q% W5 v6 O3 C2 y> niceP:=proc(x,y)6 |7 q% J% J6 C, \1 C
printf("value of x=%6.4f, value of y=%6.4f",x,y);
0 T: S% ]( T, ?6 |5 Yend proc;
3 a  X: Y# b/ ^4 j( L
9 T# t6 D4 O* {- [. T: P# `: J  J> niceP(2.4,2002.204);
, @5 I$ o9 J9 W8 |, gvalue of x=2.4000, value of y=2002.2040
- _9 q# W( H5 q) o1.4 Maple联机帮助; ~+ k% m, O& p
学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用. - T* X1 B. d' c
在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可.
  [& K" l2 R: }4 N) D2  Maple的基本运算" Z; T, B+ g$ O$ w, S" e/ q) \- C
2.1 数值计算问题4 u# |6 G- N/ ^4 X2 B
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”. ( f) w/ W4 W0 X
在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数. # r+ j0 i" F3 }) t* E; v" x7 C
Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算.
- s  y: i! _3 g! g但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明. 6 w; i% U! D7 S. W
第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   
  |+ W* x2 `! f9 E6 ~> 3!!!;7 A& h9 j" F9 A
2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/ m3 B; J; v1 x4 |' v
上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?, H; K! L6 M, a* K# F% l
为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式9 t  [1 v5 d3 Q# |( L; d
7 F; P. C. Z2 f$ I5 p
可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   
; n9 G2 O4 s8 D6 Z, }0 b7 V
- D4 n# Y7 Z- K% ]这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性. " A" T: z+ w$ w# Y( S
另一个例子则想说明Maple计算的局限性:   
  s4 z4 F# R) Q5 D6 P$ Q7 u  6 Z& x2 s/ x  {- r
Maple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   
7 |& J7 Z' a& p( \' d8 [( N   y) J3 S! j+ H' x" e* C* R3 G, J
显然这是错误的. 这一点可以从代数的角度予以分析.
4 x. P1 {, V: E4 @  N: j不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果.
' Y  `- v' u4 p+ u" f. L另一方面, 设 , 则 , 即:
: L/ \' y. U- G( v 5 t& G; p& a/ ?, V" _- w) J
显然 有6个结果, -2、2是其实数结果. % ^& p, h; t$ q% R- J" a, l
这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性. 1 d: ^. L' F/ C  Q
尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的. 6 z& S( p+ ]* V
2.1.1 有理数运算$ I! z# |: P* ]0 `
作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). ; k5 \' M1 D& |( r' c" I5 q9 y
> 12!+(7*8^2)-12345/125;
6 R8 I  F8 y! L+ q5 K- Q8 G: ?5 d ! h; `" `( U7 j6 W9 l: `
> 123456789/987654321;
" w1 f& o4 A* `8 x! n: V 6 [6 n1 Q4 n1 M% ^" @
> evalf(%);# V: f8 x0 W4 q
5 r# U' u& g' a# ]: D; o
> 10!; 100*100+1000+10+1; (100+100)*100-9;
- L- g5 `" L% r 4 e4 Y0 n$ ~3 Z$ t1 N% p( M
7 j! U8 U1 n0 A# n; E
) m. B  A; X% |2 B) ^5 ?: w
> big_number:=3^(3^3);
. r, E6 ~: |! Z1 p$ B
0 }7 I; T+ x. e> length(%);+ r, X  m8 |. M

$ o2 k; q. X! `/ ^上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   
' ]% C. ]/ O( T7 a9 L8 Y, A, _    1)整数的余(irem)/商(iquo)
: ?1 ^, d. c# O1 u& d5 b命令格式:   
( L- b, s; }/ p/ Y8 T, \irem(m,n);        #求m除以n的余数
" z- F6 M' D( @7 D% y# u& y+ f9 Hirem(m,n,'q');    #求m除以n的余数, 并将商赋给q
) H" ?: L1 i( {& f; W" [% D, M0 diquo(m,n);        #求m除以n的商数% e2 r4 B7 v2 x  E9 u
iquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r7 X0 u% H& N  w# f4 |) P
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值.
4 M$ L) [* ?; t! O" m- u  j> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q
  A" e. W" a( J& q( {
) L+ b6 f( R" }9 ^> q; #显示q
8 ?& f" V1 F; O" _
4 X2 e3 Z5 x0 @* P> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r# W& m- B- l$ R" E
6 |3 J9 d0 m- ^4 c
> r; #显示r
; c+ a4 s3 S2 |& M% k; l2 J& E+ _ / l! G6 l0 ?9 V4 G+ Q/ e
> irem(x,3);
5 M2 k9 i2 V3 ?) r+ D/ w
3 n2 @4 L& L6 ^/ ?6 ^2)素数判别(isprime)
3 d/ i+ ?/ X9 b& _" r: k9 C$ S& ~素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); 3 b) B. ?1 r  N( d) A
    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数.
) b9 R$ s/ d" J+ M+ s& N- v> isprime(2^(2^4)+1);
* R' N% L/ J+ b. B
% I! }* k  m' d, S8 V> isprime(2^(2^5)+1);
7 H& X! H9 |% L2 Z1 X8 z
6 |- t- H, F; R  A+ _* u  K7 |6 |上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多.
% A; {$ R& F% K. H3) 确定第i个素数(ithprime)
7 s6 S7 N7 t' m若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);   
  O1 A& ?; K' p& N" m5 P5 p> ithprime(2002);4 e5 N' k5 D6 F* Y. s6 z
3 V6 ~% p2 O% |& v! [) W3 j; X  U' y
> ithprime(10000);
5 F& j6 T9 `. o: A) l0 Z# H - ^; s% k2 [  G/ D6 v
4) 确定下一个较大(nextprime)/较小(prevprime)素数
# O5 J  L- d; k7 @+ Z当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
4 }1 a+ v7 v0 Lnextprime(n);  
2 T$ g$ C! X. o3 E* [; ]. ^prevprime(n);
2 G# ~% r5 e  ^  u7 E6 w: s> nextprime(2002);* ^# \7 K; K0 W- c: S
/ R4 a& L* h' E% W% m. f
> prevprime(2002);
: \- I& l$ [% v: v
) L5 n+ E" I  V. ]5) 一组数的最大值(max)/最小值(min); M0 B9 n2 e  B3 S4 C& X
命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值6 P  \7 v( I0 Z. o: H% v: [
             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值; W, y& l: z: ?3 J! D8 O4 c9 [( A+ F
> max(1/5,ln(3),9/17,-infinity);
, b$ p2 N( J( N* [* [
" d- w9 |) [& L( v5 ]1 g, p" Y> min(x+1,x+2,y);! e3 C/ I& A0 n5 _
# ^5 q, w! j' j
6)模运算(mod/modp/mods)
: ^# v3 A7 a+ x; r: H: |命令格式:  e mod m;    # 表达式e对m的整数的模运算( p' Z9 X) u. I+ j. ]6 [$ j
modp(e,m);  # e对正数m的模运算" J; g; X) D% H0 ]
mods(e,m);  # e对m负对称数(即 -m)的模运算
8 l1 i" {! b/ q$ U. R) A5 n; s! t  s`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价8 F, d6 o3 W& L2 W& G$ g, N& B! O; g
值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/.
2 g, T; t' F- L$ l, x* r0 I/ ?> 2002 mod 101;  A1 Q+ c5 o* I( w' n# }" @. N2 G) ~

+ d& Q6 j1 L  N) m4 G8 `9 s> modp(2002,101);3 o, d2 Y9 O1 Z1 X

+ r" t& g9 I6 V/ E> mods(49,100);' y- _2 u. x; s* d

$ T/ _  H5 a. _( z) H, w8 w' ~6 e> mods(51,100);
  `4 v) z" X- W9 h- @& i' H9 ]4 K $ D! x% a/ F& M3 x. u
> 2^101 mod 2002;  # 同 2 &^101 mod 2002;
5 M1 Q' n2 \" u) t
" O* T+ w+ m) B6 j$ p7)随机数生成器(rand)1 [9 F- \0 t4 a
命令格式:   
2 R$ }. |" N6 X, k" @" hrand( );    #随机返回一个12位数字的非负整数! f; t& n4 i4 C/ M
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数
" j) l0 m6 t% k* }* Z0 ]+ w> rand();6 S* R4 ^* n7 C- r
2 [, u2 e) a( I
> myproc:=rand(1..2002):/ O3 l; C% h) R
> myproc();
* _; U1 `  ?, e# ]% E" Z$ f
* q) i' n7 k- [# {9 p> myproc();( M* O# q- x/ ]4 C6 K
; ^' }: l% u% \! F! s
    注意, rand(n)是rand(0..n-1)的简写形式.: u; `: e3 A( ~# s# I- @0 X1 T/ l8 U
2.1.2 复数运算
  A4 g0 P, j* b7 b  G% N复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   3 ]% @2 D2 \3 X% {% g% R
> complex_number:=(1+2*I)*(3+4*I);
; r, d4 S$ G; W; v + S5 U- ~* \! e  [" S( K" g
> Re(%);Im(%%);conjugate(%%%);argument(complex_number);
, M' y7 \$ |# t& D* c
: r$ r% P+ x7 G- z' [8 m% j 9 H. f( U$ O5 |1 b0 n; J# c

- k0 V$ L' h3 ^# V* k   P& K9 d! l" t( L/ ]: G' c& _5 s
值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%. + E0 X& p, F: g$ x0 |/ ~: h
为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   ' P3 j9 C0 i+ V0 l  b- m: o, T
1) 绝对值函数$ s# [0 ^/ j: A# w# T8 @8 [
命令格式: abs(expr);  2 j. e6 B$ J/ q3 s
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模., i- g% R% S/ `" h( J3 o
> abs(-2002);    #常数的绝对值
- Y4 v. s8 r" |9 D# c1 y- A
+ J. A; i" F8 l/ ^2 I& k> abs(1+2*I);   #复数的模
. G4 p2 L; K$ n2 R+ v 5 [* n9 t- ^" C8 w' t
> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值
$ E1 \6 L; J  n8 W' M
' M- g) w8 _6 h0 Z; O* w9 j9 P> abs(2*x-5);   #函数表达式的绝对值
4 R3 a' Q0 a% {  Y" ~, M$ {- ]0 B' N % P' \6 Z( I& t4 Z2 S* W" c
2)复数的幅角函数
- V4 ?) J. E% F, Q命令格式:   argument(x);  #返回复数x的幅角的主值0 d% T8 A+ j1 l8 y4 q: Q4 {# _
> argument(6+11*I);
. e" O$ o* F2 b
7 P. e* e7 q1 b4 l$ E  n> argument(exp(4*Pi/3*I));% i! F/ o% ~- J5 c' ]& o

; h% O: @( s: w* z8 {# ]1 V. j/ r3)共轭复数
/ l) x' |! q9 b/ x' V+ v: i命令格式:   conjugate(x);  #返回x的共轭复数$ p7 b; [2 g$ I0 ]6 S7 }
> conjugate(6+8*I);
+ w* p2 ^3 w4 x. b  S 6 _/ F; n  s% d) t* a; @
> conjugate(exp(4*Pi/3*I));+ ]( f' G3 X& L) u0 z4 Y" y
2 d; M' F& o9 V4 g, I- \2 b8 E
2.1.3 数的进制转换. V) d$ Y. o6 j$ s
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可.
) y; ]# ?* X7 M$ f! {3 N命令格式:   convert(expr, form, arg3, ...);      a% U- s1 {! I3 `3 g! u  u
其中, expr为任意表达式, form为一名称, arg3, ... 可选项. 0 ~2 `% L  {9 r/ W3 ]6 S" ]
下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述. " e+ N. @5 K. o" M% `* p
    1)基数之间的转换8 T5 n2 g- R! A( c( W% t  W4 u2 Z# {
命令格式:   7 \# ]  a( {8 L+ x8 T. X
convert(n, base, beta);      #将基数为10的数n转换为基数为beta的数- D( x* Y5 _+ B2 A: X" p: w' e' L
    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数
3 k7 a3 G4 E- X1 P3 Q7 U> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7* a7 U8 h  l) G& F$ f
3 A5 K3 c6 B8 G
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数
5 I6 H8 n) Z4 m7 F5 d+ \/ ` 6 D& t5 X; U2 w( Y
> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)/ y, z. L! P0 V  ^4 s

6 |+ G3 |# C$ x    2)转换为二进制形式# b4 ~* V+ k( ^
命令格式: convert(n, binary);: u" V7 ?" O3 l- `0 o- J
其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂. : F$ `6 Q4 n0 t- j
> convert(2002,binary);   
- c$ p$ B1 d6 I  z7 @) q 5 c3 q! H) ?6 r! P
> convert(-1999,binary);
+ \" X7 W% K( C7 {: ]
+ e3 H/ h0 }) T3 W> convert(1999.7,binary); 8 Q/ c: y# p2 V% k$ D2 J
6 t7 I* q1 B& W. J) p
3)转换为十进制形式
" L( ~/ Q2 S- t% ~; y* P# b, G8 f其它数值转换为十进制的命令格式为:   ( W4 m' f) d0 i
convert(n, decimal, binary);   #将一个2进制数n转换为10进制数
' X! i4 R7 B! a3 Z0 i. C6 ^    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数2 a, {. V( h' g1 k' o- P! O# T
    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数
  N, n. q5 _3 m* ]> convert(11111010010, decimal, binary);    $ y5 Y% G( g1 U2 ~
$ a$ C1 [( V7 {$ o
> convert(-1234, decimal, octal);           2 s8 h; R: J( ^6 f4 J0 q- z
8 k5 |4 _2 U+ v7 o! G! x5 k- T6 W
> convert("2A.C", decimal, hex);         
3 K' Q: X" \% k
/ l. T0 C# y/ _4) 转换为16进制数" r; @9 Z0 d/ U
将自然数n转换为16进制数的命令格式为: convert(n, hex);   
. h# G7 f! w2 T" A# ?2 S> convert(2002,hex);  convert(1999,hex);
: E( c8 g3 T* t. j! s% N6 u; H
& s/ @# R7 \. |6 f6 J8 Z   M% W4 ]& z, Y+ n# u, P' [1 K
5)转换为浮点数
7 {! w/ Y4 \, o3 K命令格式: convert(expr, float);
9 |9 ~( n' R" h* n( k1 k3 @注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用. 1 S% }! H1 m- E7 S2 ^* c: z! k
> convert(1999/2002,float);: b) e6 ]& p8 O. `
' p5 L1 O0 _8 L- G
> convert(Pi,float);2 {- e; }$ s! a' @6 i
* e$ b2 x5 E% i# E
2.2 初等数学
$ G6 V' Y6 u; C; Y/ R    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识.
$ M" r0 t2 R5 {2 l5 t- }2.2.1 常用函数
( L7 M7 b9 E! m" o7 [4 h8 P, q作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   
, D8 Z0 F) A1 ~2 k, b' ^指数函数: exp5 x- L( ~' l$ Z: i- @( F8 T
一般对数: log[a]
: C6 q6 _# y0 @& o) e自然函数: ln
. Z( x. L; V' k# W  _8 S% T常用对数: log10& g6 K( d$ g# z# F
平方根: sqrt
4 ]) _7 N2 X/ V2 V: V, U' m绝对值: abs0 g# e9 a9 D# F/ o! V, n% s' p0 [+ M
三角函数: sin、cos、tan、sec、csc、cot
7 A) \4 `' _0 v, @) t6 M反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot; d9 ^0 S% N, p+ z6 w* s" h
双曲函数: sinh、cosh、tanh、sech、csch、coth5 W, t/ L% w8 N& q  G
反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth8 W2 G0 `3 E9 |
贝赛尔函数: BesselI、BesselJ、BesselK、BesselY
1 D  E2 ~2 E% a) mGamma函数: GAMMA6 T" V* f; |9 ]/ e
误差函数: erf* p- i( m0 ?9 ]& R/ N' O
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能.
) u5 ~, d( s. @* b+ ?! r3 u1) 确定乘积和不确定乘积$ k4 \- d- N' o3 z
命令格式: product(f,k);  
6 l: i4 W. s9 g$ N8 H# r4 gproduct(f,k=m..n);  7 q' {: @- O0 t+ S4 s
product(f,k=alpha); ' }5 Z- s( ~, s9 ]3 j
product(f,k=expr);. b* J# d' u& f1 {' \$ e
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式. - s' o6 v" f% f* b8 ^3 J
> product(k^2,k=1..10);   #计算 关于1..10的连乘
  h' q1 Z' X! E: o7 a3 H
& g0 t3 o; G- F8 k> product(k^2,k);         #计算 的不确定乘积4 i: Q* J; X9 x# b

! R/ ?: v; G  W. M> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘
4 S& e) j. y1 g
; X5 F: W8 @3 J, E+ w4 j> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘7 h. M- x/ w$ P

7 }& f8 J% p' `. w  @! _8 |> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式# m" F' C& l& x$ q4 \/ M4 B

$ L1 P' @# J1 K" |' g> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积
( {. A) M6 Z# v6 B. ?8 S 5 d$ p* [5 {2 `
    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
' y$ O  |& C. |+ t  L: M2 J> product(x+k,k=0..n-1);
& [1 j& I/ B( I  ]) F/ t* O % w( Q( q2 N. [" V, W8 ]& K
如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   0 c& u& T$ p! f( K: y; ^# I( j3 b
> mul(x+k,k=0..3);/ a, J7 j# V" a' \$ M

( T& t( x" n+ J2)指数函数
6 i+ |/ g" B0 ^9 s1 E& Y计算指数函数exp关于x的表达式的命令格式为: exp(x); , Y% B% y6 v! H& w& G: v4 {. V
> exp(1);
% o7 }+ ?0 k" K3 M3 M. P
* {% ]8 {" C; N8 v. k6 c2 l> evalf(%);
  j0 {; p0 }* I2 D' E
" W. C. y5 L: i7 g> exp(1.29+2*I);) d+ l* q. j: X9 D* X+ }. e
5 M; u# r/ w. h3 a/ d
> evalc(exp(x+I*y));2 U+ F- z, q! r( `( m1 s4 ^7 E

& j  a$ j9 J1 m+ K: w3)确定求和与不确定求和sum
& V0 d$ ?; I2 a* x3 e" K$ s命令格式: sum(f,k);  , M* M& {2 b2 v! `8 W" X3 Y) ~: W+ S
sum(f,k=m..n);  6 ?% b, I) k: T( ?2 y
sum(f,k=alpha); ' X0 N' D6 r/ ^2 l( Z  \
sum(f,k=expr);0 v1 T" H9 G+ h: Y* n4 I: s6 b
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式. 0 o. Z4 W+ U  j! c7 _# U
> Sum(k^2,k=1..n)=sum(k^2,k=1..n);8 J1 V* M/ \8 t4 p  o* ]+ v
1 w+ W: ~2 C1 Y3 q! f# [5 I
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);
, ]% s7 J, v$ V2 b 2 h8 C8 A) E8 N: J. `5 L  u6 x
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);
7 y" `; y9 j) N0 F2 ] 3 L+ f# [4 b- ^% X
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);
. O! \# W* a. [  u0 U - Y9 b' R7 b6 ~% _2 ?+ |
> sum(a[k]*x[k],k=0..n);
9 S) C; q' R' G3 w2 l) g' G) Z  E
$ j# {5 C9 x5 t1 M> Sum(k/(k+1),k)=sum(k/(k+1),k);
. P) K! K" I! L
- q  B9 D: C- e( t8 M; R# y> sum(k/(k+1),k=RootOf(x^2-3));
3 X1 w% j8 K& b7 f( `# U5 L; x
2 X; |. Y3 I/ A( {: @sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的. 4 B7 W# Q) x0 ^9 }. d
> Sum('k','k'=0..n)=sum('k','k'=0..n);' ]2 J+ Z$ C3 v- j9 h/ K
9 R5 n8 C3 l9 b' ^8 [7 c
如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   
' u$ E% ~  G5 _> add(k,k=1..100);
, }& {% j5 w+ i' B% W3 d0 T , C, W) u5 x+ h7 h: ]* l9 o7 h
尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令. * v+ t7 {2 M; }+ p, ?2 \
另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
+ e7 x# y. p3 ~; s! x  _% N3)三角函数/双曲函数3 {0 V) n5 Q8 c, V8 ^
命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);# G: z' g0 R1 H' w
          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);
# t) E- s  q+ U. F+ H其中, x为任意表达式.
6 n7 Q/ z# O& e9 i. {值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.2 o- Z) i* q& w* O1 P
> Sin(Pi)=sin(Pi);
9 ?8 ]; C- P5 i4 o6 O
/ C, n& K) X/ c> coth(1.9+2.1*I);
- p$ J# _6 R+ Q! r
% R! a) e: E" @$ ^1 I> expand(sin(x+y));     #展开表达式
' \# P2 t0 F' [+ ?7 v3 S
0 }' [! L. A0 Q! v1 X> combine(%);        #合并表达式$ S# I! }/ K2 ?) Q" E# i$ n9 X

/ ~; w+ X5 c7 v  `> convert(sin(7*Pi/60),'radical');# f  B2 V/ S" ?/ p$ ]3 o7 Y

! v6 {; `1 \8 D% Q> evalf(%);
8 m/ {' k  P6 k- [( e: j* w
! Q9 w5 p6 G, W3 f; v1 d0 @但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.* y# m  L$ C& Y6 x( S1 h
4)反三角函数/反双曲函数
+ a' X/ E8 V3 D+ B' T( H& U" Q命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);' U, E1 R7 O! t- h: ]1 J7 G7 w: b
     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   8 o) d6 c) I' D4 u' c
arctan(y,x);
. P0 N2 S+ a0 _0 p6 `* F& c其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算.
2 ?6 I4 ?3 r+ J: u0 ]3 L算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.
) ?) @5 p* Y- @> arcsinh(1);0 H/ B* w7 b9 X* c& _' ~7 q2 @

, A3 u. Z, }5 j. ]7 U  b/ R) n) [> cos(arcsin(x));) O! v0 j2 L; C; h2 p, k
$ v1 G% k( P/ i
> arcsin(1.9+2.1*I);6 h5 I3 @/ D6 u7 M! ]( q! Z, z) J
' x! h' U3 _9 H8 A/ v) |. h
5)对数函数
$ y8 }1 N( o$ ^8 w- J. {命令格式: ln(x);           #自然对数
+ n6 H4 @3 m4 ]! M! z+ q; vlog[a](x);        #一般对数
: n! w1 @  \: ilog10(x);        #常用对数+ j9 F0 K% d2 E+ B( z0 i0 u
一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   
, m* N* h6 \- u- M  (其中,  )/ `( X7 i  h( Y& e$ N3 D5 ?! {& X
> ln(2002.0);6 n3 j7 ^/ c5 |9 d* R8 R5 V
8 z* j, w; T* B4 m4 C7 h3 a" ?
> ln(3+4*I);. b. ?- B" q% Y  X9 c- t

1 [" o( V- ]$ |7 M7 @+ }$ H> evalc(%);    # 求出上式的实部、虚部
- n% @# T# h* P& T3 v9 z
7 K' b/ n9 d* H  i> log10(1000000);
6 s: ~8 S2 R# l6 f# @" L0 n ; S4 W$ r8 G5 H5 A2 F
> simplify(%);   #化简上式
% |, x; [$ m/ m" [* t 6 u: e$ g. U( {
2.2.2 函数的定义: G' W. V( d. _. i1 e% o% E2 N
Maple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:     d$ m$ G8 O% e+ n5 V/ O
> f(x):=a*x^2+b*x+c;
) R3 Q- t; k$ E" f& @- t- d# u ( g0 u7 W3 P! U1 m% J3 b: q
可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   9 j% l0 n1 p. s$ C. a  E1 k! u
> f(x),f(0),f(1/a);
# D; Q  S- k+ U: \7 | 6 M8 V8 r6 N1 d" c/ G5 g
由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   . _4 _7 u/ P' A* p8 G
> print(f);( |/ A- k6 C0 J: g% L% w
6 R7 s/ t5 c" q( p8 h
事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. " W: X/ Q; x( F( v$ S+ d
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   
" A! @6 q# c) {( g7 x( S> f:=x->a*x^2+b*x+c;: w6 F' U( h' r! i+ B
5 j; ]% e# r1 A+ r; O! r
> f(x),f(0),f(1/a);
" L3 E4 `( y6 t" B: l" u; b 6 g3 ?6 m- N8 j. d
多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). & S/ @0 h- s2 w0 ~- ?3 S
> f:=(x,y)->x^2+y^2;9 }6 e. m4 i' V
- @9 T3 y7 b2 y( e6 a* {3 \
> f(1,2);& l4 l: v3 }' o& Y3 x1 `4 h* k( E
& f4 n! y, |4 l% e( O
> f:=(x,y)->a*x*y*exp(x^2+y^2);
( e) Q! l$ B) @  p, h) v8 `  |
: E% C7 i1 E" E- d9 S综上所述, 箭头操作符定义函数的方式一般为:   2 T. n( y. X* U! Z
一元函数: 参数->函数表达式
5 G) Y" L, P+ [5 r" j多多函数: (参数序列)->函数表达式9 w, T5 Z* g+ F3 |4 P7 w* k' u8 D6 z
无参数函数也许不好理解, 但可以用来定义常函数:   # L: R& t* g% r# \6 l: x8 ?
> E:=()->exp(1);
: |" i. D  a6 S6 x9 a  c) S5 E0 j; A + p7 n+ t- k. @4 t+ i
> E();1 Y+ ]$ J/ E5 V. ^4 M

% [( C  N5 Z: u5 F> E(x);3 d4 |" n4 L5 I& V

4 V" p% ?- ]6 a  z- x另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数. * K# L8 n) A5 L8 z9 u
定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);          1 @0 c) P/ i. f' d" M
定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     " H( x) I  ?) n4 \
> f:=unapply(x^4+x^3+x^2+x+1,x);
4 k% c- @% J& k" ^
& y* I  [& E1 q! e3 I> f(4);: W2 D  z( b+ E, g( a
" |' M" }. R% g) ]3 k( m
> f:=unapply(x*y/(x^2+y^2),x,y);
3 o  [; u4 P" y6 u% b' J" M
5 d8 \% @# ~$ b- U2 q  y/ M1 q! v2 M> f(1,1);
: `3 K" O& h5 J! @- H; ^, K6 _% z- e1 F
. T3 d  v& R: q/ t, d7 t借助函数piecewise可以生成简单分段函数:  n2 h% `& c% z8 f+ c
> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);( {3 w6 z: `' z3 [8 R. M

! L: F; g3 d" O% S清除函数的定义用命令unassign.
( d! {5 V/ K3 C. ?6 n> unassign(f);6 o$ w. \$ ^1 K! A4 m$ L8 ?8 y& K- s
> f(1,1);
# T% Y, c/ @- z2 s: Z& x
; V: o! d5 @- A" H除此之外, 还可以通过程序设计方式定义函数(参见第6章). * @. B5 t! {/ L4 W: X$ L! B. B
定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:1 T! R: R. s# Y  ?! H
op(expr);         
3 f/ |) K) e0 ]% k  T+ A/ dop(i, expr);           c7 S1 l; j3 m0 H+ t8 _9 W
op(i .. j, expr);      % t6 m; J- D7 `6 @( ~
nops(expr);
6 ^& j1 m, @4 i6 A% D: d8 ]0 z如果函数op中的参数i是正整数,则op取出expr里第i个操作数, 如果i是负整数, 则其结果为op(nops(expr)+i+1, expr); 而i=0的情形较为复杂, 当expr为函数时, op(0, expr)返回函数名, 当expr为级数时, 返回级数的展开点(x-x0), 其它数据类型, op(0, expr)返回expr的类型.
( H0 ~" [. H+ v  z5 Y命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.
8 Z: H2 \) l% M/ O# d( L5 R' Z命令op(expr); 等价于op(1..nops(expr), expr);
0 h& {4 v& G' V: D$ V特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...));
' [- C9 {. X3 H而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和. 5 U# }& t" P* m: k2 M  R) @
> expr:=6+cos(x)+sin(x)*cos(x)^2;7 \' S( x+ P2 F6 l0 R

: x$ Z1 g/ @# I, o/ }> op(expr);
5 e  E$ o, |# s2 ~1 t7 B
1 A3 V* V/ n! p* m( O> nops(expr);3 l) S$ a3 T; e

; }5 i2 }. w1 j# |( }1 m> p:=x^2*y+3*x^3*z+2;
' ^4 y2 |  Z/ M/ }: F+ D+ t8 [ 5 Z- M& p8 n. B8 B9 u. ~$ S$ Q6 @
> op(1,p);
* u. l! {  [% C; `6 `# p1 G1 O
* A0 c8 [; t& y> op(1..nops(p),p);
" k9 j5 P& Y# w# M + A8 t5 L0 P, T
> op(op(2,p));- s% e# ~( \$ V

4 q( r8 O5 b  N3 K7 ]- {$ B> u:=[1,4,9];
3 N; ~6 I) E+ C
  @* n3 K1 R" V' P> op(0,u);
. N# |5 Q& P& C2 C8 K4 Z
+ s, U& E/ O" Y% G0 _+ N1 D  O8 {, M> s:=series(sin(x),x=1,3);$ r6 y; Q- g* l6 T: p0 ~
, r; k: m, j6 Y3 y7 I# q+ g) _4 Y
> op(0,s);
! h* L/ t6 w1 M! E  S; @         8 {+ P' f( C% \+ P! n6 c5 I! [
> nops(s);1 r/ Y  ?- [: r: q
7 ]( K% X1 l7 p; O; S
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:
8 A9 Q4 t( n, _' E% i0 Q> op(x*y*z);
/ l: q) ^1 F3 I
5 _% v) A# {; K2 [> op(x*y*z+1);
3 ^  J; r4 O/ |% X  p6 {, f
, x) d4 {" A- R- o& [+ }+ O2.2.3 Maple中的常量与变量名/ O1 v. C( {: l; J4 B2 f9 y/ z) {$ \
为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
! K$ m/ z7 Y" j& @  e> constants;
* I  n, H4 Q9 L # Y4 o/ `$ S1 L* M- f8 o
为了方便使用, 现将上述常数的具体含义列示如下:   ; I0 c/ m) ?/ V7 H( I' C) h
常    数        名 称        近似值
8 U; Q* C5 q: R$ |5 F, i' N9 b) _圆周率
. J: j6 S) m2 [  L( w. h9 P$ cPi        3.1415926535
: O6 h9 [6 ]$ i4 o; `8 zCatalan常数
1 R5 E, y. g) H" OCatalan        0.91596559425 n0 F8 |/ y4 G% h' f
Euler-Mascheroni常数
9 A" |. z- I5 bgamma        0.5772156649
$ I4 k9 J! r3 |& \0 y6 I # Y6 U! R# V' s7 @0 M9 f
infinity       
1 O1 a& l( a0 T( a/ z, s0 [+ Z" f/ Z7 M  O
需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取. # ]7 [  L0 e% X' e0 R
在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
! |2 C$ T8 g/ l) v1 Q2 \! G) l值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. 0 |  m7 B0 j5 B/ b0 S
在Maple中有一些保留字不可以被用作变量名:   
- B- t, L/ l5 d! h9 Y' Eby      do      done     elif     else     end        fi        for      
' ]) _5 a( P; g: }4 Y$ Afrom    if       in       local     od     option    options     proc         
3 N% q+ c. ?8 hquit    read     save     stop     then     to        while      D1 o6 c( H+ a8 Z+ o
Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名.
3 r1 n- x" S% R; {+ O1 u9 x: q另外一个值得注意的是在Maple中三种类型引号的不同作用:   
- `  N4 o( l6 Y+ e6 G`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;   
" K; ^' Y# M8 ]2 F0 R* V+ D'  ':   界定一个暂时不求值的表达式;    , s2 F$ q# ?5 Y, y, y4 c- s5 e
"  ":   界定一个字符串, 它不能被赋值.
- z, s* K- _% n  i% e; A2.2.4 函数类型转换           
9 Y3 j: A; Q" x5 a7 @函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  4 n4 g# ]6 G- V9 e
    convert(expr, form);        #把数学式expr转换成form的形式
' n/ \- O. j" f. @/ Kconvert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos( x& l% V/ B5 m4 ]' M
convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   % f7 ?+ o( @) |3 {
(1) exp: 将三角函数转换成指数# S0 K- a- _3 Z% t; g4 ~
(2) expln: 把数学式转换成指数与对数
1 S1 G, i5 L1 B2 o/ p( D; W) [(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式
* D) _  [$ }) w( [5 f0 ^5 _0 p/ w(4) ln: 将反三角函数转换成对数
7 M+ {- D! O6 r( S# [/ c/ n(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式7 o+ d& i7 g+ ]4 S
(6) tan: 将三角函数转换成tan的形式
/ k7 U" e+ c- ~) w# u- X(7) trig: 将指数函数转换成三角函数与对数函数* i  A( N) O3 m8 K4 I7 J# c
> convert(sinh(x),exp);   #将sinh(x)转换成exp类型
2 Q! T7 ]5 R, {# T  ~
  E9 R/ C0 ]; W9 d- o> convert(cos(x)*sinh(y),exp);
- H( d6 P" m( {3 Y! o0 F 6 V6 {1 v6 ~" l8 I+ M6 ^7 C
> convert(cos(x)*sinh(y),exp,y);, A0 n+ W6 k# |
4 m  k" A  l. _- S( C) K
> convert(exp(x)*exp(x^(-2)),trig);  p. \( b, K0 N& a" }3 i7 X/ \

( V# I9 g# j" y* V4 e- ~> convert(arcsinh(x)*cos(x),expln);3 f) |3 J$ o- w. Q* L8 }
6 W( M% s. u& T% E  Q( [( u
> convert(cot(x)+sinh(x),expsincos);6 W1 _: K* I1 P( v/ }7 j% l

& A- V( |' V! L> convert(arctanh(x),ln);
+ W5 @' \0 C# |
/ @4 ~& F- ^2 ~/ }3 hconvert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   9 q# C) {6 q% @2 a5 I' H7 ~" u2 E
> with(codegen):
4 g# z0 |8 v9 c0 j> p:=4*x^4+3*x^3+2*x^2-x;2 _1 j3 i$ k, K( J2 ~
! L) F0 R: I5 F9 r* [) Z: f* M
> cost(p);) r) W# [# Q) W4 e9 t
( E  f: f4 s3 L$ y) ?
> convert(p,'horner');  #将展开的表达式转换成嵌套形式
3 D  b' D+ n7 h: U1 p" k 5 s4 {! }" i4 l, B! q2 B
> cost(%);
6 v1 Q; H. u" n6 r% O / ?2 P. d; ^, Y! V3 t
同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量.
' Y; x3 H' @2 ?0 f! H3 j, M& I> (1+x+x^2+x^3)/p;
, h, }$ a2 I6 K1 s1 o! R
/ T0 h2 M- G, z! M, d/ J; r. x> cost(%);' W8 l, u& l$ u2 b& B

; B3 ~5 h6 d, y# j: U> convert(%%,'confrac',x);( [: Y$ @9 \' S0 G' q" `/ N

. n6 ?- L& X" {) U> cost(%);, d! H. A& Y- F' j6 \

# ?& _) k6 _; {' i  _6 o在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式.
- n) y, `  |$ d> convert(%%, 'parfrac',x);
2 H8 N$ i0 Q- A! V! w - W- C6 v" w0 N# m( v, a7 e
> cost(%);5 j0 y; T& b  {7 ]
6 y1 H0 I3 }8 @- j1 b9 H: t
而把分数转换成连分数的方法为:
: p: r1 B' I( Q  l1 {7 A0 y> with(numtheory):! L# y' A* o$ c1 |7 r
> cfrac(339/284);
7 h3 e6 p2 X; W" m* m2 z4 v' i
4 W: I2 @% Y; d2 u; d2.2.5 函数的映射—map指令! N6 X6 x5 ?4 B3 o, L
在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:
6 @! J" E- L/ x9 x; e4 jmap(f, expr);      #将函数f映射到expr的每个操作数4 @" p8 \* \8 y  P9 _& u: c, f- ?& }$ A
map(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量; {; M1 K% i' c# L
map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量; V* }9 L, j7 n2 L9 R( _+ i' m
map2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为. X& b3 }: d# O" y9 H( T5 _* V
第3个自变量…, an为第n+1个自变量来映射函数f
, r0 T/ ^) B2 i( ^* c> map(f,x1+x2+x3+x4,a1,a2,a3,a4);' P* l7 a1 m# g6 I5 F0 H  H+ |% w
$ x& B% A9 n7 w  F3 q( m3 O6 L! a) t
> f:=x->sqrt(x)+x^2;& I/ O& X8 a; ?- B9 `! W
  ]0 J, M4 I2 }& b, v
> map(f,[a,b,c]);
# U% r3 A. Z* m9 p3 p ( }/ F3 i2 e. g/ `% J9 A" h
> map(h, [a,b,c],x,y);
3 S! a% B5 Z; E$ M2 ~& ^
5 ?+ r: j1 P; x9 Y7 H+ W> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);# G7 o& s9 e4 v. I
2 G0 s# e7 d; A1 h7 q* n
> map(x->convert(x,exp),[sin(x),cos(x)]);
% _1 x' C  C8 a  |! G+ v   S5 A7 X+ y3 Q: M7 ]
上式的映射关系可通过下式理解:) z' P5 K7 d2 b$ Z, S' l/ Z/ t
> [convert(sin(x),exp),convert(cos(x),exp)];7 `; t, z; X/ p% \4 V
5 ]2 p; X6 s; ?/ V
> restart: , n% P. N. g' y/ u% h
map2(f,a1,x1+x2+x3+x4,a2,a3,a4);8 V/ Q/ b8 d- J9 j0 @

+ b" |+ x9 l  A( s# k( q, s& z: ]> map2(max,k,[a,b,c,d]); 3 E* H% Z1 g9 X; I# ^/ R

, }; G8 C/ V1 B- |4 |* Y* Z! @再看下面示例:   ) m2 p. D9 N6 m9 D* H
> L:=[seq(i,i=1..10)];
4 \# ~& k( Z) ]3 B: K4 f % \  r3 A- w3 j
> nops(L);1 X6 n! S. ~, J
' E/ u+ a% [, l
> sqr:=(x)->x^2;& u* s% `6 _$ k( g

  q* {5 y4 {* j; j) y! U; j) B> map(sqr,L);% u& A, x, o% J' u
; `& R1 _, q# H# p1 m
> map((x)->x+1,L);- |2 o6 O# n# L- z) |
3 f" ^4 ^7 V; B" e& _+ B
> map(f,L);
* o2 k7 K5 \1 }* s, @ 5 R# m0 m, L" {5 i1 r* D
> map(f,{a,b,c});( V7 y: Z& n3 G, C+ A
- J; c) b9 Q- `8 a" o
> map(sqr,x+y*z);/ B8 z0 z% u7 }/ r
. P- i* G2 e& {4 I; T, M; M
> M:=linalg[matrix](3,3,(i,j)->i+j);1 S3 d) b4 @- l- e
9 G; J/ k2 \' C. D
> map((x)->1/x,M);
6 C* n2 q* B+ T# {( ? 8 M5 `, N1 w# ~, C3 r
3 求 值
2 m5 E/ j$ ?" L) F) E3.1 赋值
3 h% B" @) _  S+ K) G. A在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子.
# R1 l3 w1 x4 x. E: @3 b# S> p:=9*x^3-37*x^2+47*x-19;; t3 ]; [: B( l& J

8 U( s$ u# v% z5 j5 {, N9 \2 g> roots(p);
- x1 e: F4 [% m" b & g% q* h5 W9 P
> subs(x=19/9,p);9 [3 `  B& O  O

: t+ R1 ~; E( t' k" f在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量p和多项式9x3-37x2+47x-19相关联, 在此之后, 每当Maple遇到变量p时就取与之唯一关联的“值”, 比如随后的语句roots(p)就被理解为roots(9x3-37x2+47x-19)了, 而变量x还没被赋值, 只有符号“x”, 通过subs语句得到将p所关联的多项式中的所有x都替换成19/9后的结果, 这正是我们在数学中常用的方法—变量替换, 但此时无论x还是p的值仍未改变, 通过“> x; p;”这样的简单语句即可验证.
0 q9 G8 |# R! q3.2 变量代换+ Y, q1 N. h( l7 E
在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   
" D5 |, G' {8 S. Qsubs ( var = repacedment, expression);
: X! `4 R' T! Q7 t8 k; {- \调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement. $ ], q- @: Q& I  R
> f:=x^2+exp(x^3)-8;
% f& n0 t: V8 Q# w5 Q, k3 s. g , z0 E- C& T( w9 H4 Q
> subs(x=1,f);1 T/ z8 o9 |$ P5 L. t7 n

% U' ?+ q) Q5 `, w( w! Y8 X8 g5 M> subs(x=0,cos(x)*(sin(x)+x^2+5));: v8 ?2 Q$ F  \% v" Z& S- N- X8 x/ t

* y, K3 i) v/ W3 P( b    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   8 P! O* O# C& ~' p" r
> evalf(%);
- ?, M/ X2 P2 V& @+ |: H
4 J: E/ H, Q7 G4 J* P变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   - q9 \. S) X0 m3 ]" b9 C, Y
subs (var1 = repacedment1, var2 = repacedment2, expression)
; X' T0 w3 K/ Z: M# u调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   3 E, Y3 z' }) J' G" G4 w7 e
subs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
6 E; J. }3 T  \' L' o  U下面通过例子说明这几种形式的替换.
9 h" x* a. X, ~7 i> subs(x=y,y=z,x^2*y);              (顺序替换)5 |* a% p8 s3 p. x% n; l5 L
% E& w! n' t( c) n8 ~% c
> subs({x=y,y=z},x^2*y);            (同步替换), o) ~- \8 n1 ?
* A( w; T3 f* s7 g) y3 @
> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)7 j% q2 C! o. m) ?* v/ S" x3 R

3 j. f' @, v* U, q$ x8 S8 k7 f8 X> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)8 H9 T7 h( b. I2 V" I/ I; |
: {) u) t+ R0 H4 w5 O- R
> subs({p=q,q=p},f(p,q));             (互  换)
7 y; |& S7 [8 t
$ H; O4 ?* F! A( N0 p3.3 假设机制
! Z4 W: U  f, fMaple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.
* d6 \5 r" Y; @! [, i7 z( x7 d& q在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);: o( {& e/ x. U5 z8 j, s6 \) O' {7 F
函数assume界定了变量与变量之间的关系式属性. assume最普遍的用法是assume(a>0), 该语句假设符号a为一个正实常数; 若假定某一符号c为常数,使用命令assume(c,constant); 另一方面, assume可以带多对参数或多个关系式. 当给定多个参数时, 所有假定均同时生效. 例如, 要定义a<b<c, 可以用assume(a<b, b<c); 同样地, 要定义0<x<1, 可以用assume(0<x,x<1). 当assume对x作出假定时, 以前所有对x的假定都将被删除. 这就允许在Maple中先写“assume(x>0);”后再写“assume(x<0);”也不会产生矛盾. 1 y% Z# s7 M' Q) `/ Z. ?" h' v$ H8 J
> Int(exp(-s*t),t=0..infinity);5 Z: Y" S3 e, J8 S# ^

! q2 ]& {1 Y3 {8 i> value(%);. J8 c+ j( `; O( k$ g/ D3 \
Definite integration: Can't determine if the integral is convergent.
1 Q6 ^' ]% j# E" G. \# J0 }Need to know the sign of --> s# |; _: z4 @: _4 R( e1 i& v# q  F' s
Will now try indefinite integration and then take limits.
  g9 E+ v$ \8 a# ]3 t2 q! {, ?# z9 { 9 R2 t! G( Q" B/ `4 s& F
> assume(s>0);
. c4 v' B- g: U8 |4 c0 S5 h> Int(exp(-s*t),t=0..infinity);2 H7 h, i# f. G; |

" u* D) p5 U: t# {/ f6 Y( Z> value(%);( Y" y( ]* }6 f  I( g# T6 g) r) m2 R
  C, c2 G# N  v/ d3 t3 @) M
3.4 求值规则
  ~( `5 f; W; ~9 q在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:     Z) D' E: [3 b- J
> x:=y;5 w8 ~- f4 b. s. _8 a( H: Y2 z
* {. u. f* A6 H0 E: D
> y:=z;/ o. b; I( t0 F3 h1 l
6 v* k7 B! U6 i8 p$ x8 J% g& w3 P$ t
> z:=3;
2 _, Q. Z5 J# ~5 t4 e+ r 8 Y& M8 A5 w9 m( \9 k9 Q
> x;3 e$ N+ ~- t+ B2 b
4 ]! S* p# g8 A( M( G) ?( F
> y;
/ f- v: G4 L+ s# [% ?
, d6 e0 ~' a8 d' ^* j1 ?> x:='x';& k  t8 S! S: e2 b% M3 x

4 A$ W- X! p5 W> x;+ m" g# H9 [" I, h' |8 r# H
( q* b# E( Z! E
> y;
6 l7 v% v* I% v
% A7 A# h$ N2 O1 Y6 b0 G' R) P对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   $ U) a6 V3 Q  u- L; T
1) 对表达式求值& n: _  P8 S* |7 t" D( m
命令格式: eval(e, x=a);  #求表达式e在x=a处的值4 [2 V0 x  p9 r2 ?/ K
             eval(e, eqns); #对方程或方程组eqns求值' K) K1 M$ p1 e" ]
             eval(e);      #表达式e求值到上面两层( A3 S# ~( w7 @& M( M- H" Q
             eval(x,n);    #给出求值名称的第n层求值
# c6 _0 y7 a1 F6 _+ A> p:=x^5+x^4+x^3+x^2+x+73;
7 V  f/ J. P( b! ]" r1 h
* X* u: u, G' [% d$ N. k; T6 w> eval(p,x=7);+ J- `9 ?6 q* V  o5 j: n$ e* w: j

$ O; M+ c: o2 f+ _( d5 U> P:=exp(y)+x*y+exp(x);% Q) h: S4 x" j
2 H4 `' H! Z( R; D( N2 X& r( Y
> eval(P,[x=2,y=3]);  r: Z3 e& {: [, k( M" A
% d' T- b4 B: k8 i; o/ L
    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   
% b) U' Z+ D7 E0 B* n> eval(sin(x)/x,x=0);9 _8 U' v* d5 V4 q, h4 Q& K) A
Error, numeric exception: division by zero5 e2 k( l% R2 |& t9 Q& x( a
    下面再看使用eval进行全层求值或者对名称几层求值的示例:   
1 }- x3 a# B' I% z' X2 C% i> a:=b: b:=c: c:=x+1:5 |. z2 d  s+ Y0 C! r6 R
> a;              #默认的全层递归求值
) {2 j3 z7 r. A 4 w$ n1 j& R& M* q* [( i
> eval(a);        #强制全层递归求值5 l: h; V8 v% u* s) z

# `6 H* b9 J/ a4 g9 x- ]) {> eval(a,1);       #对a一层求值9 n8 `( z; q# D; B

9 S. q% o3 o. N) E! D6 U  ]3 J' N> eval(a,2);       #对a二层求值
8 f: F: ^! N6 A7 K4 c2 w : u' r! Q& e  g, b2 B% `: g7 P' n
> eval(a,3);       #对a三层求值
* i3 a) L4 X* R& J- E' u; i
* s# T+ F5 ^) V2 v' j8 e$ l- Q> eval(a,4);       #对a四层求值
  ~: \5 K/ ^" o6 s
) d6 S+ u, g2 u% g! j7 y    2) 在代数数(或者函数)域求值
& F. y7 G% p# Q% I3 G命令格式: evala(expr);       # 对表达式或者未求值函数求值- W; @$ S* E, d4 q
             evala(expr,opts);   #求值时可加选项(opts)
# w) i! a: [/ R- w0 v$ A所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式.
* m, W5 W/ u8 F代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   ( O) h1 u: Z/ g# ]  ^, S" J+ S. F
> alpha:=RootOf(x^2-3,x);
7 n6 A# T* f, F+ B! a! c; h , m2 u* I8 H3 N& x5 K  i) Y! ]
> simplify(alpha^2);
9 R9 W/ w7 u5 C0 ^: n# z. X * N2 s' m% e, ]
在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:( e* j0 a& z/ K
> alias(alpha=RootOf(x^2-2)):8 F, L3 u" J' ]6 O/ L* \( f
> evala(factor(x^2-2,alpha),lenstra);
# t" T3 n% T! Q. K0 E- Z
6 h  J; d  I0 z/ s4 C> evala(quo(x^2-x+3,x-alpha,x,'r'));
! H! X7 s- c1 E( Z8 Z
5 `+ B/ W8 O. L) c> r;2 v, z" \$ ?* D9 y/ X) [7 t
: D0 R9 ]) |  r' M, Y$ y
> simplify(%);
& f# w! p  Y9 J: U  X1 U
3 f% y9 S$ a7 }/ }4 d2 q3) 在复数域上符号求值( I, L2 U5 C* Z5 ?2 P2 M
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:
( N) Y; o# S% U. h, K+ E2 devalc(expr);   
4 a$ \  U! K* z9 b8 o* eevalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2. ; A# I7 u5 z% |* R: Y9 c! b
> evalc(sin(6+8*I));
! C. Q/ F' u- M; g' m
5 }: i; `! P/ ?9 x& G4 J9 h( c> evalc(f(exp(alpha+x*I)));
  \6 ^8 W4 f7 k0 f
* `. n  Q2 o  w> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));# m& {+ R, V! i2 N' H  D
0 {0 q  }: V: y8 t# n7 {; L: }
4) 使用浮点算法求值& `1 X, R  P; S0 X) R
浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     4 ?0 l( a- {9 L3 V1 v
> evalf(Pi,50);   
1 v5 p$ h* a- d; G/ b" R. p
  Y3 R+ h  L7 b2 |/ D" h! S> evalf(sin(3+4*I));   
" Z% L# I: X# o. @) G# ~
/ }" p' W0 o0 x) L" z> evalf(int(sin(x)/x,x=0..1),20);
5 n  j/ f; m0 h, ~" `: U2 T
5 G) C' y" `% F5) 对惰性函数求值$ ]* D" ~- o" V% C. e2 c1 Z
把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   - ^/ b, D$ {! H7 a
> F:=Int(exp(x),x);
$ o+ q( Q' A) ? , i% L- ^( t# w5 _; @5 J& f' V
> value(%);
1 U( W# p. ~7 c
7 G/ }, O" z" _# D  {- B* A> f:=Limit(sin(x)/x,x=0);1 S1 _/ l7 ~% m/ w  ?

( B, M& f0 D1 }, B, u( P! a! D> value(%);: o. b7 J7 }$ k0 R) U7 h

5 S, `- v( P. t' H; z另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   6 s( u) V) w! A5 {: m" b
> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);4 y/ Z; _) e2 l5 m
9 z7 B2 D6 Y8 b. U- @
4 数据结构; B7 @* \# i7 c, W8 m8 J. ?
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表. 2 R4 ]$ F. C2 w7 B6 `1 P% m6 [6 S  r
4.1 数据类型查询
4 x* W7 c# q8 z! J0 W; n0 R1 h) q6 A在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
/ k( k' y7 p' Z' E% O) [9 |: Dwhattype(expr)        # 查询expr的数据类型
1 }2 r4 t- a7 @. Wtype(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false. X8 q4 ?! R4 _  S
> whattype(12);
. y9 y5 w& \. b% ?% i, o ; g0 V1 B; W- w* Q0 O
> whattype(Pi);
1 h6 f; ]% B) A  `  c
3 b/ y: p4 [4 C+ p> type(1.1,fraction);$ X5 V) z- Z1 t. i5 ]9 [) k
. n1 G1 E/ z; S: w, _. @+ y, O
> whattype(1.1);
2 l, e0 N2 a2 u9 k . ~) P* H' C& W% I+ E
4.2 序列, 列表和集合" ~. l% s+ R; C: [
4.2.1 序列
' @5 W9 N& \0 U' M. \( U2 n+ w9 a所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
( H; X3 |* i& e/ d> s:=1,4,9,16,25;
% Q: {: ?- U( D6 B
. s) V' j: Z7 g, p  ?+ q& D, c> t:=sin,com,tan,cot;1 ?/ u) _+ s* n  T4 _3 [7 d& {

9 L3 I5 |3 p% P* |( M8 i一个序列也可以由若干个序列复合而成, 如:   " i/ U$ r. s1 A# P0 h3 }  |. V% s
> s:=1,(4,9,16),25;3 a' Q$ I4 K8 q+ X; m  e% B
5 N! G3 t; m. n0 [
> s,s;
# k4 n* E  {* u* F7 o$ ~ ! j# Q% V  m+ K( @/ T$ {
而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   2 c0 A, J* W2 n* C% W3 r
> max(s);
7 M. V) _) p% h4 s3 ` 0 i9 @4 r8 A" N) G- y' f9 N# o
> min(s,0,s);, {, W9 O( m6 ]7 Q

6 Z9 i; P: ~/ }& M) D5 v值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中. * i. T) [# h' {* r% ]; m7 `
> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;* [# T5 s1 I8 A1 S

! j2 E5 `) N2 O* ~! W& t5 v+ D! r- f> op(s);
& |3 k; Y/ Q$ j& ]. R* lError, wrong number (or type) of parameters in function op
' K+ X7 Z  b& P( b2 D> nops(s);. J2 E* j3 x) M" V: f- K- C
Error, wrong number (or type) of parameters in function nops
- F: f/ g* y4 s- F( Q) t* @> op([s]);3 B2 K) O1 F) a. O$ e

- g: N" ^( H/ B, f! `! z2 I8 A> nops([stuff]);: l0 Y" b9 N$ l3 C
) t  X) H! a6 Y! T3 ^
函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   
+ b: ]$ C$ F/ s# y: {seq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)
2 R* I0 U# ?+ ]2 c1 E1 i) C( C. cseq(f(i), i=expr);  # 生成一个f映射expr操作数的序列- h4 [: m2 F7 x. T( f2 K
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列, m1 K* a9 P* c) a) K- m
> seq(i^2,i=1..10);, k# U2 E$ Z2 \1 K8 B2 P

% z' L- \( d+ W; |# g> seq(ithprime(i),i=1..20);8 Z' x0 d9 k) E- C3 E

+ `- w) R$ j) \& g+ H4 g; B> seq(i^3,i=x+y+z);
+ J. J* [; I( `, o9 X; O/ e0 n: _0 ?5 N% [
9 C. ^, E4 I- F> seq(D(f),f=[sin,cos,tan,cot]);
" t9 [7 N& j0 F" ^) `: j0 O
2 L6 E4 L# b# J7 h> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));
# i6 ?0 \5 q8 t. H7 \0 G
- Q8 |' U! I) j3 s; N4 X+ ?. H获得一个序列中的特定元素选用操作符[  ], 如:   " G% ~7 G8 ~$ z) b6 r: y: V
> seq(ithprime(i),i=1..20);8 \3 N( g$ b' W' J0 z; a

5 E! |- e9 |3 |& J' d> %[6],%[17];
" x9 }& Q- H' w' c& I" ~+ T. } ) `2 c8 r* c: j) ?  n
4.2.2 列表( f. E; \  P# g- D5 S8 R; `0 V+ P4 ^
列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
5 F) _& F3 J/ K/ g( a/ p: X> l:=[x,1,1-z,x];
" S: k$ W  i" V8 A: X& v- p" t' }
( ^0 B0 j6 A: f+ v# Z2 g* T> whattype(%);
. Q) d& B5 L$ U5 k0 t. F " A$ j3 @. q/ J0 u4 ]
空列表定义为[ ].
7 B4 R. D0 e5 V- j8 n但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   
" u" a9 ^# g  p! k; N- J1 E3 l# u8 n> L:=[1,2,3,4];
# x& Y( [9 l. D& E4 j ' Z! h9 L( b" x) J+ i- e0 C
> M:=[2,3,4,1];
6 c) a$ R# ~: X  [, G% } 5 \# `( g6 L& ?* Q; W
4.2.3 集合
, f& m2 ?+ w1 R8 F5 F; X集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合. ( {( ~8 c* S# ~* j2 d$ J
> s:={x,1,1-z,x};
3 C% i% ~3 Y% X$ @8 g0 |* a1 B 0 R9 `+ }' @7 R1 K6 }
> whattype(%);/ c3 v+ C( `+ D1 U- f
( |) l: ?2 X/ G; f, J; T/ q
空集定义为{ }. $ e9 `5 d$ c( _3 ^% }
函数nop返回列表或集合的元素数, 而op则可返回其第I个元素. ! ]: a$ {  S" c$ O, E+ @. V6 R% R
> op(1,s);
$ c+ L2 q/ K# ? & l9 g! j  @- Y
> s[1];
# e6 C  p* M8 h! P/ R; l
: {( w8 E0 L+ {  \0 M' F& G/ [> op(1..3,s);
( F( }  w( _! O6 L ' v0 y, @/ o0 W8 _
> s[1..3];
$ d# I5 u" T" e2 I( |
( M5 |2 d1 d1 o7 q( G2 F  L函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.   ]" S% P' U' X, ^' S# y( o; W! ~: c
> member(1+x,s);9 l$ i5 w. w( T4 u% N

" A$ D9 |$ }+ [3 H) y可以通过下述方法在列表中增减元素:   + I; S$ F' Q/ }$ l
> t:=[op(s),x];, P/ ]4 S7 h5 Z* c0 n/ d0 @8 T2 u
1 o9 \% h% H0 g, X  m
> u:=[s[1..5],s[7..nops(s)]];# s, S% X6 b. X; Q

: U" K$ a! K) a3 O/ X/ F4 IMaple中集合的基本运算有交(intersect)、并(union)、差(minus):   
; D, ?7 r- A5 u2 l# Y+ h! p> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};# i9 k. q) j6 z9 ^) X
  v' D4 f5 X9 a- g

5 Y0 n: U3 x$ s" \8 q) T> A intersect B;
& z; _$ y6 V* ?, B- _& L0 E
7 t3 }& z7 T0 U* f$ @3 p6 }) y> A union B; 5 t+ J; J/ g$ R& G/ V' z

/ e1 ?4 `* k& U: s% a, t3 @> A minus B;2 _; ]: |3 l6 H  w/ R' M

1 b: L8 P8 G" o/ q4.3 数组和表
. B; k, r% i$ E0 Z( J" O在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令. - H1 B( J; ?0 C) H3 s  U$ V& p
    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的.
8 b( v& z; l; Z9 u* N> A:=array(1..4);1 l4 I/ O3 p2 P1 F
8 t. h5 I# S  r+ k  \
> for i from 1 to 4 do A[i]:=i: od:
( O0 J) j/ R* Z. j* C, S8 e$ S> eval(A);
; b; `" @$ p. X0 D4 L  a2 }! p
$ w7 }/ W7 X' J; O$ T> type(A,array);2 J- K1 G: z* s$ f8 T6 |/ H

( Y# R5 s- X! y9 c> type(A,list);; e9 V/ O! @. h9 g& f, S+ W1 Z! @
- \+ L: E* @1 c/ R. i
> T:=table();
2 y( c* K) j+ u ) Y- I! J/ ?, F; C
> T[1]:= 1;3 _) |3 a( a# Z7 D5 U1 N. e
, `! Q( S. j- K; t
> T[5]:= 5;
: e! q! x6 B2 _, i7 K/ m % J+ a# C/ F+ w& ?
> T[3]:= 3;
: _' j6 U4 R/ c' z6 t   {; d: i. a5 f: M
> T[sam]:=sally;% H; I" D1 q9 L1 Y$ X* O& ~

0 k" d9 {8 L/ x> T[Pi]:=exp(1);
( j9 g3 w5 V! I, f; O
: C+ w" h, P2 ]> x:='x';
0 K8 I: Y9 A, c7 g7 n; q. D7 ~3 P # ^  L) \# Q& |$ G: `1 X3 W( Q
> T[(1+x+x^3)*sin(x)] := 0;
- a9 h/ a. |9 A' z& D0 y. X) ~ 4 [* {* K2 `2 l/ b) V" z& o$ S& R
> eval(T);5 A. k% W- f( Y/ ]
9 H+ A- e0 c/ E0 e4 h3 V' `, x
> T[3]:='T[3]';
" a9 u$ _' W0 r# P4 ]$ h( J, m- h7 \
" [) v0 I3 b( }5 I# a1 M( S* d+ f> eval(T);
0 ]/ }/ X# T' c! ^. m/ X1 c$ g ) S8 V6 g; F9 b+ ~3 ]
4.4 其他数据结构! j! q# |; H' ]
串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来.
3 y# `5 ^3 c, ?, e5 s索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立. : M$ v5 D* w) V( p, [/ \
> x:=T[3];- _6 ]$ U6 |9 q- ^/ I; d/ T2 O' z
5 L- Z. I; O3 ~5 X. Q# E
> eval(T);
+ x  {# {7 p+ q: t3 ~" S( B% T- Y 4 p' M4 N, G# j  [, w
> T[5]:=y;
! U0 `+ G: k) r6 f: N9 d) p, r$ _ ! w, g* Y' L* H( B) @) Q' Y, W
> eval(T);2 N) k. U8 S9 \8 w- a6 \

6 C- a5 S9 q; Q! d: t) @由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
; W% Q: N; K$ A数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. : T  S; [& L, ^3 T; ~) I- b3 c
4.5 数据类型转换和合并
) f0 k! {2 Q8 gconvert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   
. J' o1 p( h3 D> L:=[1,2,3,4];$ N  d8 }$ D  m2 {5 I8 v  y) l3 p0 A

7 p/ a2 }, @% _8 A" l6 C. r> type(L,list);
$ B7 @7 b2 G: m* { ! F- N/ ]( Q, S
> A:=convert(L,array);
. P7 J2 T7 I6 J% A$ n
8 Z/ |* c$ F+ t1 I+ U+ a> type(A,list);
) l" Z6 W' y# r/ b5 T% A5 u* r1 g: K
0 V& S. Q' A5 t( A% Z& o> type(A,array);, i* d/ p9 a  ^; \7 n" R9 @/ ~

% V# a: W+ I; t  M另一个有用的函数zip则可把两个列表或向量合并:   
- n8 O- M$ j. w6 A2 i+ i. y# \>L:=[seq(i,i=1..10)];* A- D6 J5 G1 L- r0 _

9 _1 ^( [4 x# \( K> Sqr:=(x)->x^2;
; S; Y( U2 ~2 F4 N! R# V/ V
( q. F3 |1 F2 z: x> M:=map(sqr,L);3 `6 F$ f. N! q1 K8 s4 f

! }) i* n2 |; d. O> LM:=zip((x,y)->[x,y],L,M);
, n# F- o" \0 A7 k1 N7 h ' D9 j9 l4 P0 e6 h3 _
> map(op,LM);
. _: k0 C; b$ D% U6 s7 v1 V0 c 2 _' Y  [9 J# n9 [3 G2 A# |! H6 r
5 Maple高级输入与输出操作
/ z! a6 o& p( w  pMaple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里. # h+ C2 b  w* o, j3 j! F* [
5.1 写入文件3 E4 U% w; ?: D9 t+ o9 V
5.1.1 将数值数据写入到一个文件
% v. \0 R6 N- P+ @, V) _2 k如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令. 7 R& L8 {1 f4 r3 o. b2 R! X  p
若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);
0 _$ t5 Y2 s( L0 x- P7 b> with(linalg):
8 j7 }0 S. @! W9 w8 e+ X> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);' L. ]5 ?$ l' H6 A0 v) ^% f
' L4 I+ o# H8 ^+ p8 y! y% f) B1 M
> writedata("e:\\filename.txt",M);, |: i* U# Y0 a' y6 V. g2 q
而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);5 t' ~3 p3 r2 ^; `) e! N7 F  ^; {
> W:=matrix(2,2,[1,2,3,4]);
; ^% c6 ?6 t( y! i3 T. r
1 Z! Q4 P0 [4 ^: `) C3 |> writedata[APPEND]("e:\\filename.txt",W);
1 w# J4 S/ r; e& L$ v需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.
! `! G, X/ A- Q/ D( o另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);
3 C! o9 g/ g- H7 N: s9 I0 t+ _4 B> writedata[APPEND]("e:\\filename.txt",W);
% p( w) \) G  Y3 M; z, ^7 \, \> writedata('terminal',M);1 e% V" @! S9 }( R: t- G: g
1                   2                   3           
  U+ H8 X* f# D% R4                   5                   6           7 g# b  H' H+ j
7                   8                   9    ) J$ @+ [% t. Z2 b  Y+ g; F
5.1.2 将Maple语句写入一个文件
6 _9 f( t8 y6 J1 b, K- ]如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:
6 U% W8 }  s7 E" ^save name, "filename";
% ~8 }1 {- u6 g' }0 z2 usave name1, name2, …, "filename";
; X& \# d& c5 x/ L若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.
5 ~  B6 p1 ^, ~) ?3 w# ]> myfunc:=(k,n)->sum(x^k/k!,x=1..n);
- p7 K6 `' S% F$ y  z( l( v 8 K. M0 L1 K1 c
> myresult:=myfunc(6,8);
% X: D: [4 I& O9 O6 ? 2 m* d8 ?4 K, M0 l
> save myfunc,myresult,"e:\\test.m";
0 z) j, }6 _7 R/ u% a( v调用已存m文件用命令read. 试看下述实验:* R9 t. [3 F: |: G* l# T& s! R: Z
> restart:
; l# X2 Y# l+ O4 ^1 d: ?( c. W& h& ^> myfunc(6,8);
; J- M+ i- W2 `, l0 D" {
  H( l+ Q: m) o. ^% k> read "e:\\test.m";) O( b1 s2 F  @( o1 \" f
> myfunc(6,8);. Y/ ^; p' x! e1 |8 T

' l% ], U# f3 |% C1 |0 s8 @  [2 g> myresult;. N7 j1 r0 J  e% S4 E+ N5 x
5 @/ K' N" G' y7 p4 g
    而存为txt文件时则将整个语句存为一个文件:
8 j0 n; r, x* h7 ?; l  N> save myfunc,myresult,"e:\\test.txt";
4 t2 y( v4 R  J9 r: v$ v# }> restart: read"e:\\test.txt";0 u  E- j: l, [7 W5 U, F4 |

" Z* k. ]. o+ E8 i2 M9 K0 { 0 F/ H# s7 X! ?
5.2 读取文件: l+ u& o0 x1 ]
在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.& j, L8 s! i( ?) ~
5.2.1 读取数值数据
( b/ C+ m, Z; g" c6 e( A如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.
0 _/ D+ m$ a6 q5 U7 j从filename文件里读取n行数据时使用命令: readdata("filename",n);0 d- d- t# I& Y9 ]4 J  s% @# j. w4 q
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);
3 v" e, }( _/ N> readdata("e:\\filename.txt",3);
+ ~6 a$ @$ e" H ; D7 k; _; O7 E  u! w6 ~
    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:. I8 N/ g' o8 q" ?
> readdata("e:\\filename.txt",[integer,float,float]);4 R' `$ F$ ?- E5 ]9 P2 k
9 J' Y0 c7 @4 [: h4 G$ i
下面再看一个运用大量的实验数据在Maple环境绘图的实验:
0 I- K0 H7 Q( y8 U2 j, {5 N> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:1 C/ s! R' J. _- U
> writedata("e:\\data.txt",evalf(mypts));! z+ p- C9 a& s7 y1 J% W
> dots:=readdata("e:\\data.txt",100):
% {  D9 C7 a2 F( V> nops(dots);3 n4 D! p( {$ M! N$ t9 A; a

* I  B! a7 k- J& [/ m4 n5 w> dots[1..4];
$ x" Y2 b$ B- m1 g2 \ 0 H8 N: [' x1 c9 Y  A, N5 w
> plot(dots,style=line);
! I) q' S( X9 N# i - i, [. Y' U  t0 z$ _* ^
5.2.2 读取Maple的指令
; a. p& b6 k& J5 h$ x' M: C0 p0 R在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:, O6 @# \8 X6 C# b6 W( x% D& ]% R6 a4 u
read "filename";
3 \! X. Z) j; H$ }- [# N如下例:
# ]- @. t/ @6 g> reatart:
" J. O; A8 p! \5 b% j6 b. T: \> myfunc:=(a::list)->add(i,i=a);
6 U8 ]9 w- q* a! I6 C+ P
+ a$ c% F  ~6 x9 y+ ~# Q& N. D" H9 F> avg:=(a::list)->myfunc(a)/nops(a);
( {% C$ ]- }. d7 D3 |$ E( Z3 l; g   T& k- s4 _* J8 F: D
> save myfunc,avg,"e:\\function.m";( ]: |( [! E' ^9 ~3 C8 J
> restart:: e# `) m; D% k) _& I% m5 d( ]
> read "e:\\function.m";: T5 ~0 _  h; H
> myfunc([1,2,3,4,5,6,7,8,9]);! ~# v4 i& K) R/ t! C! x

# t3 l4 A. @- \1 t5 X) @& p> avg([1,2,3,4,5,6,7,8,9]);
" `- W) E2 K' H 0 h& Q" A/ l3 Z6 G) B) t4 _2 R* z
5.3 与其它程序语言的连接
: O8 @0 [6 K( R2 ^, L: i9 c0 a5.3.1 转换成FORTRAN或C语言
# A6 l2 m  G" }3 F调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:  w; t, y5 m& m/ f0 J; f2 |
> with(codegen,fortran):
1 g: `; ]! |4 Yf:= 1-2*x+3*x^2-2*x^3+x^4;
7 k  f+ [9 O) e; Y9 [3 z/ ? 0 {' K' ?/ b5 b5 P% P% t6 v
> fortran(%);% G8 v5 t! p' s! _2 R) R
      t0 = 1-2*x+3*x**2-2*x**3+x**47 w6 g1 V7 q) N+ [
> fortran(f,optimized);! t% t- t/ y* V& w" t8 O" o2 S6 v
      t2 = x**2
! H, |9 N+ X, `* {  Y* A/ L5 b      t6 = t2**2. c5 t) T; \0 c# I( l( c8 D
      t7 = 1-2*x+3*t2-2*t2*x+t6
" a  }# Z9 P- ?, t* j> fortran(convert(f,horner,x));
% i, |6 w1 \; d, K$ n      t0 = 1+(-2+(3+(-2+x)*x)*x)*x  n. W2 t* E5 H* ?
而codegen程序包中的C命令可以把Maple结果转换成C语言格式:+ [( e6 V1 E) B
> with(codegen,C):; _- Q- m9 O+ Z
f:=1-x/2+3*x^2-x^3+x^4;
% ?# \1 w. p0 a/ r. s( W' R. _
+ d( a1 h4 {3 l3 p9 X7 V- T4 e> C(f);7 f- T: @% W) [
      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;" B. |; X2 H* e
> C(f,optimized);) |4 L$ {5 N4 c' T
      t2 = x*x;7 z9 Z! m- N4 A" n$ ^1 u$ q
      t5 = t2*t2;3 X- o# z9 j1 M/ k8 |
      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;: L9 N6 m' O6 @+ p
optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.8 m4 F8 G. m% L" C+ H/ W2 a
5.3.2 生成LATEX. V9 c5 \; h: W/ \1 v
Maple可以把它的表达式转换成LATEX, 使用latex命令即可:
6 X- U( D; F: s; ]+ o> latex(x^2+y^2=z^2);6 |" S2 q( Q, s
{x}^{2}+{y}^{2}={z}^{2}
, t4 G. y3 \2 V( l7 i$ @    还可以将转换结果存为一个文件(LatexFile):" e9 y0 i- z; k9 b" i
> latex(x^2 + y^2 = z^2, LatexFile);
8 g: t) B* S" S% [    再如下例:0 |# k# `2 f( [, K+ `
> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));/ C8 z+ Y0 ]$ L' L
\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)+ p+ E5 y, [+ f- c& w# @! j

6 y9 N  b6 x, {/ ?5 T$ ^
zan
已有 1 人评分体力 收起 理由
darker50 + 2 用word发不是很好吗?呵呵!

总评分: 体力 + 2   查看全部评分

转播转播0 分享淘帖0 分享分享0 收藏收藏1 支持支持0 反对反对0 微信微信
darker50        

107

主题

45

听众

1万

积分

  • TA的每日心情
    开心
    2015-4-9 15:42
  • 签到天数: 47 天

    [LV.5]常住居民I

    自我介绍
    开朗,爱各种娱乐的不老男生就是我了,喜欢数学建模,喜欢那种帮助别人的感觉。

    社区QQ达人 助人为乐奖 新人进步奖

    回复

    使用道具 举报

    33

    主题

    10

    听众

    1691

    积分

    升级  69.1%

  • TA的每日心情
    开心
    2014-7-8 08:29
  • 签到天数: 201 天

    [LV.7]常住居民III

    发帖功臣 新人进步奖

    群组PLC和单片机

    群组2012第三期美赛培训

    群组MCM优秀论文解析专题

    群组沈阳理工应用技术学院

    群组学术交流B

    回复

    使用道具 举报

    33

    主题

    10

    听众

    1691

    积分

    升级  69.1%

  • TA的每日心情
    开心
    2014-7-8 08:29
  • 签到天数: 201 天

    [LV.7]常住居民III

    发帖功臣 新人进步奖

    群组PLC和单片机

    群组2012第三期美赛培训

    群组MCM优秀论文解析专题

    群组沈阳理工应用技术学院

    群组学术交流B

    回复

    使用道具 举报

    46

    主题

    3

    听众

    1967

    积分

    升级  96.7%

  • TA的每日心情

    2014-4-15 00:06
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    社区QQ达人 新人进步奖

    群组数学建模

    群组数学趣味、游戏、IQ等

    群组LINGO

    听说女人如衣服,兄弟如手足。回想起来,我竟然七手八脚的裸奔了20年!5 _! J2 V2 T+ R6 I% R8 \  G2 \& H7 t

    % D( H6 u  {) Q9 x; w# b
    " h$ e1 F# G# `' K% R5 b1 }- ?! @
    回复

    使用道具 举报

    0

    主题

    2

    听众

    19

    积分

    升级  14.74%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    0

    主题

    4

    听众

    181

    积分

    升级  40.5%

  • TA的每日心情
    开心
    2012-10-11 12:35
  • 签到天数: 51 天

    [LV.5]常住居民I

    群组学术交流A

    群组学术交流B

    回复

    使用道具 举报

    0

    主题

    13

    听众

    27

    积分

    升级  23.16%

  • TA的每日心情
    奋斗
    2015-9-29 17:01
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    社区QQ达人

    群组国赛讨论

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-8-6 02:50 , Processed in 0.536414 second(s), 101 queries .

    回顶部