QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

自我介绍
爱学习
跳转到指定楼层
1#
发表于 2012-6-12 16:53 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
6 K/ X$ O  \& l! p# k& J2 {
第一章  Maple基础
- P% S" G0 @0 P9 C9 ?" y/ l
7 H8 n0 H; p' N+ [$ q1 初识计算机代数系统Maple
# t2 j' H& G  Q. m( V1.1 Maple简说
! a# v' K; S+ q; o% T9 y" B1980年9月, 加拿大Waterloo大学的符号计算机研究小组成立, 开始了符号计算在计算机上实现的研究项目, 数学软件Maple是这个项目的产品. 目前, 这仍是一个正在研究的项目. " _& B: c9 }+ ]! {6 S
Maple的第一个商业版本是1985年出版的. 随后几经更新, 到1992年, Windows系统下的Maple 2面世后, Maple被广泛地使用, 得到越来越多的用户. 特别是1994年, Maple 3出版后, 兴起了Maple热. 1996年初, Maple 4问世, 1998年初, Maple 5正式发行. 目前广泛流行的是Maple 7以及2002年5月面市的Maple 8.
3 u# f* [. N5 X8 L2 N" u8 uMaple是一个具有强大符号运算能力、数值计算能力、图形处理能力的交互式计算机代数系统(Computer Algebra System). 它可以借助键盘和显示器代替原来的笔和纸进行各种科学计算、数学推理、猜想的证明以及智能化文字处理. 1 ~; i7 I7 ~: Z
Maple这个超强数学工具不仅适合数学家、物理学家、工程师, 还适合化学家、生物学家和社会学家, 总之, 它适合于所有需要科学计算的人.
" S' ^3 P, ^) t9 g1 W1.2 Maple结构
8 G; ?1 L- `$ y( G! PMaple软件主要由三个部分组成: 用户界面(Iris)、代数运算器(Kernel)、外部函数库(External library). 用户界面和代数运算器是用C语言写成的, 只占整个软件的一小部分, 当系统启动时, 即被装入, 主要负责输入命令和算式的初步处理、显示结果、函数图象的显示等. 代数运算器负责输入的编译、基本的代数运算(如有理数运算、初等代数运算等)以及内存的管理. Maple的大部分数学函数和过程是用Maple自身的语言写成的, 存于外部函数库中. 当一个函数被调用时, 在多数情况下, Maple会自动将该函数的过程调入内存, 一些不常用的函数才需要用户自己调入, 如线性代数包、统计包等, 这使得Maple在资源的利用上具有很大的优势, 只有最有用的东西才留驻内存, 这保证了Maple可以在较小内存的计算机上正常运行. 用户可以查看Maple的非内存函数的源程序, 也可以将自己编的函数、过程加到Maple的程序库中, 或建立自己的函数库.
2 N; }" L) s. H1.3 Maple输入输出方式8 b" V! A' G) q* I  \$ B6 h3 a
为了满足不同用户的需要, Maple可以更换输入输出格式: 从菜单“Options | Input Display和Out Display下可以选择所需的输入输出格式.
) Z8 N/ I  q  nMaple 7有2种输入方式: Maple语言(Maple Notation)和标准数学记法(Standard Math Notation). Maple语言是一种结构良好、方便实用的内建高级语言, 它的语法和Pascal或C有一定程度的相似, 但有很大差别. 它支持多种数据操作命令, 如函数、序列、集合、列表、数组、表, 还包含许多数据操作命令, 如类型检验、选择、组合等. 标准数学记法就是我们常用的数学语言. + `3 D: C# p$ a2 A) d8 H2 U
启动Maple, 会出现新建文档中的“[>”提示符, 这是Maple中可执行块的标志, 在“>”后即可输入命令, 结束用“;”(显示输出结果)或者“:”(不显示输出结果). 但是, 值得注意的是, 并不是说Maple的每一行只能执行一句命令, 而是在一个完整的可执行块中健入回车之后, Maple会执行当前执行块中所有命令(可以是若干条命令或者是一段程序). 如果要输入的命令很长, 不能在一行输完, 可以换行输入, 此时换行命令用“shift+Enter”组合键, 而在最后一行加入结束标志“;”或“:”, 也可在非末行尾加符号“\”完成. 4 x$ G0 h& b" `( o
Maple 7有4种输出方式: Maple语言、格式化文本(Character Notation)、固定格式记法(Typeset Notation)、标准数学记法(Standard Math Notation). 通常采用标准数学记法. 1 Z/ |9 p0 R8 C1 A6 |; k. K2 A
Maple会认识一些输入的变量名称, 如希腊字母等. 为了使用方便, 现将希腊字母表罗列如下,输入时只需录入相应的英文,要输入大写希腊字母, 只需把英文首字母大写:   ) d( @- o! l9 R

2 W+ q; w8 E% i2 Y- H, z7 h
6 {* `1 G" O: M1 ]9 [
6 R, a2 a( ~7 S; v- H' U# w
! Y, b. v$ V# q9 g0 o6 G: \; X
" w  Z7 w) ~4 e! w ! }7 J) G& v+ g3 T; I

4 y) p8 v, A7 S& c0 s% Q% B+ z
# j0 L& ?6 d1 s
0 l. K* f/ b7 |4 m0 K/ A
$ {1 Y* Z4 ]% p6 C $ R6 w2 M% z7 G& Y/ Z
" K5 F! t. x1 D& j( @
6 T5 X& S& ~0 r+ w- W* X
alpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu4 G+ q! z: H( ], f
0 ^) M8 H, T8 O$ x
/ s. x  j# o$ ^: N8 s
0 L* P2 w+ H8 S2 ]% [
- u8 n' r3 h3 P$ s  J* }0 H
* a5 \0 I7 F2 E& o* t

$ v1 y' O3 F6 i4 h
4 g' f- l" H0 b8 F7 c; C
7 c4 B9 \! G9 N
/ q  \5 m' `, G! P$ L* O; L% l/ S/ \ , I0 l9 O! o) g

/ ]% A) q5 y: L- |8 z 4 F: b4 B  A. s; R( f0 p

) P9 \: @: D, ^) Ynu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega) \! f% Z& f8 d9 n# f! }
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:- f6 @( y( L( u& p6 @0 `: Y
> for i to 10 do * c8 Q# l9 C. k% O
printf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));
& p! Q1 v3 s8 j9 r/ r/ wod;
! p( `- n) L" E) a8 Si=+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
# l- i6 @0 ]; k+ k+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:. I* d: |" d" H. B! l& C* {
> for i to 10 do 1 Y0 D- d2 u# _7 ~* _8 l% j0 m
printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));: g; a& l. \" i; y1 c$ N) V
od;
  B# g! j; S) R/ a+ `, G+ Bi=+1 and i^(1/2)=+1.000
0 M& `) F; z! Vi=+2 and i^(1/2)=+1.4140 D3 A4 X; B: K; F/ W- \
i=+3 and i^(1/2)=+1.732
$ v, k& d& O% J5 ki=+4 and i^(1/2)=+2.000# B8 B6 L8 U2 O* S/ {
i=+5 and i^(1/2)=+2.236
: ]. N; _1 u+ m2 l1 {  Y# F* Q4 Ri=+6 and i^(1/2)=+2.449  i% F" M; r9 R* H0 p& F
i=+7 and i^(1/2)=+2.6465 T8 q! v6 d3 q* I6 u2 F
i=+8 and i^(1/2)=+2.8284 j: z3 t( r' _; X# P& n, r
i=+9 and i^(1/2)=+3.000& ~+ i  z; T8 v
i=+10 and i^(1/2)=+3.162' x3 D, ]3 V4 u9 @- h4 ]& ]
再看下例:将输入的两个数字用特殊形式打印:: A( l* u  c7 ?! z
> niceP:=proc(x,y)$ [7 _/ v6 T( f2 I8 X. p, x) g
printf("value of x=%6.4f, value of y=%6.4f",x,y);- n* Z4 v1 e; r
end proc;) ?4 Y2 t. b$ x( T* h; c
2 A3 a2 T) \( w" Y. e& `) w
> niceP(2.4,2002.204);0 U; n! G. e* p6 U* Q9 V. u3 h; K
value of x=2.4000, value of y=2002.20401 h/ ?' T' n, M+ m3 K
1.4 Maple联机帮助
# c! W+ h- ]  x7 n+ i" B1 ]- Y学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用. ; R. ^( m) V5 q% \
在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可.
+ M6 V9 @# Y' j; W0 o( y" N2  Maple的基本运算
4 ?8 G) D3 j4 f/ u2.1 数值计算问题6 e/ }* a6 N/ o% L# I/ a" n2 j
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”. 5 m7 u0 B5 W5 @' i) c
在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数. 6 b( z5 c  Y1 ]) g5 s7 U+ ^
Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算. ! V& P+ E' {1 \3 @
但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明. 4 W  Q* K$ f' B: ~: V
第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   % q4 {+ H- t& ^5 O. f# o: R* y
> 3!!!;% O* G7 \/ G# p0 P
26012189435657951002049032270810436111915218750169457857275418378508356311569473822406785779581304570826199205758922472595366415651620520158737919845877408325291052446903888118841237643411919510455053466586162432719401971139098455367272785370993456298555867193697740700037004307837589974206767840169672078462806292290321071616698672605489884455142571939854994489395944960640451323621402659861930732493697704776060676806701764916694030348199618814556251955925669188308255149429475965372748456246288242345265977897377408964665539924359287862125159674832209760295056966999272846705637471375330192483135870761254126834158601294475660114554207495899525635430682886346310849656506827715529962567908452357025521862223581300167008345234432368219357931847019565107297818043541738905607274280485839959197290217266122912984205160675790362323376994539641914751755675576953922338030568253085999774416757843528159134613403946049012695420288383471013637338244845066600933484844407119312925376946573543373757247722301815340326471775319845373414786743270484579837866187032574059389242157096959946305575210632032634932092207383209233563099232675044017017605720260108292880423356066430898887102973807975780130560495763428386830571906622052911748225105366977566030295740433879834715185526028053338663571391010463364197690973974322859942198370469791099563033896046758898657957111765666700391567481531159439800436253993997312030664906013253113047190288984918562037666691644687911252491937544258458950003115616829743046411425380748972817233759553806617198014046779356147936352662656833395097600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 p4 ~6 @* W' Y$ P6 l% ?% l$ u
上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?. h+ Y! e6 L- v, {5 ]( s
为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式
# P6 P' y+ {1 V" z: V9 i
1 x/ p+ C' s( q/ O" y7 `可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   , u, I; m2 J% g+ z
0 Z3 P/ }) h; `( ?3 D% h
这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性. : f; t& c1 |7 p, r) `
另一个例子则想说明Maple计算的局限性:   . q( r! y! y2 q- z7 g) R
  
) ]' v' h# A  ]Maple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   
( @+ C8 o5 y9 k4 M6 ]0 D ! M/ _3 q, c% H
显然这是错误的. 这一点可以从代数的角度予以分析.
4 B# B- ]6 `8 A+ D5 H; l不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果. % t' t4 I3 A+ |& H
另一方面, 设 , 则 , 即:
4 B$ H$ P1 B3 C: ]8 |/ n0 ?( i# J3 N ; S' {# d9 C3 e( r8 D+ [) A
显然 有6个结果, -2、2是其实数结果.
( F& T4 ~- t) X. Z这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性.
/ c8 G+ W$ e" K尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的.
8 V2 A" w8 \" r2.1.1 有理数运算
8 A1 t5 H; ^' m) k" A& o3 R作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20).
: E9 a, Q% ^2 j, \4 @3 x> 12!+(7*8^2)-12345/125;
# B# \2 _2 ^9 H9 q) W
4 {1 s9 Q' q: v& u, Y> 123456789/987654321;
1 o8 B8 [+ I. y
* l+ b7 [/ b* U> evalf(%);
6 n% m1 b) Q( w# H. M5 p ( V( D. s" o- n2 W) v4 ~
> 10!; 100*100+1000+10+1; (100+100)*100-9;7 L2 `# [3 @0 K( ]9 \
6 w( c. \" l0 X5 `& G8 a
2 _' {1 x. [# V7 h  x

! c# K" a9 O7 V7 F$ B& Y" _> big_number:=3^(3^3);
0 U/ S0 t; }; Z" ]8 l7 T2 a+ v
4 x& }. e) H  i' v> length(%);1 N# y" J! j. s8 h) `
3 j$ F- S2 b$ J" R) O$ `
上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   
! p* M6 p; ]  m, U( N7 |    1)整数的余(irem)/商(iquo)6 w5 M  Y6 ?5 O! A# T( y
命令格式:   + b' I2 T! D8 O# I  w  D% ?
irem(m,n);        #求m除以n的余数; }6 v4 [0 E& ^+ t; h* z) r  i) K( r6 g
irem(m,n,'q');    #求m除以n的余数, 并将商赋给q
0 b  t4 K3 `3 Fiquo(m,n);        #求m除以n的商数2 ?/ q% I2 P% g) E1 K& I
iquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r+ y4 y2 j/ G8 Z5 g- |
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. & T* v( S) `7 }' b" U' R1 q
> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q, v! Z, V5 E$ M& X0 T* g
; H8 H' _* U" L
> q; #显示q
9 l, w" u: U$ Y& L$ V: h3 O 0 V$ C0 X2 }& D/ w: t$ Y) A
> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
+ a" H/ i4 b* Z8 O" \; J/ f
, g/ o4 @+ f/ T6 c> r; #显示r( Y! N: G8 g+ U+ D. y& N1 ]8 M
: ?4 s( y$ H! U1 s
> irem(x,3);
3 }* U/ i4 t2 b2 d# L
  {5 g& d$ M0 m! G2)素数判别(isprime)
$ l2 \$ V; O" u5 K$ w7 x素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); 9 ~( n* b& j$ P# K: `
    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数.
6 `: |4 L) K+ y5 _) B2 v% I> isprime(2^(2^4)+1);
+ B+ c5 z2 @2 ^   E9 M. D( a! ^8 V5 C+ X' \. Z0 O
> isprime(2^(2^5)+1);
/ q. Q5 p) S3 o7 e# q" P+ }# G
* P$ F% C2 S# j2 m# e上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多.
$ x! `- M) j2 [: E3 y  @3 G2 a5 O3) 确定第i个素数(ithprime)
- B- a3 u! M4 n" z- I# J. C若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);    , D( H6 Q4 k& _- q) S
> ithprime(2002);
7 r% y! C$ q. w) N& M ! @2 p: [# t/ O) d
> ithprime(10000);
5 w' q4 t1 `5 T+ G
3 T) E* U$ I) C9 B: _; j# F/ ^0 A4) 确定下一个较大(nextprime)/较小(prevprime)素数6 |0 @  T( @" E0 g& d! c) O
当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
" w0 D* C# M% \& G9 B* cnextprime(n);  
. ?5 l$ B: e  V* }+ c9 Bprevprime(n); , `0 Z4 y" b+ S8 P7 {
> nextprime(2002);
; _; \- v0 j/ Z% l ! P3 w2 f+ R2 m9 c6 m% N
> prevprime(2002);
& A$ N6 ^8 }6 W3 f& \1 U
4 b" p' A8 K/ z" Q; D6 T, G. l1 ~5) 一组数的最大值(max)/最小值(min)
' X, H: W" _) B9 D4 m4 f命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值
! `. B- U; V# E3 M* i; m0 L& ?% J( h             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
( ^5 v. S! Z: |4 C" _6 a( N> max(1/5,ln(3),9/17,-infinity);
* _0 W, k# @, {; h- l2 [ % P; y+ U& `- G9 s# C; D& e' j9 J
> min(x+1,x+2,y);' [/ b( ]5 z4 v- Q5 H

2 }  @  I6 h* N' N6)模运算(mod/modp/mods)7 B4 y8 m, U- `" ]4 u
命令格式:  e mod m;    # 表达式e对m的整数的模运算
$ [& h" B7 \6 x5 Q8 e7 U1 c) Pmodp(e,m);  # e对正数m的模运算
6 d/ H2 z; D1 L* q3 K% }mods(e,m);  # e对m负对称数(即 -m)的模运算6 ^1 V( q" M' s& C; Y1 O
`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价
0 ?4 E. V. ]7 w- O值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/.
* q- P. {' Q% D+ T8 r' b> 2002 mod 101;- t0 `* G8 u7 f. D# N: r" @1 F
6 K* t7 i3 S. C+ Z2 y
> modp(2002,101);
: q& Y" a6 j; C8 \+ C. @. v. [ , Z0 u$ ?& E- E  N: b
> mods(49,100);
8 H8 p$ C7 J% K4 X+ K4 Y   P7 t; I6 g2 K& r+ a% r0 Q+ [
> mods(51,100);: z1 G& {1 ~% D! _

1 U% J& k1 N0 y1 D> 2^101 mod 2002;  # 同 2 &^101 mod 2002;( E$ V/ g* R+ h) V2 Y" B

$ [' h2 S2 ~9 f# F$ B5 P7)随机数生成器(rand)
% E+ b$ A: H; F命令格式:   % |! I& L& N7 J1 }7 b$ Z6 Z+ D
rand( );    #随机返回一个12位数字的非负整数
- ^" K+ B; U* b, I5 c2 ?! ]rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数
0 P# ]9 [4 z2 c- s8 u> rand();% A9 O- d0 V" A1 l: P' A5 \+ O/ [, R
3 p5 ~: ?* B- X. g
> myproc:=rand(1..2002):( A3 E4 \" f4 f; ~% U) O5 v. B
> myproc();
) x; [7 ^- [1 f- G% r
+ S% h- N1 j- Y8 {> myproc();
% I8 m$ D, t4 ~2 U* g( X2 v 5 g( w) e- Y) }5 B1 }
    注意, rand(n)是rand(0..n-1)的简写形式.
/ J9 s' n( Z' g1 f" o5 K2.1.2 复数运算1 o8 S" ~0 q2 v7 R+ g$ s5 D( [
复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   8 R  b9 L& X& N" C$ `0 C% V" E% G
> complex_number:=(1+2*I)*(3+4*I);
( H: y1 C' P* m/ l' U. a4 `
, _/ E! Z( s7 P$ w2 w4 [> Re(%);Im(%%);conjugate(%%%);argument(complex_number);6 y7 z, ^- c* j  L8 @

5 z" W* q- b, |9 Y: |3 V1 x! v' v
9 J/ C4 P5 J, k; d* x
- h2 U! }( t& I  v# K
6 i, Y0 I1 D% D' F: p" k4 X值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.
1 t& ?$ }; D8 s& ?5 \" ]6 K* N2 \为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   + v- N& e& c# C% R1 [; I) [
1) 绝对值函数+ ~( F4 u: V* t4 V* }, E
命令格式: abs(expr);  
( K% _9 s  l/ X. N, M( i( P+ p! C当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.
" ]) ~- J/ Z; V* j9 k( F) U7 B> abs(-2002);    #常数的绝对值) h8 A5 ~6 t6 r* h% W
; a$ b/ L; r' \$ K4 ?
> abs(1+2*I);   #复数的模# T( F3 ~$ Z3 c3 f

! Z! Y. B, ?7 h7 @2 E" @" L5 i> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值6 j( `6 a/ R- Z, ~4 ~) s5 `
) h- D+ Y! u) z: S" k+ x! e( f7 G
> abs(2*x-5);   #函数表达式的绝对值( x4 g* e/ Y" Z# \& |% F! O9 d( W% D
2 u, i: H3 b- v0 Q% E* N! h
2)复数的幅角函数
- L* S0 x9 _/ v8 I' d: H命令格式:   argument(x);  #返回复数x的幅角的主值1 {% z: D1 J7 I' \' r
> argument(6+11*I);
" \3 M8 @# r4 u, f" y: k; ]* D
; y/ O6 {+ V, Q1 t- D+ W8 C# C' h3 Y> argument(exp(4*Pi/3*I));% w% }0 H) W* t
( P  d% k2 P+ w" b$ x9 j7 h6 o  z
3)共轭复数
3 v' i5 f0 L2 E( Z7 x! }命令格式:   conjugate(x);  #返回x的共轭复数/ I4 L1 h; `( G  t  D! P
> conjugate(6+8*I);3 T% z7 \$ n0 l1 N' O" j! d# V8 m- {

* u* b2 k! B8 j> conjugate(exp(4*Pi/3*I));- _* J; f1 [% x8 V

% U% w2 d1 z5 x, R) W" l! v  z2.1.3 数的进制转换2 [* r+ G- T! ^: X) B, x" e
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可. / O" }. _9 B6 ]7 I: Z
命令格式:   convert(expr, form, arg3, ...);   
, O8 d8 f5 C% J其中, expr为任意表达式, form为一名称, arg3, ... 可选项. + y& A1 |8 _7 G, S
下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述. - I* y: C% I: E
    1)基数之间的转换
; k  A  U1 Y" ^% Q" J' ]& K# f# H' c) I: K命令格式:   
2 w3 D2 c# B# \3 qconvert(n, base, beta);      #将基数为10的数n转换为基数为beta的数
# F+ c& i& }! ]  W5 l+ u: }    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数
- r& D: U: q. }" C% n> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)78 c( h2 W, T/ G" V1 c$ ^( E. S- n
8 D3 V+ f/ C) y/ A* w
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数
" l+ @9 b  }1 V" k5 W2 _ ; ]/ h+ R$ M8 H( {$ n
> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)
' y1 f  I! U5 ^% _$ n" Q
; S2 B# K7 @$ x5 V! K    2)转换为二进制形式
# @8 y$ v# d$ S; k命令格式: convert(n, binary);2 ?; V: U/ g# H
其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂.
, w% O( R7 W3 X3 f> convert(2002,binary);   4 q3 m# {- u2 c2 g  k

% ^' w6 M! T1 Q9 f7 Q* u> convert(-1999,binary); 1 ~% o. f0 p1 i5 T7 g/ g

; Y) C$ L1 v9 e8 T$ G> convert(1999.7,binary); ' M/ P# \; t$ J& T
6 |9 D5 C/ a0 V- {0 {5 ^
3)转换为十进制形式
) x6 q1 I: d( r; c' o* A6 O7 v其它数值转换为十进制的命令格式为:   
8 c5 A: B- a; J/ H. nconvert(n, decimal, binary);   #将一个2进制数n转换为10进制数
/ u( C, V& l0 I2 y* X- C- M    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数
* y8 V6 z7 l# K$ F2 ~+ i9 H7 r    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数! D/ d; a* A% x  E6 e( G
> convert(11111010010, decimal, binary);    1 C* W$ O  ]0 [( Y9 @* K

. O' G5 S, s6 \9 B' ~  ]$ E. _> convert(-1234, decimal, octal);           - v2 ]% u; U; G5 A4 j
+ B% R) D5 |0 h& a
> convert("2A.C", decimal, hex);         
1 k5 G2 c5 Y) n% O: a% }
) m) n+ l5 m  R& H9 J4) 转换为16进制数  U3 W) |! f4 l, H9 C1 p
将自然数n转换为16进制数的命令格式为: convert(n, hex);   ' w) ^4 T0 h. Y" Q; y) y
> convert(2002,hex);  convert(1999,hex);
" W1 r' Y9 g2 e0 T7 e1 l7 b 2 q  E: j: H  S# a
% ?- ?0 v, C/ R
5)转换为浮点数
2 X2 v& S- @: D  w8 a9 K& J命令格式: convert(expr, float);
/ ?  S; i  c" h7 ^% c+ q) ?注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用.
% H. }# K* m4 A/ J0 i> convert(1999/2002,float);2 K! V. S) i# }

- b  X, M9 Q( h1 S, v1 C& S' w5 Y9 i. L> convert(Pi,float);
! ]1 \* \. o9 z
; Z0 {- z/ y( W% c2.2 初等数学9 [7 N8 F5 w8 [' [$ X0 L9 i0 k
    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识.
5 s4 G5 H, w5 z! f+ Q8 L( A2.2.1 常用函数6 ]3 R. G/ T; ?* m3 x$ R8 l/ f
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   0 f6 K& E( s2 b' z$ r& g2 B; Q; t
指数函数: exp
; ^  U+ ~- m5 B+ M一般对数: log[a]" q* j$ ~) l% s( Z& k! S
自然函数: ln0 I# f+ G& s( @( }/ P
常用对数: log100 n. g6 {) H/ G- s
平方根: sqrt
4 X! i6 o) d7 U9 k绝对值: abs) \& d6 I* }4 P$ a2 d% r
三角函数: sin、cos、tan、sec、csc、cot
/ O2 @, p& Q. w( ^反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot
2 [8 I% y( y; F' w双曲函数: sinh、cosh、tanh、sech、csch、coth
) _3 Q0 V$ [& g# q( n; d& z( T反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth
; f8 X9 E: O' k! z& c$ r) Z贝赛尔函数: BesselI、BesselJ、BesselK、BesselY# P$ }+ ]3 g6 S) ~, W- k, `
Gamma函数: GAMMA! Y9 z+ c7 `3 j" M) U
误差函数: erf4 ?! D6 @; Z0 ~, H
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能.
5 y9 v6 D5 g3 R6 i% M8 C9 Z1) 确定乘积和不确定乘积
# K' Z9 p" u! u$ e命令格式: product(f,k);  
6 d6 O; O3 u& t! I' p2 p$ @, T$ Kproduct(f,k=m..n);  7 g0 K* f1 V" ~  X" Z( H6 _
product(f,k=alpha); / `8 m) f5 j! B8 N6 H
product(f,k=expr);& L& w4 c! Z: [; P0 ~- |
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
6 G( Y( w7 m; h! O- Z> product(k^2,k=1..10);   #计算 关于1..10的连乘4 D/ \2 V& V. W; `
% C3 p4 D8 R. U$ D& ]* V* N% b* T
> product(k^2,k);         #计算 的不确定乘积" O: s# L+ T5 I1 V: y. [0 i% e6 ~/ {  Z

2 v4 x# z% V' t8 w. Z> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘
  H- R/ f  x2 C* [: p  E8 ?
" |) a9 ]+ ^$ s3 B# k* k( [: r! e> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘6 G  e# n4 i. A0 z# G

" c' p4 b3 O( \( M: z> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式" a0 f; ?( n7 Z$ b# ^7 J( Z. q9 _
3 U( T/ r9 H+ p& f- d  y6 c5 u
> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积% u. y: D; O, q* s" ^

) L  R2 m" j6 l0 \0 R9 l0 f0 ~9 y    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
$ S$ f6 }; t% Y+ p: y> product(x+k,k=0..n-1);" y$ N5 V* b/ X* m8 p" ?1 L

  U( D. z: m2 `" `9 `如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   
; k% c6 m5 g7 S6 P  R! R. Z; N> mul(x+k,k=0..3);
9 w1 U1 \5 _# C. q1 Q0 `& d/ y
  v; e4 l, p: K( J& D2)指数函数0 t- c& x% T3 e
计算指数函数exp关于x的表达式的命令格式为: exp(x);
' M' N" A) e7 [; i3 {& |> exp(1);
/ i! m  ]% \- t3 L) H
! s6 D, B" e  {; Y  s8 \8 D5 k3 J> evalf(%);. D7 r4 v1 W5 `6 i% j1 P: |

0 y  |; D+ G( ]8 [7 b+ p> exp(1.29+2*I);7 |% l' Q+ S6 y* Q

( r/ x: L1 j! L> evalc(exp(x+I*y));
7 \/ c% R& v% w: o$ A  u8 S2 S) Y : D2 D" d$ h4 F7 e" {. K
3)确定求和与不确定求和sum
1 o  v' p8 m5 l命令格式: sum(f,k);  
0 a+ w- t8 E. c2 Qsum(f,k=m..n);  ! M7 o6 `( J$ A0 x2 y' J8 N; n
sum(f,k=alpha); 4 O! {$ I3 H8 Z: \- W
sum(f,k=expr);& G+ f" h' G4 H5 X! o
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式. ( K. ~: s% j. s3 H) x
> Sum(k^2,k=1..n)=sum(k^2,k=1..n);
0 k3 d6 _  Y% r: d8 Z & p# X* g5 k9 D7 N7 |& {
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);5 U8 s* X0 x2 W( a. |

3 l4 U' a% U1 L' a$ B3 A2 U> Sum(k^4,k=1..n)=sum(k^4,k=1..n);8 b  r+ g3 H" l+ N: ^: E

* D! a# l& U6 H> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);
/ |, k1 w! f" e" P . W4 L7 u/ x* B: N2 F; }
> sum(a[k]*x[k],k=0..n);
2 C( ~0 W9 v: }* F4 |' h / C" X  m  _! [: Z6 y  J7 i
> Sum(k/(k+1),k)=sum(k/(k+1),k);  Y' m8 H; K! x0 p0 r4 d) g7 g

; D" A; |% m6 S/ y> sum(k/(k+1),k=RootOf(x^2-3));
( g1 a% ^5 Z+ F
" Q( a; P5 M: r% e: w' A* lsum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的. 0 q8 U! O0 G7 U; g: G
> Sum('k','k'=0..n)=sum('k','k'=0..n);
: V( S# T& D( m0 a; K 7 _$ b4 }8 N! S+ N8 h0 \
如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   ) y6 B( m9 _" Z/ L
> add(k,k=1..100);
( Z$ F- a( S- S5 j
+ b7 L% D$ ~+ ], T尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令. / v$ H1 c4 K9 f7 L* Y
另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性. ( l5 Z" ^) L( N5 F' B" X1 \# j
3)三角函数/双曲函数
8 N9 U+ N# @3 t8 \命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);$ I9 V1 }" D  j
          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);
, V. w. _2 m: r" U& r2 Z/ g其中, x为任意表达式. 2 V, O$ m) B7 ]! G( @
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.4 E. B) D. q$ _  G, K# I
> Sin(Pi)=sin(Pi);5 W8 |/ D- ]* x/ c& a

" D7 v- s- E5 c; h0 C> coth(1.9+2.1*I);
! f4 q& k# M2 }) q+ ^3 R , i9 m5 L  F0 \
> expand(sin(x+y));     #展开表达式
+ n) G8 Z5 P1 [5 I( \
0 m: R4 u4 }5 {: |> combine(%);        #合并表达式9 p6 M/ b3 A# D: a6 K* ~
$ M' }# B; D5 l. n$ j( B, l
> convert(sin(7*Pi/60),'radical');
) V/ V+ [  I7 f6 n 3 n0 w6 s5 Z9 h6 o
> evalf(%);  i: E+ N, O8 }' f
) T' m8 H3 k9 s6 j$ d
但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.
3 s( d& t) D3 b. W0 V/ I$ P4 [4)反三角函数/反双曲函数/ F' m9 @8 p- v' Q4 \. C
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);: R" i' G: p. B$ i! L1 l
     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   4 W1 a; ?4 w) ^. }2 V3 i- ~  c
arctan(y,x);/ a' p: `+ s  |) I4 t. C
其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算.
9 ~8 x* K$ {1 e0 M9 D. w算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin., R- |3 Y) M  W; L! x, o  i
> arcsinh(1);
2 T8 i' ]! {5 r1 g* u  I& O : N4 y3 r9 c, }/ r% C+ R
> cos(arcsin(x));1 ]# G4 c5 G% z# b: l! r5 b

0 A7 o& k, S( x> arcsin(1.9+2.1*I);% v6 Z9 o% b, U

. ?/ X3 w- ^7 n. b  p0 ]5)对数函数
. T( ~2 E5 a" ]  ~命令格式: ln(x);           #自然对数/ m! N, V* l3 V5 e, B& E
log[a](x);        #一般对数- x; o5 M8 y  F8 {5 g3 L
log10(x);        #常用对数
9 k( i* H8 y: L0 m- U" F一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   
( w+ D7 A( S( v& a. t7 f  ?9 P* \  (其中,  )
1 B" J0 _% h# J- S6 ]5 V' [> ln(2002.0);* t+ P- O) k$ d0 B7 a' a; a
; `# b9 V" H" F( ~% l" T
> ln(3+4*I);
2 v3 q" H" _* }
2 ]8 R! _5 p! x1 u- X2 G" G: e> evalc(%);    # 求出上式的实部、虚部
9 I# [( e5 p% A* f4 Q' U
1 @0 E" c, C4 L/ U> log10(1000000);
, N$ n4 y" J3 h
) e  B% k, p$ X. q> simplify(%);   #化简上式/ X& P1 N$ ^+ X$ g) E
6 i3 q8 I) j! i$ J+ w# e
2.2.2 函数的定义
6 k5 i7 R+ L* W% |Maple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   
7 D; F3 \4 s) Z9 k1 s2 e> f(x):=a*x^2+b*x+c;, F' k0 y& S6 j

: i/ }. h/ n$ v  K3 I" J可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   
0 p+ j8 h4 f& b) M  W> f(x),f(0),f(1/a);/ r0 p0 F  r0 r: v! s
( }+ h; b6 |. s; }2 j5 C
由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   
7 b  X7 g  I$ |# @  P3 _> print(f);( j& O$ z: |- B* n$ J* P/ t7 T

/ z" G9 Y" ~, Z* D( y6 P# X事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. # y! m" @- B; a$ w$ a  T6 v3 t
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   
+ C2 K% \$ t. C) G: [% [& M> f:=x->a*x^2+b*x+c;* R; X' @9 b, Q8 H
- @- j6 r0 ^6 |" L7 {$ P4 `
> f(x),f(0),f(1/a);
) Q+ k3 r8 J. W5 S) x% E/ N8 M 5 _+ K) P8 w: c4 @
多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”).
2 X7 G9 q0 v/ ~9 Y> f:=(x,y)->x^2+y^2;! I4 W' M. u4 y
6 t! i. Z1 F8 V" j
> f(1,2);
2 p: x# V- V$ P( h2 _
  V+ M% }2 t8 o; B7 f> f:=(x,y)->a*x*y*exp(x^2+y^2);
2 ^) a& |6 }  J/ s9 ] ) f* q  q' w! L' ^9 q
综上所述, 箭头操作符定义函数的方式一般为:   , c) ?4 @( t9 D
一元函数: 参数->函数表达式
# \8 C. P" f. X" }# j  d多多函数: (参数序列)->函数表达式
1 _4 z. o" w, X, y* r4 t$ n/ u无参数函数也许不好理解, 但可以用来定义常函数:   2 z1 ?" T  A! ~0 t4 P0 G
> E:=()->exp(1);
& X& S+ J- ]- E ' h+ r. Y) J3 X
> E();& P% I  h. P" ~
& P. r( f, m" ^5 k
> E(x);
* `. v% p& }. \  Z) E 5 J* W; z- {, Y* i6 @  m: {
另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数. 1 [; N8 I3 k  ~" v! Q
定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);         
3 E! @: ^4 J  ?定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     8 q+ v+ C% `0 _" L1 ~7 ^
> f:=unapply(x^4+x^3+x^2+x+1,x);/ ~8 a6 j( q9 ]# O/ A8 n
( C* j  G- ]- n, W$ ~4 o# y% t
> f(4);
0 e4 f  F2 ^8 }0 d3 z  S
; ?* a* w) J2 }& B( b5 V! `2 Y) j> f:=unapply(x*y/(x^2+y^2),x,y);; d, F% ~4 O. s* Z' ^

* `* N) Q. `2 n( l3 z6 b7 C> f(1,1);# F4 M# ]1 b: z7 [

4 d4 K, [2 W/ r借助函数piecewise可以生成简单分段函数:* D2 z- f7 i1 D4 ^6 H, A
> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);( t  u' d% J6 a- K1 f
; _. b: ?: }; D1 C* z+ p7 Z
清除函数的定义用命令unassign. 1 h9 W1 U+ A3 }$ W2 w
> unassign(f);
# e5 g9 }0 r3 j* j% J. i7 h> f(1,1);) e" R7 `* R5 x. n( g3 E( W, v4 w: G

( x/ b0 A! V" B  l+ j* p除此之外, 还可以通过程序设计方式定义函数(参见第6章). & C1 S) l7 N, K1 e* x( e: g& J% u" j
定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:
$ O! e/ S: R: ]; Top(expr);         
! ?1 U& f$ s0 a+ Dop(i, expr);         
4 |4 T  P# {2 w- |2 K1 Pop(i .. j, expr);      : o, V& L8 L" {" V  O) t; @
nops(expr);
$ x1 f- u1 o2 d0 l8 Z2 ^4 m" J+ M如果函数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的类型.
6 V* X: X9 U4 H命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.1 u! N4 \8 J& I# k( S, _
命令op(expr); 等价于op(1..nops(expr), expr);
. ~/ @2 O* }0 K# q9 v特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...)); 2 Y( P7 Y5 c6 U
而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
$ ]  R9 |, x" A/ z* i> expr:=6+cos(x)+sin(x)*cos(x)^2;
/ ^5 e4 |7 U. m# e ( b9 a2 B& s- T: Z3 J  Z& s; k
> op(expr);. d1 z7 _* J* W8 [
0 p+ y  m$ ]7 o9 ~8 C* a! l' Q3 y
> nops(expr);
. E% E' E3 b* |  T: a/ }; ?! Z# p0 ]
# L* b) N2 C6 e' @1 Z& \# i. t> p:=x^2*y+3*x^3*z+2;
3 g8 u4 Q& Q& Y, c 6 S* P  j. m1 o( ~
> op(1,p);  Z5 q5 a0 @- x. `8 ^8 u2 @' q. \! K

! v9 R8 U; V5 q1 Y& i> op(1..nops(p),p);! n. X2 S. U4 l! G
9 h# b. `3 G! c* }
> op(op(2,p));% d" }! k( n! b0 L' e
$ [( S' I- d0 X: @  j$ X; }
> u:=[1,4,9];
" K. n6 L/ W% n( ^9 T/ m
5 O8 I- X& j7 b> op(0,u);) }# v/ `' g3 O7 y2 k( I; d# n+ s3 \

1 U) }9 I9 S6 \7 [> s:=series(sin(x),x=1,3);
' t6 N: u" V' B- ]' n ( y) i- c: t4 i
> op(0,s);
- r: j; U/ q( {. e6 s        
; M! w3 P: C. [> nops(s);+ \; w2 J1 }$ \
$ K9 ?; |3 B+ b
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:5 v# K7 a# p, o% b
> op(x*y*z);
! p7 I$ q/ K( N( R
* y+ `0 ~+ i( D1 y9 H> op(x*y*z+1);" d  R7 t0 o- y1 q5 _
3 M! R( A8 X9 G6 d9 q
2.2.3 Maple中的常量与变量名
5 ?4 B# o) B0 Z为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   # X2 h! o2 I1 r' d: T4 i% K
> constants;# a0 D8 i6 l0 f6 U) n( G

2 p4 y1 s# k9 {0 i" E- R, N8 X( I为了方便使用, 现将上述常数的具体含义列示如下:   : X. `# S% ^9 f& v; |4 [3 u
常    数        名 称        近似值, V+ u$ s: X  A, `
圆周率
8 z5 r0 r) s4 O7 K) i' f9 ~Pi        3.14159265359 X/ S; T9 K/ S; n1 J
Catalan常数
7 S, `, [! ^" {+ N; ZCatalan        0.9159655942; I+ X; A4 B. k, x- v; u
Euler-Mascheroni常数
+ E% `$ @1 m+ U4 Zgamma        0.5772156649
5 [& B9 l2 q9 [ ( x, d& g9 B( z
infinity        3 T. V8 S. q% e' ?' S" U

$ v3 p" B8 ^8 d1 D需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取.
* \% f" e5 j; t! P1 Z在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”. ) ?  I" W; G% X* ?
值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. 2 T5 I6 Q+ _+ `) `8 L5 F" [
在Maple中有一些保留字不可以被用作变量名:   ( L# o* `  e0 W  T
by      do      done     elif     else     end        fi        for      & E) R1 y( s6 z( H0 }6 Q
from    if       in       local     od     option    options     proc         
5 V! ~- k6 Q6 v, {# J5 o' xquit    read     save     stop     then     to        while      D  G3 B% U( X& }: i
Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名.
  @! E% H, o& a' n0 Y# Q, c- k另外一个值得注意的是在Maple中三种类型引号的不同作用:   / S* K1 K8 C8 x0 q
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;    8 K2 f* V3 _( G% m9 M
'  ':   界定一个暂时不求值的表达式;    ' p7 [1 I" K! }) m5 [
"  ":   界定一个字符串, 它不能被赋值. 5 K  g' U1 l& C% `: m  g3 t' d' n
2.2.4 函数类型转换             g! K! |( }( `; q. z9 v& g! o: O  H, q% H
函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  
  u3 I  c+ i% u, v6 c) b  V8 [    convert(expr, form);        #把数学式expr转换成form的形式* |# l+ u$ Y; L" h+ g
convert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos, a; j) `9 x3 {  ~
convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   ; l1 k7 H& i* O, R4 r0 O
(1) exp: 将三角函数转换成指数
# [, L( A- r& c9 m- v(2) expln: 把数学式转换成指数与对数* [/ v9 n5 o2 ~% {3 m' Z" n- x4 }
(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式/ r/ l7 d% @" N, z+ u
(4) ln: 将反三角函数转换成对数
: s. v% u1 b& j2 C) l0 R(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式
4 Q1 L) e3 r! Q5 ?0 P& t(6) tan: 将三角函数转换成tan的形式$ h! S6 z$ t, Q" d* l$ U) ]% h
(7) trig: 将指数函数转换成三角函数与对数函数9 C9 K3 z% x" Z* `" ]& Y8 u6 |, _% u  a
> convert(sinh(x),exp);   #将sinh(x)转换成exp类型
! \& `! [' N; h& h4 z- m , J- @; E- Z1 `; d+ g  x
> convert(cos(x)*sinh(y),exp);
9 Q8 @1 d! a, `+ @% k: s) w  P
4 p: }3 \8 e! a# J% F& t> convert(cos(x)*sinh(y),exp,y);
' Q0 @  Z; a5 ^ & G" w8 B/ {" n2 D6 _1 V
> convert(exp(x)*exp(x^(-2)),trig);
, M: w* Y3 c7 O, W4 F) Z) \( K
) j- t6 n  e$ e4 p$ w2 ~9 Q$ G( B> convert(arcsinh(x)*cos(x),expln);' q% Y: e3 M" u4 k6 h, \, @$ z9 K

# H/ w# ^3 ~3 \7 [+ b, j2 _. C> convert(cot(x)+sinh(x),expsincos);( v8 e* b& O8 O6 D, O: ?% W

  o: A0 K6 P! q) b- z6 ~4 q/ C> convert(arctanh(x),ln);; {3 d  s9 b- {5 E9 i# N

, y9 G9 @2 S' u4 ?' Xconvert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   5 v" O2 v$ J7 L5 w
> with(codegen):+ i8 y: C) w8 r
> p:=4*x^4+3*x^3+2*x^2-x;
0 k  \: T5 i, ?4 r
5 x( \$ M% d+ W8 \2 k7 {5 d0 ^> cost(p);
, i3 j1 B+ |5 P% x. Q& r) d; P
& |, A; f) `3 E2 l1 n" o$ |> convert(p,'horner');  #将展开的表达式转换成嵌套形式7 {' \9 h- Q7 D. A0 A) x

6 {% J6 a" A9 N9 C$ s> cost(%);
# I0 I8 O& \) ]: `: Z: ]9 Z
$ h! r! u3 b8 l同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量. * ?6 C/ \' ?* t4 }; K
> (1+x+x^2+x^3)/p;
" C" y; Z4 m6 t7 Q 4 k9 N8 }7 @, o" B6 Z
> cost(%);
" ~+ A7 F: d' C1 X5 d, O * j( ^+ e5 X6 @. k, Q  \
> convert(%%,'confrac',x);
' Y0 g- f" i. _7 l9 N  u : K- _1 G- Y2 w* [9 G9 v
> cost(%);
! y5 [* V6 K/ w8 X5 V! K9 }
- r5 M% |0 h; B8 K) n1 j- ^在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式.
3 D4 [1 J+ |+ u> convert(%%, 'parfrac',x);5 _$ C$ d9 H5 s8 T1 l$ ?' Z

1 D/ F$ z  x) Z9 {> cost(%);
* y! g* T6 `* R1 g$ r, S0 B# p6 g 9 m2 ^+ f" f. Q
而把分数转换成连分数的方法为:# [2 K5 q) a+ Z: P+ J# t" o
> with(numtheory):
$ T( c/ W, G* G# C> cfrac(339/284);/ u- V% |  E8 d( _# ]- A
& `1 Y3 G0 X& G5 f% p
2.2.5 函数的映射—map指令
/ b: H' `4 d6 X9 P+ v7 i在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:: }2 D  _6 A6 N4 M+ Z3 d
map(f, expr);      #将函数f映射到expr的每个操作数
) i' J; B# P) W0 L: xmap(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量" v% `$ C4 S7 n9 P7 r% w' g
map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量
. {5 F5 e' w8 \1 Wmap2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为
! [* E$ n& z+ z第3个自变量…, an为第n+1个自变量来映射函数f; O# N  `; t) J6 ]$ C
> map(f,x1+x2+x3+x4,a1,a2,a3,a4);
& I0 p( r# B8 A
4 r* L. f$ |0 z/ F- ~7 Z$ I  K> f:=x->sqrt(x)+x^2;
& f; C. w7 `' F' x% P" ]
  p# S, u. s! q- V# R> map(f,[a,b,c]);3 O- q2 x+ I# U/ U' \% Y5 l

/ I1 g% I- h# C> map(h, [a,b,c],x,y); 3 L2 J0 i* N( T0 h

% i# F* u3 `) |* N$ R# Q/ D% X/ j> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);
; S8 ~. Q6 Q& P+ E+ Z/ |+ _
& g4 B8 Q) d& o" V6 Q> map(x->convert(x,exp),[sin(x),cos(x)]);: v% Q5 n% L8 r# E0 Y% @7 N( e4 {
. Z3 i( l3 r9 g3 C2 V2 H5 d
上式的映射关系可通过下式理解:/ i* p3 l/ R' {' E
> [convert(sin(x),exp),convert(cos(x),exp)];) F0 q% \+ K9 I; w, G

! z# H6 H  W5 S2 E) P& ?1 |$ T2 w> restart:
" P; N% V$ I( s4 G$ V4 a: c5 r5 N! \map2(f,a1,x1+x2+x3+x4,a2,a3,a4);6 m8 r2 w# P5 a7 X% F* U9 j
( q1 }9 }& ?8 \& t
> map2(max,k,[a,b,c,d]); 2 D9 l8 ]' _5 s6 B
6 s2 m- H% \" h* O7 v
再看下面示例:   0 x) @( C" m2 m) O( _5 Y
> L:=[seq(i,i=1..10)];
6 y. o. k1 H8 M 4 Q; e8 I: n. {& [8 G2 l2 `- ~
> nops(L);0 g2 B+ Z% N( y& d; e9 q

% y  G! w; t' X- d) e5 T/ T, F> sqr:=(x)->x^2;
. ]; K9 j! I( i+ U) s! n 7 ^1 x) P# J3 C$ L# [4 ]
> map(sqr,L);
9 `$ o% [8 A0 u # [: A5 d3 C8 K& r6 B
> map((x)->x+1,L);) T: g( k0 B) o5 f  Q
. J* _! ?; Y1 s/ }( f
> map(f,L);& e6 _( Q. i1 A  w: X' S+ F2 X
& S* ?, J* N  V- A; Q. ]& z  k
> map(f,{a,b,c});+ F; n3 F- h  i3 v
$ U+ Y8 g! M* w$ H+ q5 F2 o
> map(sqr,x+y*z);! R) }) O/ C; p4 o  y$ f

5 F, q/ n: Q1 M# C  y> M:=linalg[matrix](3,3,(i,j)->i+j);
* [# V. c+ X& O, ?) G
* C7 \! r2 E0 ?2 W> map((x)->1/x,M);
* I3 K2 g9 ~" ^/ g
+ A, T, l! {6 s. h, T2 s6 c3 求 值  M# F! A7 Y. b; c$ [& w
3.1 赋值
$ v" W" E) f6 p8 J9 X* B在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. & i; V4 G4 x6 a2 o! q8 V- z
> p:=9*x^3-37*x^2+47*x-19;
) ], i% g5 S; Z' F% r8 [
5 P  W8 g9 z; G6 v> roots(p);
1 d! Q% C2 C1 B% |4 N: V
* y) d& n. U5 j( n0 B3 e1 ~; y* _> subs(x=19/9,p);9 @; J9 }! H" H. B: |

4 u  B# Y4 @' \& N在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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 J! K' r' m3 F1 S. Z  l
3.2 变量代换
7 c$ L$ ?' x" ?, D: J( W: R5 P在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   7 ?3 D  f$ Q" L# M- d
subs ( var = repacedment, expression);5 K' ~& B2 o& Z* K2 G, W
调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement. 6 s/ D; b- G* p  G6 R
> f:=x^2+exp(x^3)-8;( E9 b7 T; E) v8 Q# D& D
. H2 g; p% {# Z+ Y$ o* Q: E
> subs(x=1,f);7 e8 }. `3 A' {- O: A. C$ U7 w5 L

& ]' g1 ]9 B3 f1 c> subs(x=0,cos(x)*(sin(x)+x^2+5));0 z7 R+ s: a  H1 }; @4 m! H6 r8 O

. g8 B; H2 s& a) v5 Z2 A$ F8 X, ]' W    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   ( }, O3 `+ s2 N  r, J/ s/ p
> evalf(%);
$ C% ~" U6 H1 R3 l/ y
5 i" `* }( L2 N! e) p变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   2 S6 g( Y4 V0 O
subs (var1 = repacedment1, var2 = repacedment2, expression)5 S! i' K- P" m9 `$ W
调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   : |: M; v5 i- h, {
subs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
, Z; H  X; O: U. e7 B& n下面通过例子说明这几种形式的替换.
. w6 T* \2 I' z6 w/ z> subs(x=y,y=z,x^2*y);              (顺序替换)2 M. L% D: X: R6 u
: k( o4 [; e0 \$ p% j: D
> subs({x=y,y=z},x^2*y);            (同步替换)& F4 w" `! G' b: w$ F5 x

) v/ `+ x) ]( n, }2 A& O> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)
' i! ]2 a9 t; x; ~7 c5 \$ d , h8 p! ^$ }8 S9 }- K% S
> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)5 [) R* g! Z6 `9 y$ i

0 G! b" \5 [* \4 H  h+ m# |) A> subs({p=q,q=p},f(p,q));             (互  换)
& k8 q$ z% y' u, a7 z5 [  c
0 O- s# `+ Q/ h, y, [3.3 假设机制
; _! f) J- ~* r9 R! e7 ?Maple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.
7 k( G1 `* w+ p) p; O* l* ^在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);
  S$ c% @) F1 S$ E1 ?" Y# l函数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);”也不会产生矛盾.
5 V$ O/ U7 v: v# }> Int(exp(-s*t),t=0..infinity);
% k8 I0 \  r+ y+ D : n1 O" K: I: N, \
> value(%);
: C: x# m* Q" n$ a4 EDefinite integration: Can't determine if the integral is convergent.
  R9 _$ h" f. n' Q8 F  pNeed to know the sign of --> s% p6 b( {) O2 _: H
Will now try indefinite integration and then take limits.; @: r) p$ L) C. a/ X% L6 S

' I, ^3 l! L5 M( v. t> assume(s>0);
/ K# s, ~+ L# W8 s8 u> Int(exp(-s*t),t=0..infinity);% x2 u0 D) W, k0 {9 `$ X  p' [/ y+ M

$ q% A. f& u# Y/ x( J9 P> value(%);1 T+ p: Y* l4 ?7 R* ?
1 p3 C/ ]9 \* R* y
3.4 求值规则# F3 w" m+ s3 D- G, D" w" W
在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
. }4 X' G3 S: {/ q> x:=y;
7 s( E/ y; p! c , j: K! c. r. K# J9 c- |" w  _
> y:=z;/ m2 M+ ]/ R8 [/ z. \

3 ]# d5 V6 A/ |8 Q> z:=3;
) p. |  d) k, {$ b% [( l2 S + E  r5 S; q2 f" A) P
> x;5 }5 {: H5 z! C8 p/ [5 C$ ?7 y
/ x; R& ?6 T' s' t7 T0 V
> y;* i3 V0 x" g( e" |& q$ h$ c

. H  @8 L6 a6 K( m% T1 s& b0 F; e> x:='x';; C2 ~" L0 f( d7 Z3 o
  C, q' S/ c* S: u- G" B
> x;
" g2 K, B$ y; S$ w. H ) l* `8 A3 ?* \. y, @. G' {3 w
> y;0 @* K7 L# r% J1 x- a

2 m" j6 q9 w" f对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   
* ~/ S- J6 u# ^1) 对表达式求值4 ]% t  x% \0 E
命令格式: eval(e, x=a);  #求表达式e在x=a处的值# X7 _8 E* R7 o5 }2 R4 d9 n
             eval(e, eqns); #对方程或方程组eqns求值
2 I* I  U& T, d* B3 l* b" H             eval(e);      #表达式e求值到上面两层
' t  z: G& B( [1 v  b             eval(x,n);    #给出求值名称的第n层求值
; x; v$ E/ g/ @( k$ Z$ x/ x+ S> p:=x^5+x^4+x^3+x^2+x+73;% I% g( ~# m3 ?
6 P% V/ X4 ]  H+ x1 R
> eval(p,x=7);
) D% _7 e% i/ l! z" t' ^5 _" b* _
. @8 L9 l- j% M7 a/ b( l> P:=exp(y)+x*y+exp(x);5 B) z  T+ |0 n* b5 R8 H$ q4 W
* b( F0 ~0 z8 W7 h0 T( L
> eval(P,[x=2,y=3]);+ |) ]4 |( |1 b  |8 [
2 o) }, y/ T% f
    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   9 p8 G) B3 o- k+ k( [+ a
> eval(sin(x)/x,x=0);
- e. c0 w. l+ d  d* AError, numeric exception: division by zero
# g3 t8 l  ]2 O3 l9 m9 u$ x    下面再看使用eval进行全层求值或者对名称几层求值的示例:   0 R/ f. o- Y8 g: ^5 @
> a:=b: b:=c: c:=x+1:
5 ]8 T  M( w, v7 g" C> a;              #默认的全层递归求值: r! _* I4 z5 o

' m$ a+ d+ N; Y" q8 [! Z> eval(a);        #强制全层递归求值2 B7 ^, c- s5 b0 m  c  u
5 P$ k# ^' t% Z  T: \
> eval(a,1);       #对a一层求值" M" c0 M( j# C  n- n
0 {# V& r) `. ?! Y2 l- d2 U- Q* Q
> eval(a,2);       #对a二层求值
: i3 p: A+ P+ r$ ? & ~; O+ h3 U( T1 L
> eval(a,3);       #对a三层求值
! \1 G0 H8 k; x) S  g; v 9 R! v2 R- ~) I8 X
> eval(a,4);       #对a四层求值
) ~$ H* h, T  T- C3 E 2 o& z0 {$ V. B/ `
    2) 在代数数(或者函数)域求值2 t2 O7 A1 d/ H# u! w
命令格式: evala(expr);       # 对表达式或者未求值函数求值
8 \$ L3 c+ q. i) F$ U8 k             evala(expr,opts);   #求值时可加选项(opts); U7 t7 i) i) `3 C2 G
所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式.
% F- h1 b/ d' _. [# X代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   * N+ J) s7 X1 W' j$ q& j
> alpha:=RootOf(x^2-3,x);* M. H5 d$ d6 J% C1 N3 ~
9 X( E- K5 W& |) I7 u! t
> simplify(alpha^2);
- F) i! A8 n1 k- o  X $ S4 [4 R, j/ c0 J5 G
在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:
$ \, Y( o2 n8 R+ q% c( L6 i5 ?> alias(alpha=RootOf(x^2-2)):, Y( p3 I8 Y+ r  m- g
> evala(factor(x^2-2,alpha),lenstra);/ O5 g8 m6 A& X/ [
0 V1 o8 R- w; I4 [
> evala(quo(x^2-x+3,x-alpha,x,'r'));
( T. C  {2 z; n& n# w" d8 h 7 g9 X* D+ X7 _) Q
> r;
5 c% C$ G& x6 s7 D
& g7 u' k) B3 v% k' i, h2 W1 s4 C> simplify(%);
6 y' D% _, i  u ) h5 K6 ~) y2 J0 S
3) 在复数域上符号求值% P9 }* x. S7 Z& k+ Y- c. Z
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:
" \# @8 W' E1 t) r8 Oevalc(expr);   
7 I# N4 a8 D& _- c* T! Yevalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2.
4 |# ]! k& a" ]; R" E; c4 h> evalc(sin(6+8*I));
5 v! ~( B2 b6 `/ ~7 }3 w$ Y; }
" A/ A; s. U7 G! L# {7 a3 Y> evalc(f(exp(alpha+x*I)));
! O# @3 q$ \0 D& \! l: E% ?% p2 H
0 v% I: Q- B! ^' G8 t3 f. g> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));# _8 w) ^) x7 }
  Z3 x( O: P1 R
4) 使用浮点算法求值
- f% z; n% c2 V7 s0 y浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     9 P1 R6 u3 Z  g+ f% V8 j
> evalf(Pi,50);   
) C, _+ R* N/ @: r ' I( g/ }3 n- m
> evalf(sin(3+4*I));   
' B# ?1 T0 M& h " u! K4 a2 ~, c3 _4 [
> evalf(int(sin(x)/x,x=0..1),20);
* w( i% r/ V) F& S5 @9 }4 p0 ^
) q4 C% g/ Y& B' C5) 对惰性函数求值* ?0 ^" L. O% H7 `4 P" G  ?) Z0 V8 K
把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   # f- H- B! _4 d, r5 _7 {
> F:=Int(exp(x),x);- D- n$ f$ m$ b. m' z& a: N$ K

" J8 L1 j$ Q! |: Y> value(%);7 F3 J+ o; `, R$ I
; i, D- i0 S4 k  b
> f:=Limit(sin(x)/x,x=0);
5 a5 w2 ~0 o: m0 v 0 a; U" f0 r) Z0 V) d  I2 Y; q
> value(%);
) t+ R- e) u- L0 e; @# m 3 T# G' a$ w% w  W$ W3 O- V6 g
另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   
+ F3 j! w, j+ L2 C0 h& K> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
* v1 i! h0 K3 `* _8 F+ c) r( C: V0 m0 O
( G+ x* M; }9 S# v5 W8 y4 数据结构
6 g; m- i$ X+ Q/ R2 t, d! _Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表.
) N& L# a$ o6 N, p6 \2 O4.1 数据类型查询
4 V/ K# R4 X8 G0 f: h在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
1 G/ [. f. |8 f* }8 _2 y, c4 |0 nwhattype(expr)        # 查询expr的数据类型( P+ t5 M7 U7 v
type(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false
1 i: v4 Q' I- B! j, z7 n: ~/ E: `0 v> whattype(12);
8 h6 \& f1 [; x! U$ h, F
9 V$ L  P) u' [  j* g& V) a> whattype(Pi);
* G+ W& K& c% ]4 ^  c" i7 \ 8 e+ C7 h& X6 h2 h
> type(1.1,fraction);& W% X. N- D" Q
: |" `$ T6 f4 b% ]# {, b
> whattype(1.1);
: H2 W$ g- b9 ^6 I0 ]0 s : F3 I" B# C$ k& q/ q  G
4.2 序列, 列表和集合
' I2 d* \: o& G) K4.2.1 序列( v+ W! @8 e) W2 \0 r6 p  X
所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
; N" O* y) W# q$ E, t) v4 N8 f, B2 M9 A> s:=1,4,9,16,25;' ]  b- E' ?8 h2 o

8 @8 a% `& ]! w  r4 B> t:=sin,com,tan,cot;. ~, b# j2 ~" x$ H) I
7 [# z& d+ c" y8 n& L5 n6 ~; j9 j
一个序列也可以由若干个序列复合而成, 如:   
0 `$ g+ g) o. p9 i7 D> s:=1,(4,9,16),25;( w, j0 Y2 s  j

& G& `& x4 m' B> s,s;
+ B/ T  \: }* P' W9 w% b; n : X$ E, M: T& F; a: u7 K
而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   6 m& y& e* m8 }' B: V4 Y
> max(s);
/ s/ e4 q7 M3 x  G+ r
0 x8 m$ j' H! t& J, z> min(s,0,s);+ ^1 R% z, l" [- \; F8 k

1 I/ j8 W6 B7 W6 }0 f4 [值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中. 6 X$ @0 i, E- \& |7 Y6 A
> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;
8 ^7 W- m5 u. `: F3 k4 n+ T9 [ ! Z: `  C$ e; N2 a/ K+ p+ M
> op(s);: |) j* u9 s& ~1 L4 u
Error, wrong number (or type) of parameters in function op
- z; p* |5 K& h& h. \4 `1 K/ g2 J# l> nops(s);
# M- X% T" {1 L/ z& VError, wrong number (or type) of parameters in function nops
" h  ~: F4 \, q# J0 R> op([s]);
. F. z4 ?" i5 |; h5 R ) E9 ]+ O% }' m& D% @% [
> nops([stuff]);0 f3 B  `4 H9 |
# ^4 c7 }  t; ^3 Z- ^9 n
函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   : v3 n0 [- A) a
seq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)
+ Z$ I, _$ y. p% r/ d: kseq(f(i), i=expr);  # 生成一个f映射expr操作数的序列
* f0 P8 j! }/ o/ c4 `7 r% M1 sseq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列$ o2 e( }1 N2 Q4 V& T8 b
> seq(i^2,i=1..10);) x- I; C' ]* L

" E+ C& O* c. A: g( }> seq(ithprime(i),i=1..20);
' `, B0 l# S, ] " Q7 q  `& k1 [& D4 x* h
> seq(i^3,i=x+y+z);" C4 x& [8 r; R

9 X* ?( X' e0 \2 r0 m7 [# `$ C& a3 W> seq(D(f),f=[sin,cos,tan,cot]);
3 H& l) ?, i$ U0 ~- K9 H ) z% ?. G1 v! A+ q' g
> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));
9 o6 x$ z7 p' G7 o( Q
  M8 M' F: n# }+ \9 Y( y; P4 b- z' q获得一个序列中的特定元素选用操作符[  ], 如:   - c" d# G1 Y, ~
> seq(ithprime(i),i=1..20);
, @( m% \2 v! ]8 Y ( D+ o6 O1 U1 ?: ?1 B7 J% ~
> %[6],%[17];( W( a6 M6 c/ e8 s( _9 p4 i

. D3 R" R" _, K4 p3 N1 y1 o% a4.2.2 列表+ g( J$ j- p6 i' Z( D# _/ |) y
列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   % E- \- Q6 G9 [. D: ~$ S2 i
> l:=[x,1,1-z,x];3 P4 j7 \# w, j( a& e
, `8 i# h- X% n1 H
> whattype(%);
$ O- s/ a, Z3 P, ~) e8 s3 A
- C; a9 R$ f, {" d* U1 S3 n8 ~空列表定义为[ ]. $ K# }9 D* s! N: X: {
但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   
. Y# R5 }2 C7 }4 n  I" z' d> L:=[1,2,3,4];
' e* J1 i" i/ s+ Q, L ( `5 F2 J( g* Q6 _( D( ?8 u$ z
> M:=[2,3,4,1];! q, y) H: I( f0 O" K( t5 h
2 M2 c7 d' p# J1 @. D2 H
4.2.3 集合& R  y* Z! a; c/ @. v
集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合. , C* {9 [5 F! P8 I( ?8 r
> s:={x,1,1-z,x};
* h/ E) X1 e2 t  y. p, @% Y . d, q( l) W' \
> whattype(%);
' B7 P- }; R2 v8 C" f8 N$ ?2 x. u 5 n9 z+ i! s. i3 K! b: a0 _' H7 m
空集定义为{ }. ) k3 x1 z4 _( E' E( u
函数nop返回列表或集合的元素数, 而op则可返回其第I个元素. ; [" I# z1 Z" R& @; }
> op(1,s);( b. H3 y' V* w3 Z' o7 e
/ G- W3 U3 L9 k: C: L( b3 b9 w* @) ?
> s[1];" |/ B' i1 H" L$ C  h9 `

5 T" b, M; G6 z( P( T6 B$ m> op(1..3,s);* j- O) o6 s/ r# A. h

; r' P& \2 J/ O; d& ~8 G> s[1..3];1 {: c+ o$ g2 I, d; B
  Z3 U* M3 L9 g% F. A
函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
. ^, I! h7 d  x) N> member(1+x,s);2 k; I# V+ |/ w

' H; T+ d0 V+ x8 H可以通过下述方法在列表中增减元素:   + H; I4 u* u" Y( c$ l2 y
> t:=[op(s),x];5 D7 y3 b/ m8 T" a
1 t: d9 b7 ?. I% l
> u:=[s[1..5],s[7..nops(s)]];' o* O+ Q6 N  K* l6 y7 ^( |1 F
! Y9 i$ C1 J8 a" Q0 ^( c* w; u) c
Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   
1 G2 N' J0 S: {! s7 i: @' F> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};
% c" R' Q# Z& v6 _3 I6 `+ i$ O( W
3 f" R4 p4 g5 @! p1 O/ K8 ~2 P
: K1 M  V* _% h. l, k# \> A intersect B; ( T  s* j. @6 d! y
/ M  \0 B( p- R2 B1 `; K
> A union B;
; B; ^% B7 f/ y' d
' v8 ?9 T. G6 B8 C' X> A minus B;
& X7 m  w7 j! H$ q8 k / h. K3 S; d- T. @, P; f* ~
4.3 数组和表
. ?: w' ]  t/ j! o在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令. . F8 `/ p( ~. J$ \7 W/ Q
    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的. / c3 l$ Z& `- D; H; j# I$ j) D
> A:=array(1..4);
. t+ B; [. u- D$ E, B8 `) T 8 l$ Y9 }/ p" N8 g" w1 _
> for i from 1 to 4 do A[i]:=i: od:: q1 Y) F' h4 b6 s" [
> eval(A);6 H! A. `; i* ]6 ]" T

: d$ F( h+ t7 Z' x  L7 l$ J> type(A,array);
! X5 ]' z1 x& ^. ?, Z1 B: W 0 [- U0 t& A# O7 m. r
> type(A,list);
# p, ~6 S3 i" S& W  z( [8 K5 M
: K- R4 D7 V- u, L  q( X, m> T:=table();
+ _9 }- z0 J, P
; B6 C* _( w' @8 f5 ^3 i7 [# I> T[1]:= 1;
4 N* _% a# l/ [ : [& B; E. |; C6 y0 J/ H1 j
> T[5]:= 5;, }& Y. y+ K' s5 ], y. z: K

+ A2 k. _4 C. K7 F  a> T[3]:= 3;" z; b4 D# a7 v
3 T5 p9 G1 G' Q4 S; s! A  I
> T[sam]:=sally;
9 A7 a3 l4 [8 r! \' x
& m8 ]$ \0 |' \6 K: p4 Y' @> T[Pi]:=exp(1);
; t0 h1 d% }4 w  p6 o6 r, \7 ] 1 I3 C( a) A6 |2 h+ f
> x:='x';% b+ ?% [  f8 @" @% q9 d3 i
  W5 m# c6 r( `0 t+ E
> T[(1+x+x^3)*sin(x)] := 0;9 e; b! B7 u! n+ U+ A

# z+ e  U  J! y> eval(T);  \5 \9 P5 e# b, z) k  o

; n  N3 r- K  V( r  p( L+ _; F> T[3]:='T[3]';* P9 Y' z5 T+ W# S$ d8 `! F

& c( _5 N+ c0 r' m4 F2 ~6 k# m  k8 x7 t> eval(T);
) ?( j7 |3 X9 P8 V4 A 3 O  K# B0 F; g; s3 L
4.4 其他数据结构
; D: W, V  J( R* L3 }串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. & U7 g* n7 @7 H# G' O. z/ c2 T, V
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立. # h" B- b! _) c) \8 ~; s
> x:=T[3];
. T' b5 K$ k" [9 V 9 L4 g3 P! v0 T+ R, D. V
> eval(T);
+ ~( `& A4 \/ S. n: k& ]% n4 |3 D 3 W2 P& T. A+ W
> T[5]:=y;2 p+ ?1 ^( s4 K  F/ t6 F
, y! l8 J# W1 y
> eval(T);
" o5 U* f0 A* k3 T7 I( H- j 4 o9 s+ D* n6 t2 t
由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     / c4 B% d( y8 X+ [" ~3 Z  s
数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数.
& b7 B5 K" H6 i7 E) k8 T4.5 数据类型转换和合并$ f2 `( D0 o& m$ t5 t( u, _
convert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   $ I2 g9 l+ ?% ^4 I/ Z3 \. O
> L:=[1,2,3,4];4 y# K/ `: P  R8 y3 G9 c0 z

" q& f5 }8 \2 D$ R* R' G> type(L,list);
- K; U5 \. e! Q' g: j% _1 Q% | ' r8 q1 {. D) q4 F( P
> A:=convert(L,array);
) z. ^$ E  u! A0 a5 P9 @6 P ( V% \% Z1 l& q
> type(A,list);
- J1 B( V- X8 y$ ] 2 {6 l6 M; M( k; w
> type(A,array);
* Q% U6 _  M3 S5 z# D# v9 Z1 @
, W$ H8 e- H/ M+ }" t另一个有用的函数zip则可把两个列表或向量合并:   $ ~! C& h& ]2 O" \' ]( B
>L:=[seq(i,i=1..10)];8 W5 `. F6 H4 Z1 A

+ ~& V) V! R* K; {5 I> Sqr:=(x)->x^2;
# P4 ?! b. f$ U/ U. i ) _1 |' A' f' g$ v8 g
> M:=map(sqr,L);# S- E0 k( a( I- F; K6 F
$ `9 ~. t# `6 O  \8 ^
> LM:=zip((x,y)->[x,y],L,M);
; e* c! B. C( i) F8 @7 H3 o* f 4 G" G# p( A- C4 y! t
> map(op,LM);
1 C) g8 i+ X# s
# ~+ y- b, |. m# J& K# d7 y5 Maple高级输入与输出操作# i5 \) {/ ]# `/ K+ A% u, C0 m' E& R
Maple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里. 8 A  }: c7 x) X& l
5.1 写入文件
0 l% g' G* n/ \% I  F" h5.1.1 将数值数据写入到一个文件
9 j  Q/ V( ]+ u7 h: N" e$ E" V1 E如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令.
3 D6 V3 w0 Q6 o/ i! N4 f若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);
4 V) r$ J4 J/ c* v$ E; ]  ^5 j> with(linalg):
8 g9 ]9 |4 X& Q( t# m$ \6 ?> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);
' w4 C3 m; Y% M
% s0 h) W9 Y: x- _& X> writedata("e:\\filename.txt",M);( W" f5 f3 @3 A- d
而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);
) w* n. a+ ^+ ]) c* {  J- g> W:=matrix(2,2,[1,2,3,4]);
$ b6 H5 \9 u3 S3 L( N1 C
; I  R/ @$ m6 P6 ^; n  P> writedata[APPEND]("e:\\filename.txt",W);
0 _* |# P9 O, ^. @7 l需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.$ ~' K0 \% @& [; ^# Z; I6 F: x
另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);8 J% R" y: q) q" l5 u: k3 z) m
> writedata[APPEND]("e:\\filename.txt",W); ( M) l/ Y' d& C) Y  A# ^
> writedata('terminal',M);
* T. y9 S) S  {% n- ?1                   2                   3           
( J& z; J& Z% B* q4                   5                   6           
3 u' j0 o. [7 z( ^7                   8                   9   
& d/ b6 \2 c2 u" j- {. M: m$ M, h5.1.2 将Maple语句写入一个文件6 ^4 E. j2 j3 g+ P2 e
如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:5 j: i( x2 f0 s9 v- E" g
save name, "filename";8 p: \+ n' D$ A3 W; [
save name1, name2, …, "filename";* N2 l4 n# t' W, `. C% T- c# o: v
若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.
' ?& ~, b4 X! Q5 ?$ v> myfunc:=(k,n)->sum(x^k/k!,x=1..n);
4 L2 `, ?. o% L& L. J" y2 q; U! S
1 v3 g* B9 B/ i4 m; V> myresult:=myfunc(6,8);8 P$ e; J# Z. t* z5 ?- c8 X- R

+ x: p# Z6 }( V( U> save myfunc,myresult,"e:\\test.m";
+ n' |% a2 H9 N" A$ a4 P调用已存m文件用命令read. 试看下述实验:- D$ p3 {. r) ^7 w& i: p5 W
> restart:, Q; i( @2 k. `. i! m, m, r* T
> myfunc(6,8);8 S: d7 |4 G9 Y3 ^
- @! Q2 g! |3 \" x; c7 Z
> read "e:\\test.m";6 g, T4 y, N$ b5 i: }! L2 ?
> myfunc(6,8);
6 ~2 F/ A- y8 C5 b: Y! c5 E% o
% t: r% U1 ?% Q3 {> myresult;9 E2 J/ B% H- C# t2 y7 H
1 K! u, g& y+ f/ c& k8 j2 W
    而存为txt文件时则将整个语句存为一个文件:/ G1 |* r$ i6 T( H$ A
> save myfunc,myresult,"e:\\test.txt";( K/ w4 c6 q3 p# Y/ M% I
> restart: read"e:\\test.txt";
* [4 \( `# u3 z$ d( n , i8 L+ p7 m! w
3 T* X9 p  U5 |- k& n8 D, u! Z6 g
5.2 读取文件
' `+ W* [1 B9 u. q9 F! f% K# m9 x在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.
: u" p' ?2 `+ Q/ S4 T5.2.1 读取数值数据
5 {) }+ \2 p# N$ R- p如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.
% U0 t5 s4 [# D  v7 U从filename文件里读取n行数据时使用命令: readdata("filename",n);
6 z3 i' ?( {5 D以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);
5 a' F2 q) L: D( Z+ f> readdata("e:\\filename.txt",3);
( B9 E2 z9 q9 u1 c" l. E2 n 6 q' q: X8 m' w. ?
    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:4 |+ T8 w8 Z/ {! q9 P% r
> readdata("e:\\filename.txt",[integer,float,float]);
4 R, Y1 S$ F, ~) Y6 N & E6 Y# z9 \2 S& d$ I
下面再看一个运用大量的实验数据在Maple环境绘图的实验:1 f: q* m8 I4 |( h8 k
> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:) B" W: B! v0 x% S+ b2 @! _
> writedata("e:\\data.txt",evalf(mypts));& K% D1 L/ |; {3 U
> dots:=readdata("e:\\data.txt",100):; d* C, V4 `3 w8 [  u6 j' N6 R
> nops(dots);- {' x0 J- r8 s
  b4 K% _7 T/ ?! m5 u! b
> dots[1..4];
! ]& I4 ~6 \6 t' W4 Y* h9 T
8 G, T+ [( |& z: L2 S* l, L> plot(dots,style=line);
: l+ h. }4 j4 h7 A
  \: ]( M3 o, U0 U) _5.2.2 读取Maple的指令9 w: X2 s& o5 \2 ~, ?
在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:; A- P% q) @; I* E4 _' U
read "filename";- W/ w! @, F2 b( H1 b; q
如下例:
% y* l9 |( e: q, q> reatart:/ `& y& a/ j5 l8 p: C) L5 A
> myfunc:=(a::list)->add(i,i=a);7 h4 q' e* Y' y4 |5 |  v) N
5 Q7 y% b9 o+ p0 D* A0 r* ?+ P
> avg:=(a::list)->myfunc(a)/nops(a);. G+ L: l( S1 w$ C/ B* \, J" E' q
8 `4 R3 L, v  b$ b3 T2 P; W
> save myfunc,avg,"e:\\function.m";
5 O* l( V( x1 n% V: b, @> restart:
) k; _2 o; {+ V. b0 j& I  t> read "e:\\function.m";
- W) m' l, E9 S0 s0 O  l5 v. Y. C> myfunc([1,2,3,4,5,6,7,8,9]);7 @/ M8 ?9 F; [2 ^' E+ N6 F2 s

  q/ o! z* K" w> avg([1,2,3,4,5,6,7,8,9]);: i, C! p- ]3 W, X6 G2 I# }+ W5 B
, @, c6 I/ }6 J$ Q* w" y' l
5.3 与其它程序语言的连接5 K4 ^6 X. n2 b; x' i# W9 q
5.3.1 转换成FORTRAN或C语言
$ G! ~, S9 B, r8 u- o# @4 ~& ~; l调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:- O3 A8 h" V9 ]$ n5 x% K
> with(codegen,fortran):  [5 z0 \. {! M6 f0 v
f:= 1-2*x+3*x^2-2*x^3+x^4;
2 \, y  I! z+ m4 v! ~& k 5 ]1 m# c% y0 S
> fortran(%);
) j. B! x4 T0 ?0 `) L& D* f      t0 = 1-2*x+3*x**2-2*x**3+x**4! ?( l( C+ Q) L1 t* |
> fortran(f,optimized);( h" r0 B8 w& d* ]& }+ `
      t2 = x**2
$ l" x" w  H2 }      t6 = t2**2
/ o" Z& J( s; P; r7 I      t7 = 1-2*x+3*t2-2*t2*x+t6
9 \& j; L* x/ F' u( ]6 T> fortran(convert(f,horner,x));
/ W3 W9 g6 [  b% q& b6 N      t0 = 1+(-2+(3+(-2+x)*x)*x)*x0 K, D& a4 I2 p4 v# f6 R
而codegen程序包中的C命令可以把Maple结果转换成C语言格式:! Q1 ]4 g+ R) i: r
> with(codegen,C):: N% d' q& Y. I
f:=1-x/2+3*x^2-x^3+x^4;% r' U5 ?; g: O
, ~/ i: A: D, i# o* P
> C(f);
6 k2 k4 z2 _5 S      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;3 X1 k; [, [/ {) K& X0 w$ [
> C(f,optimized);4 v: s. l. m4 |: d# }
      t2 = x*x;( ^3 i1 @+ f0 k( X3 _
      t5 = t2*t2;7 e" d( i3 q; h6 m! r4 R) b: j
      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;+ Q( y& u2 L% n6 z7 c( B  v& U- E
optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.) V3 ~0 T$ |9 b1 n- _
5.3.2 生成LATEX
) U, `, X5 P3 m4 ?Maple可以把它的表达式转换成LATEX, 使用latex命令即可:9 S8 W+ |" X8 s6 T& u' f' B
> latex(x^2+y^2=z^2);
/ w$ R/ Z6 u$ L( T7 C* H- r{x}^{2}+{y}^{2}={z}^{2}' A- p# i, X( B( {( o2 p0 I
    还可以将转换结果存为一个文件(LatexFile):# x* t7 X% L* S. R$ ?( d1 V
> latex(x^2 + y^2 = z^2, LatexFile);( F, W3 a$ K9 @2 }& o; A
    再如下例:6 o/ I5 c5 D' `1 D. {; O9 D* d* D4 n
> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));
$ f- T+ E$ `* L. I! l5 }  n  {3 w' A\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
$ O( d* q& j% _$ t/ a/ [% _3 m0 t- `0 U
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年!6 y$ M3 E+ R, x! `4 E6 H% O

    ' |6 j3 a' Z  f7 l4 `+ d& g) g4 _
    回复

    使用道具 举报

    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-9-23 00:27 , Processed in 0.605445 second(s), 100 queries .

    回顶部