QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

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

0 @8 l8 Y4 Z0 c; [1 s' `) S 6 _5 R' P, v  ]% L
7 O  x7 j) k1 _0 w: e0 X3 @7 r
2 ^1 l0 ^  A+ z, U1 A
" W$ f* z! U8 S+ M  A" l$ l. b
4 x# l7 A) F5 L7 ~

; C, j3 W, S2 J# t+ R, z
0 A# m* O& G6 u; P; @6 \8 `- D 8 {; b/ p: O7 u3 }% E' U
! t' k2 r# s) v& k, T: V# y6 C; H
% H1 F; m0 [$ Y! b
; P" T9 k6 A$ }" D" U! m0 H) b& a
alpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu
) I! {; c" a, g; T# m
, `& m: n1 v( Z" K+ F8 h+ n $ T3 {9 h8 X% p) T$ A/ m

! c6 @9 S* `+ L3 I% q : C2 y7 A% w* P4 G

' E) ^; k6 M7 \# i& s
' H- q; c  R! W* X$ P0 l: W ; |: @  }# _/ w' V

! l( n7 k% g; t1 q 2 j- E5 m4 E6 O/ I
( G, |$ c6 ?0 L* D
' y$ p* |1 i' w5 R( [# S

( A& Q! `! ?- E- L/ d" t5 m8 e& D
( r$ t5 r6 ?2 ^  ]+ `nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega
+ e) c$ y0 |2 W  C有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:- t# A$ t" W6 @$ S1 F$ S
> for i to 10 do
6 O1 Y9 N9 s# Y! |8 y9 hprintf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));
' `3 B8 |' @4 O2 L$ p& P1 ]9 z% Wod;( j, Z- {- \' _$ p0 ^
i=+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
* c. R+ G* @- Y5 H, o- B+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:" Y% o6 q; W$ r; C
> for i to 10 do
1 Q' }" J7 i% S( ~0 Dprintf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));* Q6 F' f! x* X- v; N5 Z
od;' S2 `8 j3 T* Q2 b; ?& W+ j9 c
i=+1 and i^(1/2)=+1.0008 U9 A( _7 k. T" y
i=+2 and i^(1/2)=+1.414
8 {. X1 c7 \1 c- K0 }2 J% |i=+3 and i^(1/2)=+1.732' z9 [+ A2 x1 J* V6 G
i=+4 and i^(1/2)=+2.000' [- h; w. N1 c( N& q' b
i=+5 and i^(1/2)=+2.236
  U; x& d) F' k  c( I* Ui=+6 and i^(1/2)=+2.449
9 ~+ k5 Y" d# _" Q! V: D8 ^3 Ai=+7 and i^(1/2)=+2.646% D2 I$ n, t* v5 e# \
i=+8 and i^(1/2)=+2.828# G" ~; n4 Q7 l' q
i=+9 and i^(1/2)=+3.0002 x; N: A8 W* c; q3 _
i=+10 and i^(1/2)=+3.162; S5 O, y+ j6 @9 [- L" ]) `% U4 X+ }
再看下例:将输入的两个数字用特殊形式打印:
" ~* u& K7 _7 M, A> niceP:=proc(x,y)
1 K2 ^& V7 W$ E+ F& I. [5 D. sprintf("value of x=%6.4f, value of y=%6.4f",x,y);( O# S' b( B9 K" ?& q! `6 C
end proc;  |8 u1 t1 e  v

! D" ?0 b7 S4 |6 k> niceP(2.4,2002.204);( {/ f. n: r$ m
value of x=2.4000, value of y=2002.2040# P9 A7 o, z, J; z1 }0 f
1.4 Maple联机帮助
, R, V2 c0 F- M4 y1 F. a学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用. 2 h/ w; O4 ?# X" _
在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可.
7 {8 h- }& d2 k2  Maple的基本运算
, {$ O" ?3 _  \4 p2.1 数值计算问题
2 H7 f9 c+ g6 i9 }8 p算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”. & ^# s- i, ^- _& T6 z
在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.
: `. w! K3 z9 [. o/ oMaple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算. % t1 F) F) Q; S# F  V
但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明.
, o/ e/ h" A; }7 Z7 P第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   
% ~. g. Z9 v9 f: t8 [, }> 3!!!;# x! Q3 M; ^) q+ I5 `
2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
; x6 |  X  q% B1 y. e9 x上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?! G* [3 Y1 p& w0 g! ^
为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式
/ [, W+ Z; q( D$ Z- r) Z   @" k! |5 D; N  ]! y
可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   7 ^" a. B$ J6 B3 D+ g4 d

; m- a. `- r4 u. G/ g# ~0 u这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性. 6 f5 `- U8 ?% Z3 J5 y. p! P
另一个例子则想说明Maple计算的局限性:   
2 g& ~5 T( L% D7 ?# z  0 p7 Y. _  m/ p5 H* U! }( \
Maple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   " s! }& p7 P  u' a. T. O

, ^& ^& i; }  Q3 m  }显然这是错误的. 这一点可以从代数的角度予以分析. : O1 y% S  g/ v; [
不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果. & l3 T. c8 A' I( y, J, E
另一方面, 设 , 则 , 即:
' x" X% _$ a, e
: ~; ^) T8 {" r3 B显然 有6个结果, -2、2是其实数结果.   w; U+ ~/ f! p- t) w
这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性.
6 i3 @: d& D; M尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的.
7 s; a5 V& u/ a- f4 _2.1.1 有理数运算1 X. V) m8 [% F# z- \* M, c
作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20).
/ b# p( S2 K- {6 H* M> 12!+(7*8^2)-12345/125;
+ e: t8 X1 {: j; e' Z' L& V
; r& e( a8 L  r; q' P> 123456789/987654321;
1 ^$ L; N/ W1 O. a
# c" X: G4 d& D% |/ e% W! W. k> evalf(%);2 h) z- {1 U9 g+ p! O2 p( ]# u3 p

( k4 u& [7 J9 S4 Q* N6 U" Q% `> 10!; 100*100+1000+10+1; (100+100)*100-9;3 w0 c; U; }* w/ s0 u& L! |

% O4 U' d! h+ v% e ' O% D; z  K# \9 l( [

. E6 {. \6 v! D$ Y- i> big_number:=3^(3^3);
2 i5 q" k' A1 _ : O, i5 h0 R9 A8 u) g9 |
> length(%);
; F  ?8 L$ W' e7 @1 t% X1 C1 e  ^ 8 F; b% y. s, ^0 ?8 D$ G& y
上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   
$ A8 ~7 x9 [5 _    1)整数的余(irem)/商(iquo)1 o' J8 ^. x0 ]/ c2 N) R
命令格式:   * X; E9 k, k/ x( z
irem(m,n);        #求m除以n的余数( z6 u* Z% j# q: x" X
irem(m,n,'q');    #求m除以n的余数, 并将商赋给q4 F" C) u( P) N, J' x
iquo(m,n);        #求m除以n的商数$ S/ n4 [' P% w( w( s+ ~5 t. {, r
iquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r. T$ b/ s9 T! D9 w1 z$ |3 k
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. ! e! k! I# I% u* @2 F
> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q
! E( B- E) ?+ p! ~: _ ! o# r: l; B. v* ~
> q; #显示q* ?' f0 ~+ T% y
3 m) H9 ]6 v" ]* a2 `6 S' c: _: J
> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r; q+ O9 h# W4 h9 w4 Q' i" _, u

, [. D  v' @$ p/ r7 p5 J> r; #显示r
$ C5 ~( \& D% {4 c' Q% Y% m& D: ^3 z " |' v- }8 _+ h9 ], }
> irem(x,3);- l) M7 Y+ v  K3 }- P6 {* u

6 O0 u! W) ^2 ?( T* k& l2)素数判别(isprime)9 G! H1 E, R2 U/ j
素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n);
: b* P( {% M( Q: C( |! R, j    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数. " u9 ?8 L. K+ B$ v
> isprime(2^(2^4)+1);
4 [$ C2 L5 i5 A" W4 V
( G; ]+ j1 A5 Q* N7 M" p$ Z* u> isprime(2^(2^5)+1);
' u+ y, S7 P7 |8 r ' r+ t  m* ^  w" X0 J" M
上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多.
' A0 U' ]$ ]/ C0 H2 C3) 确定第i个素数(ithprime)
$ ]% ~/ T3 {2 D若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);   
4 C( e+ S4 e9 V' J9 Z> ithprime(2002);
* n! K! s* Y' G7 C; ^
* _% C) P4 `; S3 U, _> ithprime(10000);( v$ z0 y8 T1 ~4 X) W! ~, t
' Z; g3 U3 U$ \8 n. m
4) 确定下一个较大(nextprime)/较小(prevprime)素数, M- C0 e& a+ P4 i0 m: F) M
当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
1 F" l2 @' K- a+ g( Q: j0 anextprime(n);  
: a' b4 T. O1 ]! y3 Cprevprime(n); 8 H+ d* V2 S' z8 |+ e. z
> nextprime(2002);
" n2 n$ n) q6 P
" g& p, o0 t" V1 y; B> prevprime(2002);
6 t7 c; s8 s7 T/ D1 M, L* ?
8 \5 z* l; ^% b! l& {' a) x5) 一组数的最大值(max)/最小值(min)
$ x% F4 |6 i8 ^9 k# A8 ^! k: b命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值
- R  j8 y+ S; J) z. H* y, {+ X7 F             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
6 d. r8 I) m5 ?# C! z" e! L> max(1/5,ln(3),9/17,-infinity);
) |* o8 ~% F% L. s5 I: g4 t
: `- v/ X3 X' e" w$ i( o* i$ z> min(x+1,x+2,y);1 D' o, X/ z  N; u7 l/ U* s8 ~

4 X6 P  X, R: z; A% n* m! g6)模运算(mod/modp/mods)8 }/ W$ l1 u9 h5 _& j# a
命令格式:  e mod m;    # 表达式e对m的整数的模运算0 B7 W5 {0 S( p" Y
modp(e,m);  # e对正数m的模运算
" P; q1 ]3 Y5 T* ymods(e,m);  # e对m负对称数(即 -m)的模运算
0 |' Y1 ]8 K: o1 i`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价2 K% C8 ]- ?/ l. _2 a4 v1 Q" V2 P
值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/.
( X0 ~# v3 r9 A8 @& }1 M  W> 2002 mod 101;
8 P- M& F; Z; S3 n% d7 V$ r 1 G( B- N6 Q' ^4 u4 I2 q
> modp(2002,101);" \4 a( h" Q2 f1 j1 V& t
+ ]% j/ {8 P0 j8 y/ b+ v
> mods(49,100);
4 A# u  {& o7 `9 g
9 \2 F8 p: P9 I> mods(51,100);" g0 V8 |  O7 G9 o
+ H1 l8 T! U8 U  x6 c1 K. U  D6 T
> 2^101 mod 2002;  # 同 2 &^101 mod 2002;# P0 r0 J. s. a: a( b% L0 A
3 N& U  I5 ~; V! ]7 _' y) e
7)随机数生成器(rand)
! F6 p* Q( l1 b6 v1 b命令格式:   
6 A5 i8 L0 \9 r3 rrand( );    #随机返回一个12位数字的非负整数5 _9 }* m5 Z  L' D" S8 h
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数
/ i) ]! j& F5 f! w> rand();
/ r* `4 d' P! y; w, @
+ t0 n6 f: h+ R, v> myproc:=rand(1..2002):7 N# g& e1 D* I, t0 s
> myproc();
0 q* Z( A8 I# q4 o % P# r6 E4 a0 N5 l* _; H8 q' K' Q
> myproc();
( c; l( Y5 Q" {0 y+ O5 \3 @" R8 {
0 j' k$ |9 l7 p- T& w    注意, rand(n)是rand(0..n-1)的简写形式., W: B: a% j/ B) z
2.1.2 复数运算- u- ^5 I5 k0 m8 I4 u. r
复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   ( T" a% j" ?  \! k& q+ }, r
> complex_number:=(1+2*I)*(3+4*I);7 B+ i- L' ]  e1 o. S

' F% B% M0 o7 ?2 S5 _> Re(%);Im(%%);conjugate(%%%);argument(complex_number);
; A( ?9 |3 i2 l6 J) ^0 j( G . {& v6 v  q3 S2 Q

/ t" v3 _6 D7 z; c6 Y- J5 k
3 I& G( `8 J2 Y0 G$ J3 X5 p
- y2 u# @* s" n6 H# A, N7 B值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%. 8 h- n8 D" o1 l1 a3 `8 _
为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   
  q. g6 Q1 \& V1 l* }" ?* A1) 绝对值函数7 H0 ~' f- i* H' y. V2 H
命令格式: abs(expr);  $ {+ o0 a) d( l) Z, A2 H
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.
/ c+ h; R9 ~+ @. e, H> abs(-2002);    #常数的绝对值
8 R) b. W/ e: z- N/ ]: ?
; R2 k, d/ k& ^6 z> abs(1+2*I);   #复数的模" @% k' v7 F- @0 _0 y5 \5 p

# l' U3 D  f4 n1 m' t> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值
% K( c& Y- ^8 G3 `
" f4 j0 ]" Z# z* c" ]) @> abs(2*x-5);   #函数表达式的绝对值: p+ _% z/ F  e* b- Q

. u' \: s# q3 ~8 }) Y, T8 E2)复数的幅角函数
6 t4 c8 w  I1 S( g  m. t命令格式:   argument(x);  #返回复数x的幅角的主值  z9 B1 d1 R+ `! L  u8 h/ C( d/ L/ i4 h
> argument(6+11*I);
; \( B) w" {' D! ?
8 D; e9 @0 ]! c! _/ }* ~$ ]> argument(exp(4*Pi/3*I));* A% T( K# n' U- [1 n) _
& [% t& ]& F) ^( z. b& R
3)共轭复数% `5 g  W) k4 |/ m! H' c
命令格式:   conjugate(x);  #返回x的共轭复数8 ?5 C  c3 h# P( H$ j
> conjugate(6+8*I);" |+ P/ e% z2 X& b! M

" e3 e: c5 m7 P> conjugate(exp(4*Pi/3*I));1 y5 L  X# u, ^& v' J
; @: D# ~8 B2 F6 J1 P* q! V
2.1.3 数的进制转换
/ m! x8 E' O4 k4 {, J; `数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可. $ u% ^' X( \6 H$ C
命令格式:   convert(expr, form, arg3, ...);    3 ]/ h* p$ R# h5 D  v/ V& n- y
其中, expr为任意表达式, form为一名称, arg3, ... 可选项. 1 D$ I/ o4 L, ?, _9 i
下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述.
: Y( `+ ]$ A) ?. p    1)基数之间的转换+ Y) O6 K9 m  ^$ A! S
命令格式:   ( @% @6 Q: x  o2 Y
convert(n, base, beta);      #将基数为10的数n转换为基数为beta的数
7 Y5 y8 o' H7 ~4 }7 L4 u  D    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数
" R. N) g( y' U+ l' p% x6 d6 G( j5 W# Y> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7
7 W4 I) C9 ]. G: S
5 h+ U) _' I- y# V  L& R0 |) {) ^> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数
- H. ]6 R" [. A8 J9 } # j& @; m) k% N9 A" {1 S4 I
> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)
5 V2 E: a- x2 t0 S5 `
  v) a( h6 n6 L5 t8 I& d  h! u# v    2)转换为二进制形式- a7 _' `" D7 B( ]3 h0 t& f2 ^
命令格式: convert(n, binary);$ D6 r  @9 a$ m+ d5 D/ g
其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂. 9 _0 g! v6 Z7 Y8 w: M% t6 t
> convert(2002,binary);   / G% a* l, o$ L1 T$ k( E7 R
/ |4 b1 l1 Y+ f! K1 u
> convert(-1999,binary); , ?0 _; c% p6 r; F' i

" U/ ?  K* }3 o4 n> convert(1999.7,binary);
5 L) i: E5 \% s+ c8 ]  R ' v% {; J/ d" \
3)转换为十进制形式
* ~2 i# t& C" c! f4 H其它数值转换为十进制的命令格式为:   
" O$ ]7 H% ^# {convert(n, decimal, binary);   #将一个2进制数n转换为10进制数
' p$ O4 y0 _5 I    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数" l" r8 J2 h7 B, T8 k% A
    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数0 i6 l0 z- B( T( `
> convert(11111010010, decimal, binary);    5 w4 ?$ \1 i" R5 [. g
) o5 I7 B- V  h0 [0 k& {
> convert(-1234, decimal, octal);           2 y9 V  F* v) w" G9 s' T! M& j. U

& k2 D% a2 z" |. `) c: {> convert("2A.C", decimal, hex);          / P: Q7 e6 }) e5 z# B) ^

) r1 @; l& d6 B( I1 v! E/ j4) 转换为16进制数
5 u. z! ?$ J6 N  O将自然数n转换为16进制数的命令格式为: convert(n, hex);   
7 S+ @$ k  P; |3 Z$ W' Z' W> convert(2002,hex);  convert(1999,hex);
6 m9 h, \' X6 l( y
+ |8 f$ z2 J" z$ g; T
7 t$ i* l* a+ B9 N* T5)转换为浮点数. O( e7 U$ J2 [+ W, M
命令格式: convert(expr, float);
( M3 ?% w6 }% W. y6 \; [注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用.
$ s) t$ I3 C  [, f& ]> convert(1999/2002,float);9 x  {; R7 r2 a" ^
1 c4 Q1 R- c. I9 J  f& c, F
> convert(Pi,float);8 v9 h/ r+ i1 U4 {' h

' s4 S' ~5 n" P% H0 G8 w2.2 初等数学
/ _5 Z! F* |+ @  T/ X2 Q; c  t    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识.
- I" i; w. d+ I7 f3 `  M  i4 t2.2.1 常用函数4 |- g6 Q$ Q# Y" O2 ^
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   - K$ o# o) D3 s4 @' E& A* i, |
指数函数: exp
' ?/ ]3 y/ P4 j& f; K4 W一般对数: log[a]: y  q+ @  E! x" C) B
自然函数: ln9 x1 u* L' {7 x+ J' w
常用对数: log107 L* m# {& Z& c/ f1 K2 Y; ^" ?
平方根: sqrt
; ?+ h( q# O1 ]" V绝对值: abs( M# I* q( b9 C0 L' u  S
三角函数: sin、cos、tan、sec、csc、cot4 m  x( l( B  U3 z$ _" e" F
反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot
; x! a0 l' C; |5 b# i双曲函数: sinh、cosh、tanh、sech、csch、coth
6 w: d% [0 L( U) l, v" b1 n4 L反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth" d# v- B1 V" @8 r  Z9 |
贝赛尔函数: BesselI、BesselJ、BesselK、BesselY
, m, m" k+ o0 F( WGamma函数: GAMMA
1 {6 K2 d; J: |- e0 I8 I! |$ a5 u误差函数: erf9 e3 e/ g: x$ E2 U7 {
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能.
/ r4 e2 {- d* ~7 D$ i3 [1) 确定乘积和不确定乘积, J  ]& X! n; f$ N3 A( r
命令格式: product(f,k);  & y" ^% m0 y6 r* m% ~' c; a# Q
product(f,k=m..n);  ! u; J2 e& ~. o" J
product(f,k=alpha); 4 D: |. P4 x1 D, a- g
product(f,k=expr);
% w6 b- ?1 _1 v: Z% C其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式. # f' o; L: m: M8 B  T2 U
> product(k^2,k=1..10);   #计算 关于1..10的连乘; j: [- u# X. |1 N! s4 o
$ y* m7 f& S/ ?/ r
> product(k^2,k);         #计算 的不确定乘积; a: q) p$ a# ?5 ]( a/ y$ N2 D

: q& N+ y# I. W> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘3 t9 H  R# I3 F2 ~1 `  |' r' e0 B

  E# e$ Q2 E" y' d- @6 D> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘
' I& D) n9 c0 v$ ^, p
+ [4 U: |( A# O4 f5 b  J& m> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式4 H/ z' ]$ y1 d' B- Q; P

- D! R4 k* k6 P* _  G9 ]7 D8 q> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积
; _. \5 W6 J/ a* o. {" ^ & a4 b$ z# `9 z& w
    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   1 w( h/ Q" K6 ^& K, h: Q
> product(x+k,k=0..n-1);
8 ~8 C+ H1 @. h5 M4 ~. R: B ! [! Y. S6 J" v9 M& i
如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   ) ^9 a& ^  w3 }" N: o
> mul(x+k,k=0..3);/ d" ?# ]) z/ Q' x( L' g/ U5 k

6 \. v# Q/ E0 r, {" H2)指数函数
1 F; H, v9 [$ m: n计算指数函数exp关于x的表达式的命令格式为: exp(x);
! r3 n6 d3 o" [3 ?6 b3 @> exp(1);
0 G9 b4 a2 y* O) B8 ]* D
" t, F" a; `6 I( ^3 \, x0 {) w. c> evalf(%);' a) d# p& Q- w

8 d2 f  }' O# T7 E> exp(1.29+2*I);
0 x) _+ Y  ~# d$ H# P* k- w* d 0 {4 P( l/ Z. N# m# e( R
> evalc(exp(x+I*y));- N6 M7 }+ R; C( _* Q3 Y  r
8 R( ]  N3 {* B: r" r. q7 q/ M! R
3)确定求和与不确定求和sum
' Z6 D+ R% H( l9 i6 b& g命令格式: sum(f,k);  
& d: B- z' Q: B5 u& M  `sum(f,k=m..n);  
; z/ b1 i6 [& Q: P% e4 R5 n# `" A' Jsum(f,k=alpha); 1 U0 H' \- `- Z8 L& B* F
sum(f,k=expr);
4 |' p9 o6 C* J2 @, Q3 b其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
) b, b9 A, G# ^1 M: E> Sum(k^2,k=1..n)=sum(k^2,k=1..n);2 e/ i: p$ R+ Z# [
- G' ^  i" g2 q' B6 z2 Q0 c
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);+ v9 m+ j# f$ b
0 @7 G( R& U1 `0 H
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);$ u/ g$ E- s( b/ T$ E" H% }
% K: I$ z1 D, z" ~# x
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);: C; d2 i7 X4 Y" b: `9 b3 c5 s

8 x1 N/ e- \' e+ u> sum(a[k]*x[k],k=0..n);' z; t6 S, A5 B% K% r4 I4 d
5 o1 X: o7 M! B4 V4 u2 l0 S
> Sum(k/(k+1),k)=sum(k/(k+1),k);& V# R+ O9 R  L. o: u( W) N
, ]2 J* `, ^+ r
> sum(k/(k+1),k=RootOf(x^2-3));
+ H1 `- Q) F/ Z! C  I + V0 z: ^$ p6 m0 y, V% F4 c" g
sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的. 7 B$ V4 d1 x! Y" s! P( k0 w
> Sum('k','k'=0..n)=sum('k','k'=0..n);
6 I- G# M7 N, _0 ?5 [# L2 A 6 o: F/ C+ p& ^! z1 C) }
如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   
5 S2 p5 X9 V1 G5 z0 E. \> add(k,k=1..100);
# \, A! d7 c. R  O2 E2 ^* ~: W# C
, F- H9 J9 }2 O3 \尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令. 9 j8 q: I5 j& s7 S
另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性. 3 k: ]% Y6 o  @+ T
3)三角函数/双曲函数) j8 n' I8 ~& m$ j: B$ g
命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);
% y7 {2 f" b; t- `          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);
8 h: q5 t$ d- u7 ^3 M* _其中, x为任意表达式. / [7 k9 j: B4 n: e0 v  _2 ^
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.  u4 }2 m" ^' ]5 o- ?- c
> Sin(Pi)=sin(Pi);, C% n0 D, N1 ?: S- z

/ c, z5 S, A! K5 W6 D> coth(1.9+2.1*I);+ n/ s& S, U! N* z( _! Z$ }' z/ O# @

6 s; |, W( X2 `$ g1 ^7 Q> expand(sin(x+y));     #展开表达式1 Q3 }& ^1 `& c3 P+ M& t

3 |) @" T: u- Q) l8 e' O> combine(%);        #合并表达式
* G  r0 H, \! X8 b1 k* O8 l" M , }4 F/ V; J9 E4 P1 E
> convert(sin(7*Pi/60),'radical');  N' A6 G$ {/ I/ \$ ^. U

: R; s( g% Q& I7 v> evalf(%);$ G9 v+ I! J; b  V! q. Z3 g, m1 l

% I3 f* |2 F" g1 C5 H5 U2 m# g* t但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.0 a2 ?, {& ^: M& c7 X2 X/ e' @( C
4)反三角函数/反双曲函数5 S5 Z/ t7 q9 o* H; V8 O
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);% B- R( x3 g) Z& b' S! R( l
     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   8 _% ]6 _  `. o
arctan(y,x);
) I, T, k: J; ]其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算. 8 x. R, r# g6 z  E
算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.
+ [( L$ d. d3 Y* k0 }8 y1 d# q1 l/ y> arcsinh(1);* c+ Y. X2 ^/ `& g1 r# W6 L

  j. E( k4 E7 y4 f) Y( c8 n& H! y> cos(arcsin(x));3 {/ u6 @* I6 z" k' A

) {0 w, u4 Y! {$ O1 [> arcsin(1.9+2.1*I);+ R1 v; y  C% F% _5 X& c

6 u4 [- _/ R2 l; D5)对数函数& B7 K3 q2 k0 m8 W. W2 @4 e$ \8 ]
命令格式: ln(x);           #自然对数8 G9 v; c! I+ I0 Z
log[a](x);        #一般对数7 a) Y2 K1 {4 h, h& W: M
log10(x);        #常用对数
. r9 E1 Q0 o1 q* {6 [/ P一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   
2 L2 q7 f8 e2 i' [8 a  (其中,  )- E* U' o# T  S) D2 U  E$ E4 p
> ln(2002.0);
/ r, ~0 N& X. Q6 i% v
, j  W  j: X/ V' I9 Y& ?> ln(3+4*I);
+ m- c5 e) ?& s/ G+ _
, F2 x' w2 C0 \> evalc(%);    # 求出上式的实部、虚部. r' [0 q7 C, ~/ A$ b; k' g9 r

0 d  n( y% ?& y/ K( g1 F> log10(1000000);$ v! k  s7 Z; R" i
9 D# a% c) L* L
> simplify(%);   #化简上式
; ~% G9 C0 R+ u5 j) o$ s
- o  A# u4 ^) R+ Z2.2.2 函数的定义
5 [! {, Q- x! W0 N: P& T  zMaple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   
6 H* r: Z! B, j8 V> f(x):=a*x^2+b*x+c;
% R' b# @  g% U/ M' N0 J0 h. Y
7 U0 S; t( a4 ]6 A7 S可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   
$ T* ]! O, E0 X7 z4 f4 z> f(x),f(0),f(1/a);
2 n& J! Z3 ]& N/ W* C" m
% E' g+ o# }4 e$ J由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   
9 _! W- G2 S" ?> print(f);# b9 O' \" J: E  |8 \" u1 s! V' g. ]( D
9 z* o) ], O9 D# l* o# |7 U
事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. , M* O: I- B) E1 C+ _8 j) y8 s% M
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   
; \5 Z/ u$ f) k! ]> f:=x->a*x^2+b*x+c;
, y; e+ d1 U' f9 d$ v ! c* l& K/ m' N; y+ w
> f(x),f(0),f(1/a);
& y0 g* \8 J; P/ A
; @8 t& W3 a( l; Y5 t% p多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). % A" g% _7 E; l+ M
> f:=(x,y)->x^2+y^2;
; ?5 ]' ?, L- Y3 V
! \# R  m& F+ H> f(1,2);
; |& ^3 k$ V# {  @2 y  y 6 m  _" S; u2 v( R& j3 B, f7 s
> f:=(x,y)->a*x*y*exp(x^2+y^2);
5 J# L' M0 U7 |5 y8 J& ~ : J: S7 e' A# }! U! B6 X7 W8 ^# B
综上所述, 箭头操作符定义函数的方式一般为:   / g4 I/ M( O& J# l
一元函数: 参数->函数表达式
' W' y  X! s3 k" w多多函数: (参数序列)->函数表达式
; Q8 K/ z) R8 {' ]. @无参数函数也许不好理解, 但可以用来定义常函数:   * d- p8 ~8 v* ~$ d6 v1 o
> E:=()->exp(1);
' R. K$ v3 y0 |) t" w # q6 c& ?6 U' I/ z1 |
> E();
7 Y9 x/ w, V! ~1 e
! `0 N: W7 ]0 w: x) r> E(x);
7 P* O" `+ {  H0 X
8 A: T2 P/ }. a( A  m1 _+ m另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数.
! e& T+ p7 L  [定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);          8 M0 @* ]7 {0 z. d, H% o
定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     
' }. A/ c, c2 D, }. x> f:=unapply(x^4+x^3+x^2+x+1,x);* p: K+ f3 F/ q. M; D# F

5 t* _9 @* w* [# i9 H> f(4);5 G$ s/ B0 T: U! u: ?+ k
2 c, |% G# y: s3 U! |4 w8 U
> f:=unapply(x*y/(x^2+y^2),x,y);
0 P1 k& b! s# p " Q: a' o& }; G* v6 F" u- I( o
> f(1,1);
' [1 E# Z* ^& E ( ]4 T$ J* M. u1 E" A& F, S% m
借助函数piecewise可以生成简单分段函数:
2 u) e! _# A  R> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);
% ~( V7 ^% b' I( v
& K* D0 y+ t' o清除函数的定义用命令unassign. , m" M) o5 K1 `0 K4 G3 [
> unassign(f);" C. \# n' @/ {
> f(1,1);
7 K; g9 @* h- J% P: V+ M& X % V$ `: l) t) k* u5 P) |
除此之外, 还可以通过程序设计方式定义函数(参见第6章).
) S+ ^( j/ n, f  E3 a& w' S8 f6 S定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:
  o; S  k# d3 n% y) iop(expr);          # S  r1 L( c& i% g3 w
op(i, expr);         2 P: H5 A" b* Y7 s( s# t
op(i .. j, expr);      
& p& U! ]7 h) _; m4 gnops(expr);
$ }/ m: Z) ^4 Y& J如果函数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的类型. ' ]1 @( X: l7 ?6 a" W8 ]5 o
命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.( }! Z( V6 l; L1 n3 f
命令op(expr); 等价于op(1..nops(expr), expr); , ]  \; U( ~9 ?. L7 B3 U
特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...));
% Z9 T4 r0 L- u( a% ?# ~而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和. ! W% e, c' j: u
> expr:=6+cos(x)+sin(x)*cos(x)^2;. r" \- h6 O) M$ S; y

/ |4 b" ]3 ^2 f& m% @' h> op(expr);
/ E$ ^+ t0 K- F9 K( _' P! j1 j 5 F, x, O4 e! l# P
> nops(expr);- ?# M& _, M, g0 @1 K
2 M5 U: W8 R5 n* ^
> p:=x^2*y+3*x^3*z+2;
7 C. x( g$ g  ]- b, ^
& t7 ]  E* q9 o/ u" ?2 \9 _> op(1,p);
# @5 \0 \) |, o4 @8 V- O+ W
- w$ T+ |; T, P0 d; ]  |3 S> op(1..nops(p),p);
/ w! f1 {5 ^% D8 H: w$ U& I7 `5 {
( m0 z' _# T/ \: p> op(op(2,p));
' @6 _) C+ \& k" W+ d * s" I5 d; B5 |+ Z
> u:=[1,4,9];
1 Z+ _& h  R/ G7 ~' N3 `5 R
, v6 r! O# \4 Y/ C> op(0,u);) a- n% }/ B( L% z6 N: G% [' p

) }4 k2 M* j, @. ]+ `/ V> s:=series(sin(x),x=1,3);
+ `$ ?. [/ c5 l9 J1 C: Q) E ( I) v  ~& {: X3 k
> op(0,s);
5 s# |1 o5 v, e% c" p( d        
4 W! @+ h8 @* ]# F4 C4 T> nops(s);# s/ C5 [9 C! q" ~2 [2 A
8 t+ I8 q/ g9 f" l1 c1 i' I
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:
8 d! O+ W7 }% g- B: P> op(x*y*z);
/ s1 X- {5 I; P$ b! A 4 ?# U4 @, t% u0 w8 Y
> op(x*y*z+1);$ t% z- G8 ~$ ]6 P* i0 |* |" N

8 N9 b& A+ V- G7 Y6 X9 X/ c/ k2.2.3 Maple中的常量与变量名7 c$ R; `/ o3 d5 D
为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   7 P8 Z. X  e9 e3 r8 F8 @
> constants;
# |( _2 d1 |# v' f9 k1 k2 H
$ @, U. w4 o$ k5 h, {. g7 G为了方便使用, 现将上述常数的具体含义列示如下:   
8 V  D8 a, N$ N% F常    数        名 称        近似值, ~, ~+ J7 I7 L* j4 W
圆周率 ) }" u9 f/ W7 t/ k5 j
Pi        3.1415926535
- e0 a8 C0 w8 |1 k* C9 \) {Catalan常数 0 c3 _8 N& _  V* ]. v
Catalan        0.9159655942
/ k9 D+ _- }3 _0 T. C7 I: F0 A' iEuler-Mascheroni常数 5 f) f0 a/ `& m9 w' M
gamma        0.5772156649
; M; {& T$ ^- P5 ? 0 v2 |7 h- w* I
infinity       
$ a6 `- P* I7 ], O$ T+ x- x6 m" ^
9 G, _/ T0 h: }, ~; ^- ^需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取.
1 U% x' @  m9 W0 U+ H在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
2 _5 Z/ [, x4 d' X# @2 t  n值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名.
  G+ c9 z- `4 t# ~$ P$ e- X在Maple中有一些保留字不可以被用作变量名:   
/ ^' s% U2 s* U0 w- B" Pby      do      done     elif     else     end        fi        for      ' {( x7 P1 |- Y8 z! `
from    if       in       local     od     option    options     proc         
7 b4 g9 X& D1 A7 _+ ^6 B) qquit    read     save     stop     then     to        while      D8 z5 R5 K! z- u" _! S
Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名. / q; n+ T% u3 `' @
另外一个值得注意的是在Maple中三种类型引号的不同作用:   
" g) O! C* ]2 G2 |' g`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;   
( c# D% t# G9 m: G- `! F'  ':   界定一个暂时不求值的表达式;   
1 f6 q  X  e3 a! o"  ":   界定一个字符串, 它不能被赋值. % V! i" z. y5 C* @$ \( o
2.2.4 函数类型转换           
+ N  H& g& H/ E; K函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  
( L9 h/ L- F/ G+ P0 N5 }    convert(expr, form);        #把数学式expr转换成form的形式) e1 C( X& j; @9 d3 c3 B1 Y& m/ V
convert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos) ~( l8 F& x! ~5 n( h$ X% @9 n
convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   & _0 a. a& Y5 h; j7 u
(1) exp: 将三角函数转换成指数
! b7 X( b, T( j4 w* y: n& ^: L(2) expln: 把数学式转换成指数与对数
  \5 W& f8 ?) K/ C# E(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式
2 f- H$ Z! H9 [% F( G(4) ln: 将反三角函数转换成对数8 ]$ D0 f' U6 l5 k  h/ Q
(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式: j4 I5 B# D' S, {
(6) tan: 将三角函数转换成tan的形式# T! L* m0 t6 F
(7) trig: 将指数函数转换成三角函数与对数函数
- G" ?( k& I1 A+ Q" K! R> convert(sinh(x),exp);   #将sinh(x)转换成exp类型
" ~4 w! g# x# z# E$ R! T) ?
: U$ H% ~7 o) ?# N( r5 L0 G9 x. O> convert(cos(x)*sinh(y),exp);
& L1 b  n5 F+ D3 Q4 y3 o 2 R' L% J* F' v/ y' M( P& x( X
> convert(cos(x)*sinh(y),exp,y);+ ~# p4 f* \: t  F+ r- J$ p' ~- i' ~

9 Y. L: @7 a7 J. G  O+ u> convert(exp(x)*exp(x^(-2)),trig);
+ L$ Y8 X8 P- x- A ) A! D( v/ `/ \4 |
> convert(arcsinh(x)*cos(x),expln);
8 `- T7 E, S. |, R   g% G) _6 Y9 U: h& j6 `- L$ d" v
> convert(cot(x)+sinh(x),expsincos);
2 d( @1 W' w6 \- O6 R   K4 g" P2 d3 C% Y
> convert(arctanh(x),ln);6 q# b6 A1 g+ B& H6 X/ a
( m# C& m# w: r" |1 t' p
convert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   
' Z, H! Q7 g1 r; a/ ~. O> with(codegen):6 \" v# T: K* R4 b/ y! ?
> p:=4*x^4+3*x^3+2*x^2-x;4 P% Y7 s# K' L2 Y( L' _- y$ d

' Y* b! V( @2 ]/ c- c9 E3 N0 F9 ]$ q> cost(p);
! _* o- g9 L& y9 k
+ f0 h) ~3 |" Z9 z: m5 b6 N> convert(p,'horner');  #将展开的表达式转换成嵌套形式
9 Y2 J- A( |( V: H3 W; s. L ; P- f; P; S9 x- M
> cost(%);
6 J! y8 c( E, [6 o1 \ / o* Y% y3 u* j1 h0 S5 L
同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量.
$ m5 q# W, j6 {1 O> (1+x+x^2+x^3)/p;
# y) H+ u* j7 r% O- h# W3 C# M  z
( O0 v+ @% \$ _3 K( j0 N3 ?' K> cost(%);
* }* }. G- A& |* }) d. Z8 `
, L+ }( ^3 }0 k& |  }0 i> convert(%%,'confrac',x);- p& a& @% C/ S9 G. W
  ]3 Z- h$ b6 z' _
> cost(%);
7 ]' g# N! {1 a# k. M! ^
  s1 R3 F  h  k在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式. 8 d. O5 R# K/ w* b
> convert(%%, 'parfrac',x);
# f1 c+ [9 z/ S( p. b& r  l0 Z
# a8 {) \4 C. A& G8 G> cost(%);& q9 i, @) J$ a
8 v8 Z5 Z/ Y- Y( Z7 M6 I( D1 B  c
而把分数转换成连分数的方法为:
. l# ~% u6 ^4 Z) g- l> with(numtheory):1 A- [& A0 A: M
> cfrac(339/284);3 ]5 p$ p0 o2 G& H' O
5 s7 X' V4 P9 D
2.2.5 函数的映射—map指令
6 M1 ]% K4 v" l( h: Z+ Q' y在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:# ~% X! J% _, n- }7 _$ L- [( _
map(f, expr);      #将函数f映射到expr的每个操作数
' S0 y0 `3 X  T5 H  W% r2 J! bmap(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量( D3 e( T, q% K: F5 }
map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量
/ X3 C' r2 Q, \! B8 a. Dmap2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为& e3 {$ c* u  t  z6 [  T# Y
第3个自变量…, an为第n+1个自变量来映射函数f9 f% V' W7 A/ U5 C7 m# R
> map(f,x1+x2+x3+x4,a1,a2,a3,a4);
& f3 C- h+ e% |4 W$ Z1 m
" d1 Q9 N' Y3 C1 c> f:=x->sqrt(x)+x^2;
7 L' R9 m' ]4 B1 s
$ e1 ^. m8 v7 @! o3 G+ G8 W8 J! E% Q> map(f,[a,b,c]);
, T4 g. N; ~% E* [
- g* E( j4 X. Q  _> map(h, [a,b,c],x,y); , o# ?2 F) j( I$ _& e& w3 ]7 T
) t7 A, t! |/ p( n
> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);# ?2 W. `* O* p2 C
! i2 K) F  S: Y+ |3 R$ h4 |# ]5 P! f
> map(x->convert(x,exp),[sin(x),cos(x)]);
. M) I3 z6 j- [; Y* r5 [
$ ^  G6 X! e0 I3 W上式的映射关系可通过下式理解:
' p) G: q+ {0 p1 v- M$ f4 W> [convert(sin(x),exp),convert(cos(x),exp)];& q: k$ o8 y# x
" u' T$ t" t1 o5 R
> restart:
5 |8 V' K! t/ g) }' L2 ^6 K5 A0 @0 wmap2(f,a1,x1+x2+x3+x4,a2,a3,a4);) F' J) B4 @. ~. p9 R! A5 M

# Z/ y- m$ u7 `0 s8 s  D> map2(max,k,[a,b,c,d]); 2 `# E$ j( ]+ Z" m  U* G
3 j2 O3 _0 J& \3 f/ w. Z
再看下面示例:   3 p- c4 \/ p+ ]; @# h
> L:=[seq(i,i=1..10)];
' t, g& L9 Z. U
6 h' Q: d0 `% T2 W> nops(L);/ n: U4 z0 M5 t3 V; V
% k! k/ J6 J" B1 I3 q
> sqr:=(x)->x^2;
" k% y8 O* F1 x0 \ 2 h. c: f6 X( c/ G5 c( F7 n1 R; C
> map(sqr,L);; E* A( r& z8 ]$ o- M4 n  y6 T% f
$ ?6 L& k5 g4 v  e8 T& [2 y
> map((x)->x+1,L);
! B, [% J' @) A# u : U1 Y' p" |) V9 T' y" w
> map(f,L);
  s9 @3 d1 N* L: t2 B 7 q( @: a; J. v( o
> map(f,{a,b,c});! E2 t6 ?) q. D1 m

4 ~: j, q- ?3 N. i0 i> map(sqr,x+y*z);5 w4 I; J" x% K2 S

7 \, S( w! n: U8 n! Z7 s> M:=linalg[matrix](3,3,(i,j)->i+j);" _: P; s5 T% @# W

1 E- z! T0 S- ?: U- J. Z% Q5 ^> map((x)->1/x,M);, ~. F  `' j. B$ s8 k3 n/ L" w

" Z- f" u7 U! ]  F4 ~3 求 值
5 a9 c$ y5 d$ j3.1 赋值2 n1 f% k6 b! p. N, F: b
在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. 2 V* X4 l9 Y: t$ w8 l, e
> p:=9*x^3-37*x^2+47*x-19;, O% t8 Z8 D. w# a3 D3 X! ?7 ~
# \0 ~) S2 s$ L% q
> roots(p);3 t% _) Y) |: t. e0 i7 n3 _
' Z8 ^" J0 _, O4 R* `$ b. d
> subs(x=19/9,p);$ u" H$ d) X5 q$ E% b- j( S- d* r

- e$ \) R4 Y/ l" ]- e. D在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证.
( w8 o0 x) R+ ?0 {) u- I3 M3.2 变量代换, `, y$ ^! Z4 ~
在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   ) e% o% ]% Z# x% J5 J& d
subs ( var = repacedment, expression);
, _) X1 e% K( q% \调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement. 2 G( T* @+ u! P& M0 C
> f:=x^2+exp(x^3)-8;/ |1 a2 u& }' `7 l5 T. K* Q

: A8 d' T1 u/ |6 _> subs(x=1,f);
+ o, h0 f0 V# M6 }+ d
/ n2 j' l  g$ F) T* l> subs(x=0,cos(x)*(sin(x)+x^2+5));( _- T' s  |/ ~/ y

: ?" I$ C% H# @    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   
: o; v% S3 q4 E> evalf(%);. H& Z* t9 |( t6 q6 F4 `$ k

+ X% o2 u1 c4 ?9 Y* L变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:     L; \4 z: Y4 t
subs (var1 = repacedment1, var2 = repacedment2, expression)
$ |: h% E5 R" H5 F4 V! d+ w; e3 w& [# [调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   
& p7 e7 |* v1 e8 V6 `0 r% dsubs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
8 h) y7 T3 a/ H, l9 I0 P9 C2 ~. L下面通过例子说明这几种形式的替换.
/ z7 }# I3 s# k4 k' a! ~5 z, T> subs(x=y,y=z,x^2*y);              (顺序替换)0 Z. ]3 g7 W# p& g! w

3 K: l7 a  J% q+ T. O> subs({x=y,y=z},x^2*y);            (同步替换)+ S  r" u6 J+ G% L8 X4 o! p
3 T+ [1 L9 U1 ~
> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)" x4 M4 z& x5 a$ H( Y. [0 s) V0 P3 ~

& j4 \* ~- P7 x0 R) Y> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)
( F6 P0 |: K: R2 j
" j) l" x+ v" s; T$ [> subs({p=q,q=p},f(p,q));             (互  换)
$ s8 x4 _; X5 ]1 M' K/ p7 Y8 E 4 G% p4 x- r8 q
3.3 假设机制+ z; G, ^$ V; c- S" V2 {' O
Maple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.
, M/ p8 @8 A/ ~& b$ C在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);
" f2 ^) c( u3 L1 C( |) {函数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);”也不会产生矛盾. $ e0 O7 P5 W1 V# G) I: y* ]: f7 B
> Int(exp(-s*t),t=0..infinity);
9 u  C: |1 b; _  D6 N5 _) u
; ?4 u- |6 H5 Q( P( f> value(%);$ ?/ w# w% m  a
Definite integration: Can't determine if the integral is convergent.7 V$ y1 L) U, I3 |- o( y
Need to know the sign of --> s  L2 J  W7 F* H0 U4 o1 A
Will now try indefinite integration and then take limits.5 |0 t( w: Y, }" U" q) T

* r. \/ u- L) m+ |> assume(s>0);
  g4 _, i) B; A3 q* I% D/ k> Int(exp(-s*t),t=0..infinity);
) Q2 l" N' P% @# N. l 7 t3 X2 K8 `( V' f+ ^
> value(%);8 ~! p5 x6 u7 X, i# I

  a1 }' u! x+ X5 o" R5 x3.4 求值规则& X  _: f' G+ V- y
在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
$ l& W+ V! u- {$ O> x:=y;& _& q( S& _5 W  L( g
: A! c+ M. P& N/ z$ X
> y:=z;
/ ]+ u& {( \/ T# R/ m 9 S/ I) K  k. W& i* d/ f( b
> z:=3;
- [5 y( U+ F/ J ( H% W6 c# `1 l( y
> x;
0 l. m8 Z9 v# A
2 ^& B7 R8 D/ z- a$ B  ]> y;" h7 M+ i+ u& s( v; L5 Y  V
4 j! p0 r. Q1 t# @) _0 Y
> x:='x';. S$ t* q' {: e! o$ x1 O; u( ]; U
. ~5 r; N6 v9 d: ]6 @
> x;
" i: b9 A( V2 Z) J( p# k # s0 ]. Z- }4 B8 h4 D) @
> y;
( L- X" G% N5 Z* y+ G* e
! R) E) {: C/ L: e对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   
3 A# B( ?) [- y. k% b9 @+ Q* Y1) 对表达式求值
& U. ~$ F- f0 s$ j# k$ L( M命令格式: eval(e, x=a);  #求表达式e在x=a处的值; O+ n: d# ?- H( ]" u8 y) G6 l& z
             eval(e, eqns); #对方程或方程组eqns求值
) T, f7 e+ Y) D, p: h             eval(e);      #表达式e求值到上面两层
% b5 y) I1 K; o6 ?8 H  ?             eval(x,n);    #给出求值名称的第n层求值: `0 R' S- i' x& N3 R$ C. C8 w
> p:=x^5+x^4+x^3+x^2+x+73;: ?7 B( k" s' S

7 g( d1 h9 d6 Z> eval(p,x=7);. t* `; l* H- o! ]

1 x6 M8 k  N& j3 o+ e" @> P:=exp(y)+x*y+exp(x);
; t4 a7 ]: ]) |1 j2 S) }
2 P6 R  z3 J8 [3 A2 t- Z> eval(P,[x=2,y=3]);) b- e% U" g+ I# h/ c0 N1 e& y  Z1 a
' z, ]4 V  y  L- w# |
    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   5 x. s. q! _& v( }3 B$ c% h4 ~
> eval(sin(x)/x,x=0);; D2 G' t' N0 B) o
Error, numeric exception: division by zero7 O- V, R$ b' S$ K3 D# S  q4 T
    下面再看使用eval进行全层求值或者对名称几层求值的示例:   3 h2 D' V* O; F1 M# k$ q+ r
> a:=b: b:=c: c:=x+1:
2 J, U- C# Z) o( U! j, Y0 ~> a;              #默认的全层递归求值
! O( Z  o, s6 d0 B) m, n/ M: j
) Z. M3 \! D- e: y> eval(a);        #强制全层递归求值9 u9 {; F* G% a) f( e* [& [' t, D

  q2 K9 w$ ]  d2 P: i6 v( h% Y> eval(a,1);       #对a一层求值
$ O- b2 y! H) Z2 C ; P, a3 m: }+ S; J: I& m2 z2 D
> eval(a,2);       #对a二层求值
8 A8 z0 Q, l$ B  r, q5 x$ G" w
1 K: q6 i" \, L% S> eval(a,3);       #对a三层求值0 B$ @* \) N8 p3 N
; [& g1 H5 i  {6 T; U* ^, ^0 u9 \) D- V+ v
> eval(a,4);       #对a四层求值
, v! r) _5 q3 Y& J" A  U2 E
9 R* d( }9 }5 R1 |) i, a+ U( @    2) 在代数数(或者函数)域求值% J' t$ F# _2 d7 f6 i
命令格式: evala(expr);       # 对表达式或者未求值函数求值, N7 K4 N! B# O( g2 M5 H
             evala(expr,opts);   #求值时可加选项(opts)
: Y( l! w: u6 g6 G2 |) p3 |' n0 K, p所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式. % P4 z* n' Z) t2 F8 |8 e
代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   
2 a2 H; u# ]" H! U: e6 _! x> alpha:=RootOf(x^2-3,x);
+ y, k$ r: h2 h6 F5 D
  W) v) y) h2 p& r# T* d" _/ t> simplify(alpha^2);6 Q! G" w. t; M% s8 K& g( P

% W4 q% }! [' z, Q8 x$ F在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:
7 M* U' R  I# L> alias(alpha=RootOf(x^2-2)):  a- v( y4 \6 p, X9 u& R
> evala(factor(x^2-2,alpha),lenstra);" }1 o' e5 \# V/ P# a- p
. _' @8 n3 _) I8 w; k; y0 p/ z
> evala(quo(x^2-x+3,x-alpha,x,'r')); # V+ ~9 j9 d6 A/ k

6 L* e) @( g4 t# d( T7 s> r;
7 j8 l; _2 e% V, h: b
8 N4 T2 }" Y* K5 N> simplify(%);
+ z. r, t7 ~4 z  ?$ `% e 8 g2 }( ?7 ~2 D& g6 X% I
3) 在复数域上符号求值
! V% x$ {4 h# @& R- u6 \! ]操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:' a& e$ U2 m6 g; Y, _/ T
evalc(expr);   : K! p8 q* h+ B9 c- a
evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2.
& M" b9 t" f) a> evalc(sin(6+8*I));
$ m& D, j( p* T" k+ e4 S ) e. ~+ B( t0 v$ b' t! ~; i
> evalc(f(exp(alpha+x*I)));" [5 X+ r( z1 F6 b0 V, u  Z

! U2 H! ?. G  K; z9 q> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));
  `) |$ y) o, |$ s  v7 L
7 `; v+ Z6 b7 e- L( y4) 使用浮点算法求值, c/ Z$ i2 @2 b$ Y
浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     
* s0 F. N0 J  j5 L8 ]> evalf(Pi,50);    7 k# p! E: R8 M
& Y. u+ _* ?" T/ J) _
> evalf(sin(3+4*I));   $ C% s9 B6 c' x9 @, j/ b$ K

6 j& i& W& L' v5 K7 d. P$ U  S> evalf(int(sin(x)/x,x=0..1),20);1 o  l4 H/ J* w8 _1 v) u
+ k1 G' Y4 v; W$ U5 V$ B4 K
5) 对惰性函数求值
. d. P( }! l0 p* u; b$ H把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   
  Y( G: W9 C+ q' f. a6 a( e" M> F:=Int(exp(x),x);  \+ O8 G$ ]& C' I/ s5 U

# J# o' x% a  ?: M8 f+ J6 w# }> value(%);
$ D/ |) |0 s& R6 P# B2 L
) \# Y3 t: b* H) z% D4 Y) @; W> f:=Limit(sin(x)/x,x=0);
& M8 a& H, }7 x + X1 J! ]8 a9 q
> value(%);
  _$ A# |5 k; H' W, O- v+ l  K
4 o% }: V: Q% K8 C! p- y& l% T另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   
; ~. p; X3 [/ U7 G- _( w9 ^& o> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
6 n3 c6 B! C9 b8 z' @. U* L + L0 Z" U4 Z( x$ E6 J1 R# |
4 数据结构/ H. n7 x8 M- h' ?
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表. / p7 W0 f0 U2 o  T
4.1 数据类型查询4 V# M5 K, q4 ?
在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
% B* @8 m5 d( G  K3 J+ c( V7 Kwhattype(expr)        # 查询expr的数据类型
2 ^; Q: f# H$ U5 N' ?type(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false
1 ]1 i4 b$ A3 f! _> whattype(12);
2 n9 _! P& o" Q, |9 o! v# u " _' ]' `, Z- p/ b! A: |/ E1 a
> whattype(Pi);0 X  u0 E7 v- c! [
7 [3 K6 l4 s& C
> type(1.1,fraction);
+ G# x! |9 m* x+ Z2 M! U, U; C: W
0 K- f5 H. F7 i) A> whattype(1.1);
2 a- F. F3 c9 j0 |2 V9 a8 a3 R9 b0 \ 7 e" U$ Q0 O2 L% W
4.2 序列, 列表和集合
0 p6 h6 W  x' n7 X" q% B8 m- q4.2.1 序列6 F$ ^* f: c* I1 _9 X, R' l. z
所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
( u1 O2 i! n6 q, y  c1 `> s:=1,4,9,16,25;* H: h! l) j) ~( s6 B
2 x6 ^5 l% ^3 s; U0 r$ C- u- B
> t:=sin,com,tan,cot;( R! |9 Q6 [+ M6 N) k9 s
9 ]* Y2 a$ ~' C& w
一个序列也可以由若干个序列复合而成, 如:   * m( S" G1 t9 E& m
> s:=1,(4,9,16),25;  b9 ~) q- q4 i
1 @) I3 N6 b! f. h
> s,s;
4 ~- l4 |' V* q3 C7 ?; O2 |) Q $ i$ _1 V9 e3 y* d
而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   * [( B4 _. o0 U5 A) ~" t9 v
> max(s);" ^/ _  P/ k6 @# C" c& I! G* _# _
$ i* I! e! l  E' Y. @
> min(s,0,s);
/ g5 X! e9 E0 ]4 i5 d5 d- x6 c- @, i 2 _! R' X' v  E( {8 J
值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中.
0 d; W7 q+ t" G) C# Z! a> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;
$ y$ {$ \( _2 B3 ]) p 6 C" z/ t2 k7 |; ]- v
> op(s);" i8 l- g7 j- O) g  B" \; t
Error, wrong number (or type) of parameters in function op. d/ ?1 O6 k& Z1 i$ u/ f$ l
> nops(s);
' h0 N% z# m  L3 S2 y! x/ BError, wrong number (or type) of parameters in function nops
$ H; c' j+ a7 L7 |> op([s]);" Q; D: j! R, o( n$ D% f; X, u

3 U$ [% ?) j, n& C; J# Z> nops([stuff]);) j+ g. b# f' D) ~8 B: M; y7 ^0 B

$ V" S% s  i' h" s9 g3 F函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   
- S. V7 K4 F, f6 }. Eseq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)0 l; a8 h* G) P# ~9 x
seq(f(i), i=expr);  # 生成一个f映射expr操作数的序列5 A# ?& V. r/ c8 Q
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列
) o/ e3 m2 |0 h> seq(i^2,i=1..10);
6 o( _5 m; a9 R6 w8 r' F / a$ Y3 }+ b( a. A; Y
> seq(ithprime(i),i=1..20);8 X  k) |1 N9 g1 o$ y
. i( u; [. N: J! G
> seq(i^3,i=x+y+z);+ e- i( E3 B4 R1 m

9 X% H5 C4 _1 d( f- X% ]> seq(D(f),f=[sin,cos,tan,cot]);/ r  T) Y& i  Y  T+ U% K- y
% U  X6 _) t) }3 {
> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));* c  A/ ^3 J" z: w4 f  ]5 e

" e  n& t( _' o4 V& |' _获得一个序列中的特定元素选用操作符[  ], 如:   1 Q5 i- \% r4 H# u+ D- `
> seq(ithprime(i),i=1..20);
3 w) r! J' c) x* {, x 4 z" x- J( i) m8 F" l- h6 K- ~
> %[6],%[17];
4 j( Y! s$ Y# H
  ?' Q, f" r9 W  d7 y# ?2 f$ k( W3 [4.2.2 列表
+ `4 H6 E; c3 [- ^# O列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
8 i% @& r; @0 F6 g7 g6 v+ J> l:=[x,1,1-z,x];
' w' A# q4 @% C
! f! m& T3 V$ E6 {5 A4 f' I; U" |> whattype(%);" n0 d" t; o) d- ~/ m1 q
3 R. L- r' n1 o" o$ y
空列表定义为[ ].
# H1 g% c+ X- ?但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   1 P( h8 C1 C. a3 y- i( m7 Y0 o0 A
> L:=[1,2,3,4];5 q7 {- [* r5 s( q: k6 l% J7 a6 Z
0 X! U  d5 V% q) ?
> M:=[2,3,4,1];& A7 v9 N4 z9 Q6 d
- S5 m6 C+ ?& N" |
4.2.3 集合
6 p% r/ S7 C5 W# F集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合. & E  j( c0 Y7 |# Y5 g! `1 e: ]$ ]
> s:={x,1,1-z,x};) o  g' D8 g  u2 A9 L

5 F, h2 w0 Y" P, d* G) [> whattype(%);0 S3 _& c7 N; ]  H

" i7 p4 I3 G+ K6 g- Z空集定义为{ }. ( j* g( P& c7 f4 f
函数nop返回列表或集合的元素数, 而op则可返回其第I个元素. 7 M8 O6 X1 D, I6 e, s0 s/ w9 u( h; D0 `6 d
> op(1,s);
/ H8 c& f0 L, b4 P4 _. N. g
. p  B4 k4 t; s6 I! I8 r  y# u0 `/ ^# d> s[1];+ {" h3 C) R8 B7 L; \" a
+ y, m$ @4 f* J3 u$ y- o* l8 L: V) D
> op(1..3,s);
/ L' B% {* Z/ i6 Q+ T ( N+ E0 @) k. }* B4 x
> s[1..3];9 J$ d% q0 ]1 ~6 e# h* V

6 `9 b" Y/ y- n/ \& L函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
1 a; }; n7 l3 d2 q) ?# K> member(1+x,s);; D8 c4 K3 d1 R+ H' L- l  u6 V

& J$ Q1 T' V0 i) m7 e8 Q$ u可以通过下述方法在列表中增减元素:   , h2 U: l8 y( L4 d
> t:=[op(s),x];
( q8 j: U1 T# x2 p) ^
* y% l# R" |. M1 N; X, ~> u:=[s[1..5],s[7..nops(s)]];& x0 ^8 R* \0 R

5 A* d; r: _- O4 \9 fMaple中集合的基本运算有交(intersect)、并(union)、差(minus):   
& F! }- X) ^( I  W# W& M! C> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};7 W2 p! e( G; T* S
1 @/ [. j- f8 B; a" V8 N* _

9 z; H+ r+ v9 c/ g  f& x> A intersect B;
; g' W8 k4 V  s/ d6 H( X2 T & F* b9 C+ m) K! M
> A union B;
2 N' D$ H. P8 r; r  ?* e# k. u
8 S$ u4 H7 J. u> A minus B;
1 ?; f0 `  U5 w7 N - E( `$ Y; [) G7 K/ ~4 w5 p0 j$ R
4.3 数组和表
0 w. M9 C1 k- l在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令. & ?5 _- L) E" C
    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的.
/ O9 H# w! [7 K, }9 I' _1 m0 ~> A:=array(1..4);
2 \& o+ \( S& o- ~( Q% e: e
$ j# y, c$ y# h6 v! m> for i from 1 to 4 do A[i]:=i: od:, a. X' e4 I, @/ i1 ]' B
> eval(A);
) h( M' N" n! Z$ I; b0 ~) l 9 K, R: Y( A. X2 N! ^, k
> type(A,array);' m' ?# A+ m/ P, x
% I' r/ k! z* e% A3 y. x* v; C
> type(A,list);
$ |1 u- h; z1 R. ? 2 O2 a- S# m7 j# A+ e4 |' d7 S
> T:=table();$ a/ R# ^% S8 M. j4 }
- Y3 q9 t4 w2 J+ Y
> T[1]:= 1;) V. p6 [) E' g: Z* }
+ a' L5 C3 p/ D) \
> T[5]:= 5;& ]7 b. t5 g; F, a5 h* ]! c% e

  J$ h2 f: E/ _1 D> T[3]:= 3;; Q) d  E# |/ X& F& K/ K) C& c
) |7 _. m- `0 v4 U
> T[sam]:=sally;
' Y% e" Z& R( v 8 i4 [, e8 J5 {
> T[Pi]:=exp(1);
! n& z: t4 L. h3 [0 P4 [1 `( R
# F. f4 g2 l3 N/ x5 _/ ^> x:='x';8 ]9 u1 J* g: n; s6 w8 h

3 w7 _) S' F% B% H5 i> T[(1+x+x^3)*sin(x)] := 0;
, j9 I+ d( a+ R  V6 r 8 P1 W# O. Y7 X  V1 p5 M+ V. |
> eval(T);" \! V) g. w0 n: M) ^

1 u" u2 p$ J' ?> T[3]:='T[3]';% P8 q& M$ p7 o. I+ H+ d

" R+ a# C# a2 H5 y> eval(T);& D! ^" p6 ~1 `2 F

: o! R$ r5 z6 R) F. U4.4 其他数据结构5 J' Q! v: m: p7 {% l
串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. ) }7 u: M. u+ J7 e4 `
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立. " z) }2 a* p3 z1 c1 x7 z
> x:=T[3];
1 {0 Y" u/ H/ C4 e+ ~
( O. t: Q) X' c) a/ o2 D- ?> eval(T);
8 ^" _3 m3 z  R
% t. j; V, @7 X/ X+ q> T[5]:=y;
* V3 F" o3 k% D- i* X  h " o( w" R2 n7 y( ]
> eval(T);3 `) U; [5 Z( W0 W; f& R8 L

* w( e) @0 e- d, w, W由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.       a6 L3 q: }" H
数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数.
. W/ y# h1 I$ f9 Z4.5 数据类型转换和合并- b6 b- A9 T" Q& i' ~& T: o4 e
convert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   + L7 s0 l/ ?7 M- y; Q0 J
> L:=[1,2,3,4];3 r2 Z: T/ s) F
" ^  `2 G: B! x0 K5 e; p4 q: \* m
> type(L,list);
0 T4 C% u  i, [5 X! Q : g; V6 j' a7 Y' I
> A:=convert(L,array);% b4 P+ `1 j9 O& N/ v8 e
5 m: S2 t; |4 [6 \4 I% B
> type(A,list);
5 |5 j" L; _+ C5 v 1 U4 B2 o6 ^1 i0 I+ r$ H$ d8 N
> type(A,array);
  N$ g: x) l% @# M  v 8 u- |3 a( p: W3 ]
另一个有用的函数zip则可把两个列表或向量合并:   
* P' x0 J9 [$ `4 r; r>L:=[seq(i,i=1..10)];2 P/ \1 A9 O, J3 v  t4 H5 J1 U

) R: _7 f- u+ V  H- y0 Q, @> Sqr:=(x)->x^2;9 |6 n  L( O- l1 u  B6 n1 ^

( |: y; D& Q! S7 n& a$ B> M:=map(sqr,L);. k8 l, g3 u3 G2 I+ Y: n. a4 t, i

, m' s1 ~' @6 a: M( m> LM:=zip((x,y)->[x,y],L,M);1 {9 F+ J' }- y; d  b7 I4 a! N

8 n* [: `; w$ M6 x> map(op,LM);% X1 q7 K+ G  C" Q5 a) d

5 `  v& g2 i. o7 A$ T5 Maple高级输入与输出操作1 A: D8 y6 p& D: ?: y$ c! \
Maple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里. 7 o! t: f* y& L, V6 |# e4 ]9 l( M
5.1 写入文件/ S' J' B: h3 C) d( h3 O/ k
5.1.1 将数值数据写入到一个文件
3 J# C3 i7 @; ?1 j0 H. j如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令.
9 u! S' @. L" `0 v+ u: k若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);) o1 n+ c' W1 {
> with(linalg):
. ~, U' Y% d2 U6 r7 S. a> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);
& a5 ~5 r, b. a) i' W 8 F/ g) e  f9 {. n8 k
> writedata("e:\\filename.txt",M);2 a& z, U  H7 |- v& T8 q- X" R
而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);
( i/ b! h7 j- u7 p" Q> W:=matrix(2,2,[1,2,3,4]);, [+ G) N6 J6 A9 P. ^

( r2 _8 C# ~2 w+ G. [> writedata[APPEND]("e:\\filename.txt",W);8 Z$ N+ _" u# P# L. W
需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果., Q$ m* v' ?; F  C/ x/ J# j
另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);7 F0 X5 `0 j7 M; l
> writedata[APPEND]("e:\\filename.txt",W);
0 C& s; w" y3 r2 }> writedata('terminal',M);9 D9 S% p) n7 C, G
1                   2                   3           5 Z2 ~; w) X: X' [: z2 K3 E
4                   5                   6           ! U3 l. |, `3 Z2 b
7                   8                   9    ; i$ a/ p3 ^- e. R: R2 D5 {
5.1.2 将Maple语句写入一个文件
0 I- u. |' Z! h2 r3 U* K7 J如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:
4 J9 V2 x6 Y( p1 Dsave name, "filename";
4 m3 e% i4 |. V( S% L. L+ O7 I0 }* Psave name1, name2, …, "filename";# k8 ]2 W& r- P
若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.
1 E) R0 ?: F, q( u> myfunc:=(k,n)->sum(x^k/k!,x=1..n);& }# s  }+ F$ V% K; _' J
: `! w5 [5 w. d* C$ N
> myresult:=myfunc(6,8);- x+ \7 i1 u: }" [  u/ q+ H/ H
% \0 i$ ~! X1 j  d0 T) [/ |
> save myfunc,myresult,"e:\\test.m";. L6 s# J, h$ O8 T# f0 b  t9 {& s) r
调用已存m文件用命令read. 试看下述实验:
* s) e2 C# q$ h+ |> restart:
& L  C4 s, W' D  H5 Z, H> myfunc(6,8);* n+ d- c! o8 K

& W7 s5 F/ L" f% \> read "e:\\test.m";
; E  `" ~. [8 A2 O  K> myfunc(6,8);/ f8 a) O0 q9 L% Q: d7 F, j
3 D" n8 M" I* ^. S; o6 i
> myresult;
/ S+ Q8 ~+ Z/ W1 ~( _1 c0 e * }4 z: S+ P3 O9 M
    而存为txt文件时则将整个语句存为一个文件:1 P* r2 g# o4 N( n( b/ V
> save myfunc,myresult,"e:\\test.txt";* o* L( B; a3 ^9 z* c6 S
> restart: read"e:\\test.txt";( y! @  K( x: Y" L/ ~8 p) k

& x  w$ x. e* |5 Z - X: m$ X) I3 T  W  j
5.2 读取文件
/ N# n" w1 j# R( M8 Q4 U在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.
# N$ M8 J. u% k4 B! P/ s/ h5.2.1 读取数值数据% v+ p) A) h0 `+ o/ t
如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.+ S- Q; F$ R$ N( ]1 r
从filename文件里读取n行数据时使用命令: readdata("filename",n);; f  Z$ j$ _9 ^* O: _
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);
6 z2 ]- y& h) S7 R( O> readdata("e:\\filename.txt",3);
8 @7 v4 m1 `2 c- W# s$ Y 9 l5 a/ l4 u* @6 T
    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:
5 Z7 m# H- n: A5 W' H+ O> readdata("e:\\filename.txt",[integer,float,float]);9 B* \4 O: P+ l3 f$ W0 R
% Q0 q" W# U$ m+ q" `
下面再看一个运用大量的实验数据在Maple环境绘图的实验:
9 ^5 g6 \# b$ {, q9 f  x> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:
+ I1 ?# L$ K: g7 p> writedata("e:\\data.txt",evalf(mypts));
. n$ A1 E, V2 e, {7 r> dots:=readdata("e:\\data.txt",100):
. j. O; X6 i6 Z& [' q/ f1 g> nops(dots);
! Z9 [8 I, {: t) e+ u5 |9 }
( g3 i# \; E8 t! N- }3 c: e% N2 e4 E> dots[1..4];. M0 q( y8 p5 g- s$ l0 p
% X" y/ r0 L9 p* m1 p, b
> plot(dots,style=line);  D7 w# m/ t- G
9 D: Z  I/ c! b: e1 [8 Y' G; s
5.2.2 读取Maple的指令2 h/ o+ I. S2 |! s# K6 ~4 g! ^1 N4 m
在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:
1 [' S) C9 e% O3 r! D9 u/ R# W. lread "filename";
4 f1 Y% }6 y* X$ t) c如下例:) v8 d9 Y! f  `9 }) C
> reatart:
' p9 e3 n6 P: K3 u0 x5 h3 E> myfunc:=(a::list)->add(i,i=a);
2 R2 l9 l7 o, q5 d! G1 X " F/ c9 I8 _: J5 j8 S4 u: {
> avg:=(a::list)->myfunc(a)/nops(a);! w: N* ^6 Q; s2 U2 b
5 m7 `7 d( p2 I$ ?( L+ e- P5 g
> save myfunc,avg,"e:\\function.m";) _  y; D3 x  E1 p" [5 f% x
> restart:" I3 k+ w. G) R8 t; N
> read "e:\\function.m";4 q% s' G% ?' V  ^8 q
> myfunc([1,2,3,4,5,6,7,8,9]);
& T0 B! f& y9 I( L1 T0 T6 H2 r 7 S& I  @9 _3 ?& |, f
> avg([1,2,3,4,5,6,7,8,9]);2 U( R0 L7 x) H9 h- T  V

. I+ a; O/ y. [. @# R- R5.3 与其它程序语言的连接
+ f) N" ~: e3 c5.3.1 转换成FORTRAN或C语言
- K/ D* x; W2 u7 L& A/ R5 V  ~调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:
5 Y# i0 U0 ^- f7 z/ z- K> with(codegen,fortran):
- C! h/ n  o7 E: Q0 H9 rf:= 1-2*x+3*x^2-2*x^3+x^4;9 m& q* |! f( @0 w2 _& |" z
/ D" F- x) H2 a
> fortran(%);6 ~: I$ P7 K& }2 @. `" j
      t0 = 1-2*x+3*x**2-2*x**3+x**4
2 g9 u. E3 v5 A% s9 m > fortran(f,optimized);0 ^+ [/ l4 G; ?: y
      t2 = x**2
4 ^3 x3 _8 J% U4 p) C' q      t6 = t2**27 L0 B: V. j8 t% N; i/ M
      t7 = 1-2*x+3*t2-2*t2*x+t64 l6 b3 M. H, E# K! E
> fortran(convert(f,horner,x));+ P2 |6 m. H" N
      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
9 C: k8 O" J" d+ F$ r而codegen程序包中的C命令可以把Maple结果转换成C语言格式:
0 g: L: b" i9 f! G. b* u$ r> with(codegen,C):9 d! K: `+ m0 _1 J( a' V
f:=1-x/2+3*x^2-x^3+x^4;
% m! k$ d4 F; V( a/ I, [, M2 v 6 t/ t* x. N+ L5 ^
> C(f);
7 E+ t- I1 F  u0 `4 T      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;$ f/ J% U1 M( i: N! L
> C(f,optimized);/ y6 d9 ~: q9 \3 J0 s: N
      t2 = x*x;6 B( x, O5 f  N
      t5 = t2*t2;" {% A  e# t2 w% Z" v1 ?% O" K
      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;  x4 v9 C! I/ x5 |2 y
optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.
9 c- }* Z$ \$ n, y+ B' M5.3.2 生成LATEX
/ q9 h5 E! M9 ]+ F6 SMaple可以把它的表达式转换成LATEX, 使用latex命令即可:
5 f4 g& Q4 j) Z  b: @' z# X; B> latex(x^2+y^2=z^2);0 H) r9 x3 o7 A" H! W7 ~1 I0 W  B
{x}^{2}+{y}^{2}={z}^{2}
. u9 X8 G8 t  z    还可以将转换结果存为一个文件(LatexFile):
/ `$ |( j  a* \) |> latex(x^2 + y^2 = z^2, LatexFile);' B' u* D3 R, ^
    再如下例:5 K4 Q9 L2 {7 B! i3 f5 @  ]# b
> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));* U9 V0 l) p" g/ i* J- p% `
\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
6 w2 r% U- F, ]+ I& O! Q( V9 T3 p, ~, D, X# {5 K
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年!/ [( b( X% U* m! ?
    , @. j; A% j$ V

      _  e% I( k1 [
    回复

    使用道具 举报

    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-6-15 06:28 , Processed in 0.587263 second(s), 104 queries .

    回顶部