QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

自我介绍
爱学习
跳转到指定楼层
1#
发表于 2012-6-12 16:53 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
. q# l; n0 j- @6 M2 C8 H
第一章  Maple基础; j3 m8 W  u$ W! M& O

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

2 Y0 ^5 U4 [+ L% W! L/ z/ \
7 ?: d/ |0 R" D8 W9 k0 F$ ~
/ L3 n: W' {" Q; H6 R
# N' M2 A6 o6 D% i; S" ]$ n+ Z8 t - ?  n: @5 f8 X$ ^# n% J

2 T6 }( }, N3 H7 e! D& ]
: ^4 @3 f, P* ? ) k- g- B/ ^3 ~( B9 g

" F" K% m. `8 d" o6 t3 N' [5 P6 S 1 Z, @; v  {' l) r
( q# X$ P+ x4 Q7 D/ n7 P

2 H( f( P1 y2 q- }2 e
" S9 D) P" u1 Xalpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu; Y9 T9 |2 r& F0 D( o
8 c" z8 {0 l- I* p: v; e
/ P5 J/ F) S0 H1 F5 ?4 c: q
5 }/ Y7 g/ ^  Z) `+ \( C
6 P- b3 C6 d* N" T/ ]: {, ^# ^

. U+ I% e9 F1 \  f1 a ) w# o, [" {% \1 h: b0 [

/ `( w. L7 n" M 6 p3 ~8 k: `' P0 a
/ a, n5 ]' `. z' ~* ]  |; d9 u
3 X" J* X+ B+ r7 z
: [/ V1 F5 f( U8 z( ]
3 @. b3 z5 Z/ S
# X/ Q: \" i4 S) m
nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega
: c- N/ \0 N. s& @8 ?有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:
0 P3 d+ j9 r+ H: a> for i to 10 do " N  v4 ~. W  D. {" \$ ]) u
printf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));5 H4 L0 \, K6 N0 F! o
od;
4 S0 p% T5 ^6 k% A/ l3 yi=+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.1623 }& M# }- D- x1 F1 b  W
+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:- G% N5 g( M% y3 y8 }7 t
> for i to 10 do
) q; h' v. z" ^: b& j% }% @printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));
& g; G, y# D( }6 c& ~) ?+ j2 bod;
4 H2 f" {9 h/ C' di=+1 and i^(1/2)=+1.000
$ O( z, I; }6 W8 o9 c& _i=+2 and i^(1/2)=+1.414
- L4 @: M6 u) c- ni=+3 and i^(1/2)=+1.732) `9 Q, v8 }' W! e3 a
i=+4 and i^(1/2)=+2.000
2 V: z0 [) z8 Hi=+5 and i^(1/2)=+2.236
" o: t0 `; p# e) ~i=+6 and i^(1/2)=+2.449
# a7 o; e- V* m+ ]. _1 \i=+7 and i^(1/2)=+2.646
' K5 |- ~3 G1 k9 {) ni=+8 and i^(1/2)=+2.8286 Q5 l" z; r( I) L0 O
i=+9 and i^(1/2)=+3.000
, N+ {3 O9 p7 `9 K7 N& w/ yi=+10 and i^(1/2)=+3.162
, y! m) F0 e; @/ B8 g- e3 K再看下例:将输入的两个数字用特殊形式打印:; S- [" I9 |" a/ n
> niceP:=proc(x,y)
# t$ W. t- N+ X. p& W+ l3 O( \printf("value of x=%6.4f, value of y=%6.4f",x,y);
/ p) f  E  d8 M( Wend proc;& n, ~2 Y+ @9 k! o! x* |1 M; l. A, _

) u; R3 z% G( S1 E0 H0 h0 A) ^) L> niceP(2.4,2002.204);
" l6 L, x1 q. ^" O8 D- X4 i% ovalue of x=2.4000, value of y=2002.2040
; k% O+ o) f7 T; W7 L; D- @, S1.4 Maple联机帮助. k& ?$ D7 k" @  h" r
学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用. 9 T5 h) a, h: }, E
在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可. . G  p& e: t6 c, m
2  Maple的基本运算
; \: p& Z5 ?3 a* h% J2.1 数值计算问题
* {" @: `& N3 D算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”. 3 `* s5 q! f  g% T% ~# U" Y
在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数. - x& y# f5 r. b- a! J
Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算. & Z" X7 K8 a; q- |- A8 U% k* C, H  o
但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明.
, l9 D2 g9 y  I  C第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   
& l  v! \- [/ K; q3 K> 3!!!;( @! y7 k1 w/ Y* |
26012189435657951002049032270810436111915218750169457857275418378508356311569473822406785779581304570826199205758922472595366415651620520158737919845877408325291052446903888118841237643411919510455053466586162432719401971139098455367272785370993456298555867193697740700037004307837589974206767840169672078462806292290321071616698672605489884455142571939854994489395944960640451323621402659861930732493697704776060676806701764916694030348199618814556251955925669188308255149429475965372748456246288242345265977897377408964665539924359287862125159674832209760295056966999272846705637471375330192483135870761254126834158601294475660114554207495899525635430682886346310849656506827715529962567908452357025521862223581300167008345234432368219357931847019565107297818043541738905607274280485839959197290217266122912984205160675790362323376994539641914751755675576953922338030568253085999774416757843528159134613403946049012695420288383471013637338244845066600933484844407119312925376946573543373757247722301815340326471775319845373414786743270484579837866187032574059389242157096959946305575210632032634932092207383209233563099232675044017017605720260108292880423356066430898887102973807975780130560495763428386830571906622052911748225105366977566030295740433879834715185526028053338663571391010463364197690973974322859942198370469791099563033896046758898657957111765666700391567481531159439800436253993997312030664906013253113047190288984918562037666691644687911252491937544258458950003115616829743046411425380748972817233759553806617198014046779356147936352662656833395097600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006 W3 y" h) j' u# ]
上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?
( K$ m4 z" u( U* S/ E为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式
$ w  d* }$ D, `4 p' {* g ! a: a2 B% d2 y( f
可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   
# c! R$ s6 Q; z
% i1 j+ I- z8 R. _/ d这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性.
9 J- }& d: n, c5 O9 o, c3 w另一个例子则想说明Maple计算的局限性:   
: w+ n% d0 `$ j7 x  
7 `9 @' ]# {; Q# b- zMaple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   
% v* n* c0 y- w 1 Z3 h* Q& Q5 ?: l  R' H
显然这是错误的. 这一点可以从代数的角度予以分析. 1 x: G, e% Q7 d
不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果. & C/ @% g3 D% k' h6 v
另一方面, 设 , 则 , 即:$ W+ L  V: c1 V) ^" f& A( `, W
$ @2 A- D8 X) }. g( H! g, T
显然 有6个结果, -2、2是其实数结果. , i; {: t3 _1 s7 |: y+ t
这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性. 5 k1 }! ?3 H9 m' {, _5 J1 w
尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的. $ k1 q+ [/ {. u& M
2.1.1 有理数运算6 c# _4 a4 o: a* Y
作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). ) y$ a; ~4 L0 R
> 12!+(7*8^2)-12345/125;
, z. Y5 R; ?9 Y2 x  h
$ H* a6 k: ]6 n: c! t* R9 `> 123456789/987654321;6 v$ |; @6 L( g6 G6 j- ?3 R
: o. b0 H4 ?- B3 H. g
> evalf(%);0 C! d. N2 G1 \6 h7 Q
) ^) q) Q' s; S% E
> 10!; 100*100+1000+10+1; (100+100)*100-9;& m* |2 k7 P& B9 R) `

5 a! i; s# p8 J& [: h1 H5 G
) o4 C" b3 X* e. u' y& D / `' b; \8 f7 ]/ ?2 m# w
> big_number:=3^(3^3);
. B2 \  B! I6 I0 m0 f  P
5 @+ ~6 s/ `+ G9 }2 Z> length(%);
" ^! \( i5 K# K" Z3 G/ Y6 D
2 ~( ?7 h! p: ]1 v: ~3 q' W$ G上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   0 c2 ~7 R# `% _5 x  j4 P/ W
    1)整数的余(irem)/商(iquo)
3 p+ P6 s8 T, y: t7 I; Z8 p, l命令格式:   
" y5 d0 O: ~6 f1 j, m3 qirem(m,n);        #求m除以n的余数
( \$ J. Y/ i5 O* \irem(m,n,'q');    #求m除以n的余数, 并将商赋给q
" C; F/ f4 P3 u) l! T, Y1 w1 e# }iquo(m,n);        #求m除以n的商数! b, M9 P- D% T
iquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r
& X/ ?, ^+ \9 @其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. * v8 {0 J' d/ I0 s1 H4 L* Y
> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q
1 d4 J5 p3 k: Y0 s ( `6 i0 q- ^* Y. I: d
> q; #显示q
2 J* ~+ k8 T) X7 r
) i7 b6 ~* Q8 V! u8 R6 D9 j* t3 q> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r: D1 V+ D3 F: B; d4 Q% |

1 T" i7 M' ~9 ~6 m* e> r; #显示r8 J- o/ ^" D+ G& l" x

+ i7 N( g. Z7 z& v3 B5 u* H> irem(x,3);  x/ X% d7 m% `2 ^2 O6 t; P# A, {

/ P1 @0 {) i) O' k5 z/ l- }" d2)素数判别(isprime)
+ W9 i* c: D9 |0 H/ y3 B素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n);
* d0 e! Y+ b0 K5 n! M9 O    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数.
1 L4 \1 Y6 a! ~9 ~3 u& v1 }> isprime(2^(2^4)+1);1 Y  l2 W3 C  b8 c. w$ X& J
, j9 i( t* A: ~) g" q8 r
> isprime(2^(2^5)+1);
  C( r- W. q8 s ' L( X. x; \! d2 d- M' p* Y! A
上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. 3 q; h  l2 P+ a, F+ Z  O" K, q; v
3) 确定第i个素数(ithprime)3 V; n* Y5 J) S5 T
若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);   
1 ]. K' k) v4 [5 E> ithprime(2002);
6 g( N5 N1 E6 D
- l4 [8 W) e' A) O% ^* B> ithprime(10000);
' z1 k' h. Z. W  T/ F$ j
& L+ ]2 G# l! D. _$ Z1 X3 \4) 确定下一个较大(nextprime)/较小(prevprime)素数' p, E/ E9 q- d2 S3 p* I4 ~% b0 P$ u
当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
, ]6 y5 p1 @% ~nextprime(n);  0 V; @* L, z! `  S  ]
prevprime(n); . ^. I4 s1 ?; H, ]! l/ m
> nextprime(2002);& y" @/ H  y& g3 U$ A) F/ h) |

$ z, J4 W, l* O/ Y/ s> prevprime(2002);
/ l. @6 n/ m# \( J9 ` ( B* C* X/ D" o' a4 L! U
5) 一组数的最大值(max)/最小值(min)& i$ ~9 U7 k( `& D; k6 D) q
命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值+ N  C% e% W3 B' G0 |* p
             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
. U( Q2 P, v8 Z  [- c% j" ~> max(1/5,ln(3),9/17,-infinity);! e) ?# \3 H7 M
6 P  J8 F; q: o
> min(x+1,x+2,y);; X. U7 q7 T- O
/ z& l7 _  Q) D2 T$ X* y3 X) l
6)模运算(mod/modp/mods)
# w6 c. O5 a2 F+ L命令格式:  e mod m;    # 表达式e对m的整数的模运算- M( q( j( p, t
modp(e,m);  # e对正数m的模运算
8 y5 x2 n5 J* w. a3 Xmods(e,m);  # e对m负对称数(即 -m)的模运算
  D5 \' D" R5 Y5 ]8 Z* i`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价
8 F  g" V* e3 t' v2 Y值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/.
, A' `8 ^6 n9 A) K8 x> 2002 mod 101;
- A/ @7 E' \% d) o) s
6 [' f* u& U& ~: n0 g2 U& h> modp(2002,101);4 b( g& G  w: X, @( H  V
$ ~5 z" X/ W0 M- q
> mods(49,100);
* q0 E1 |+ Q) ?9 ]& L
( V0 U% K0 c: x1 G5 @> mods(51,100);
" M% E* n' g' r - b' S/ n' H$ b+ y3 d% }0 Q2 K( ~
> 2^101 mod 2002;  # 同 2 &^101 mod 2002;  r# L/ Z# ]. c9 d; u5 e' H

+ }6 D8 Z. s0 h7)随机数生成器(rand)4 Z/ L, D2 [' i1 A: @" ]
命令格式:   & A) w7 V) L/ W# y
rand( );    #随机返回一个12位数字的非负整数
4 }( A( l  V: x+ e% l1 irand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数" z: Q# W+ d5 c7 X/ G
> rand();
3 M0 N' M7 V( g/ r2 r1 D
, j' y0 y4 {; n1 @9 O' Z4 {9 J$ h( V> myproc:=rand(1..2002):
6 }3 P" O1 b  c: |' o> myproc();
* J5 `) i0 R+ N' t& \. C8 [6 A
" z4 E2 V9 z& d> myproc();: y( R5 V: i2 f

4 P& H0 M* N+ T+ U! Q+ S2 n4 ?: S    注意, rand(n)是rand(0..n-1)的简写形式.
3 n- v$ X) ?+ T- _; W; V2.1.2 复数运算( H5 t& U& G: J4 ]0 g' R
复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   9 W2 D; d& g7 F: U6 n+ E* c3 [2 W
> complex_number:=(1+2*I)*(3+4*I);
  S) C$ Z* W" a" m* T & D: Z4 W! U) E6 e3 k
> Re(%);Im(%%);conjugate(%%%);argument(complex_number);
9 E5 }& i& {  @2 g* J3 W , `& R: X" N! e1 h+ P% u+ Q0 o
' i" l1 K3 S8 g, J/ Q
7 ?3 @# v, P+ k, Q1 m5 Z. ~7 A

0 g/ v. f, ~4 B! w( J' M/ ?8 V值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.
+ R( e; n3 r/ F  a为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   " D0 ?) z, X9 b* J5 t
1) 绝对值函数) {: s& L3 W$ K$ m: H+ z" u$ M4 d6 r0 w
命令格式: abs(expr);  - @# ?4 @: V) D- m( i1 {  D6 G5 S& E, c
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.
. L0 R( t3 s6 u5 k7 r) F0 p# R> abs(-2002);    #常数的绝对值. Y- C4 a; l( j

& U/ j  {9 I  W$ X- N, o$ C> abs(1+2*I);   #复数的模
$ K8 V9 e& f4 |& ?6 E ( Q9 F- N* `" z& g# b% w7 A
> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值
8 w2 |  M* n4 ~6 R
+ {/ j: ]2 i* Q* I' K) }7 b( V7 t, r> abs(2*x-5);   #函数表达式的绝对值7 }1 u4 T- f" B( c! [$ l
0 l! k& u4 o. g
2)复数的幅角函数# ^+ x7 j7 @/ v; R9 T
命令格式:   argument(x);  #返回复数x的幅角的主值
/ H4 K# x6 q1 O& |" Z- X6 M+ A- i> argument(6+11*I);4 E( M3 ~# X4 i' }6 y; \

1 R7 H" ~8 ?' V1 a6 @% S> argument(exp(4*Pi/3*I));
( K; q* p! e6 q* }7 o/ G + J$ l+ `2 D/ Z2 N# j) g9 [& t
3)共轭复数( V. b. Z4 i" l. _1 g' f; `
命令格式:   conjugate(x);  #返回x的共轭复数
  ^, n! L: Z2 F9 G# I> conjugate(6+8*I);
1 l7 H' o  d" e0 t$ h # b3 e7 N. K+ B$ U5 q- S5 I
> conjugate(exp(4*Pi/3*I));
0 c% Q7 d4 l3 T: h 0 |, l* I, C4 V6 m
2.1.3 数的进制转换9 o3 m2 d2 D9 p
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可. ! O, \6 l9 V  X, o
命令格式:   convert(expr, form, arg3, ...);   
: ^" D# ^8 ?9 T, f其中, expr为任意表达式, form为一名称, arg3, ... 可选项. 5 ^! w2 J$ s5 W9 Y7 E
下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述.
  e# v9 q7 w7 ?# u* Y& K    1)基数之间的转换1 J; W7 r& E4 h5 U  I5 d/ R+ f
命令格式:   2 Q0 D( Z! T" @9 h9 x
convert(n, base, beta);      #将基数为10的数n转换为基数为beta的数
9 g& Y  u# p) |4 g' ?' k4 Z    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数
" v3 s; V9 e0 {3 a( k% F> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7
  W$ {! \7 o/ W/ s
; u/ H5 z3 k# g! |& U  n> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数, t/ z# l/ g1 P3 u& P

7 ^( j" |  C' R9 U6 p- M; @9 W* o> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)/ i! F8 Y; L- u. V# J0 g  p2 m' o$ |

5 {* m: K2 m) `  ~2 r* k3 M4 A    2)转换为二进制形式
& h& f- ?8 j4 A' ]命令格式: convert(n, binary);
9 @8 l2 d/ i7 t7 S8 G! R0 a+ v其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂. 2 p: n, I- @. k9 V' [; l
> convert(2002,binary);   4 J/ p2 s) E: F
/ z/ a$ }& f3 W8 {0 N4 b
> convert(-1999,binary); " y3 Y4 H: L+ N7 h
! J1 ~+ T1 L7 z0 g
> convert(1999.7,binary);
3 i9 {! Y" M  _- v
; y4 q7 c& N! y- m# p3)转换为十进制形式
2 O8 w9 L1 |9 ?- @0 J9 s其它数值转换为十进制的命令格式为:   
& E: @( h5 N( P3 A( u) t$ b: ^$ lconvert(n, decimal, binary);   #将一个2进制数n转换为10进制数
5 b4 O0 n: W8 }2 A    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数& \& h  q1 V6 Z
    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数
$ X9 G  X- |9 i  F6 j> convert(11111010010, decimal, binary);   
8 x% S- a8 ^$ ^% d, m% ] # C: Q0 X& t. h# C
> convert(-1234, decimal, octal);           
/ ~  {0 m0 W% z, X. A : A7 k8 v7 Q- d' D
> convert("2A.C", decimal, hex);          . J% O4 g* v: y1 l

$ |; Z+ j( E: ]8 {+ |7 T4) 转换为16进制数
  z% k( H' g( R将自然数n转换为16进制数的命令格式为: convert(n, hex);   
% r/ \$ q. U2 T+ M. M8 x" J> convert(2002,hex);  convert(1999,hex);& G* Y0 O4 k. J) c4 ^' {, [

' P- Y. A. F" Z2 D) M; [
) E8 `& q2 W" D0 Q5)转换为浮点数: k' Y( h+ }& O9 k. r$ q' @
命令格式: convert(expr, float);  ~$ F; m) K/ Q( y- |7 |
注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用.
. w, y0 ~9 M/ ?> convert(1999/2002,float);4 P4 v! s. g: I) A- l
# v* B4 N1 U4 ^" @( b
> convert(Pi,float);) R$ M' c6 x& P
$ U6 m6 d& _% P+ W* M
2.2 初等数学8 U/ E5 D5 n: B# e: g# ~: ?3 G& T
    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识. ( I0 }) a" i0 Z6 y6 E* o
2.2.1 常用函数7 C; _1 {" ~8 e& c! j
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   
9 ?2 G- n. ?2 I2 a9 E指数函数: exp
( O1 z; X! z6 M8 T1 V9 V一般对数: log[a]4 ]! i+ `0 n& C
自然函数: ln& H; s( ^7 `: P0 A
常用对数: log104 l& E  G6 R' t: k
平方根: sqrt! _& I. j+ s, ~3 ?! c* X0 P
绝对值: abs
2 D3 [4 m/ m3 d" F% E% w8 ~三角函数: sin、cos、tan、sec、csc、cot
0 ~* a% ^$ z. m8 Y6 A反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot3 k, X0 I  v  k3 }. T$ n2 {7 x
双曲函数: sinh、cosh、tanh、sech、csch、coth
2 G' B! o/ I9 R  u反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth
) n- j  ~: e, ]! E) i$ J* \贝赛尔函数: BesselI、BesselJ、BesselK、BesselY$ l3 L0 U6 r# H, V; v2 ~
Gamma函数: GAMMA
3 x* L" a3 [9 G5 f误差函数: erf' X" a3 U. f- w6 L3 o8 v1 ^" f
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. 4 E3 ?  b! a/ R
1) 确定乘积和不确定乘积1 H7 c" J& u5 @1 H3 {
命令格式: product(f,k);  1 j4 B# X+ T  J8 |2 C
product(f,k=m..n);  
- q2 T- n- H- e1 d1 mproduct(f,k=alpha);
! Z& |( {. x6 L+ Uproduct(f,k=expr);2 D+ G4 `/ _9 c
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
. M9 I$ s$ Z* [9 r6 r% _! g> product(k^2,k=1..10);   #计算 关于1..10的连乘* j# n3 M* k5 \0 y  E

8 m8 b, C( d2 y1 ^: y$ q3 H> product(k^2,k);         #计算 的不确定乘积
1 H3 S& Z, K/ S6 E# h' | 7 A# T- C6 S. J' v7 V, E/ o
> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘7 T0 R  A# C: F! D. {6 V5 a

  C" [1 {. v; q" k! t> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘! \, J: K5 i2 ^: Y7 Q: D8 L

' a7 \* C4 C/ [8 W! u0 Z7 u> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式
8 J2 g" y# z, ^+ \' G
! s( ?2 X) z: `$ |8 X$ i> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积6 c  K% X' l% s( n! ?9 M1 I
4 |# D: p& c0 U2 ~' ?; e9 C4 X
    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   7 v8 b& g' A. Z; m3 b4 o
> product(x+k,k=0..n-1);
2 r6 _6 E! C! Z
8 U( k2 S, M) p' b2 P2 R3 s如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   2 a2 U  u! ~7 @( Y! j
> mul(x+k,k=0..3);# E2 b6 Y2 E2 {, o- I; D1 _+ _

! |6 t  B" X4 E/ f8 O2)指数函数
7 J' L1 @  X  y% t- d+ q1 S, o: m计算指数函数exp关于x的表达式的命令格式为: exp(x);
1 _/ O; E5 q2 S8 t3 D+ H7 L* ~> exp(1);3 T6 |2 U; R; d# Y/ y
) e9 j: o' s5 n& O& _) E* L8 k. j
> evalf(%);
, P) o0 B7 I3 q/ W 0 V" F0 b2 R2 H2 E. A/ F
> exp(1.29+2*I);
9 A1 p8 W0 G$ o3 k/ N( h 0 _! ?  H+ T, ^
> evalc(exp(x+I*y));# o. r: w8 u) \+ ~/ f4 ]) h
0 @8 R. h" s1 w
3)确定求和与不确定求和sum
! s* E3 O* [6 h命令格式: sum(f,k);  $ z* f& V$ ]( q; q  r) t
sum(f,k=m..n);  ! c" G& e1 o2 u' n3 G0 b
sum(f,k=alpha);
* j) Q& @) ^& nsum(f,k=expr);( `- m3 j# g0 y4 D! \8 |
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式. & W8 s. ~$ N8 A2 y) S2 p  L1 n
> Sum(k^2,k=1..n)=sum(k^2,k=1..n);
. F4 R; ]# s, a, g % f/ _$ }: {' ]+ j# j4 l8 U
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);* W5 f! `0 C- R; k; f7 z5 J
5 k0 g) y! S! _* ?+ y, \
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);4 g8 A! A( H2 q, r# F
' W2 s0 J3 U$ {5 a. h* |3 R( A
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);, O- {* \" B7 P5 R. l6 o

: T& L6 r1 A3 l) L: Z> sum(a[k]*x[k],k=0..n);; I! |3 I+ y; O1 y7 ]9 C- o( w+ v" {
3 O3 }* W* h2 r8 K' }4 d) ^9 n4 e
> Sum(k/(k+1),k)=sum(k/(k+1),k);
, q" k2 R  Z0 W" V 1 p; i4 f0 Q" I# \3 J. Y! J
> sum(k/(k+1),k=RootOf(x^2-3));
6 c9 r  J/ F' g5 [7 f; e 1 c$ @* B" }$ d. f  s8 R& }
sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的.
/ l# w2 F; e5 x- R: e5 A! T> Sum('k','k'=0..n)=sum('k','k'=0..n);
5 d* O. e  I7 q& J9 V+ o5 O! }
# M* T+ w( j3 ^/ m8 d4 `如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   
9 G8 c9 t1 X- Y> add(k,k=1..100);& X$ k9 P8 {$ A' g, Y- ~

* D* c8 B) m7 K7 J8 M' G尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令.
  A0 {9 S0 B2 u# H3 @+ M$ ~" i另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
+ q4 [- Z! k' A0 U3)三角函数/双曲函数
# M& {4 |" Z- \1 _$ F% Z命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);
" q2 Z7 D, ?9 U2 C          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);$ |' P. P/ V. I9 S  o6 {5 P
其中, x为任意表达式. 8 @4 Z/ B7 \6 v# K# a
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.+ h* X6 V; r6 p4 ~9 v
> Sin(Pi)=sin(Pi);
- K/ _. V. }# S3 ~9 g
3 C  q7 J7 g! m> coth(1.9+2.1*I);
& e5 |+ J* R) i# n& A% o- u
! N% \2 Z$ T2 z; j$ K> expand(sin(x+y));     #展开表达式
1 E$ O" {! ~  @. R& Y# ?
. J1 `1 J* L9 I. P> combine(%);        #合并表达式
9 T9 h9 |+ `* l  Z6 V. O# w 6 _) Y9 m5 B$ z+ G3 @$ l. I& i
> convert(sin(7*Pi/60),'radical');9 h8 c. N" h6 S- |* d, F/ z, K8 O
7 J  [6 d  i  k5 C
> evalf(%);/ g3 g. ]4 F, I7 f( f3 {
4 G9 f5 `  [$ G) C1 a9 m. b) Z
但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.
$ l, d  B, d, C3 q2 Y4)反三角函数/反双曲函数; m! K+ K0 c+ b
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);) Z2 ~+ ^- X1 Y; Z9 y2 o2 [
     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   0 u% w# ?) C' Q3 {3 C* a
arctan(y,x);
- i7 ^7 \; U1 w. o2 b- d+ x其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算.
1 u8 o) j, b1 {算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.& n& h: P9 C; Y* A6 e
> arcsinh(1);
2 A. @4 ^* j, e. B; ^
8 W; r. \1 m" z. W7 _, q4 z> cos(arcsin(x));+ V5 T( C+ b- s; |( d  w

- R( B9 e  P$ u# m- f- y4 f. t> arcsin(1.9+2.1*I);2 G3 w0 y9 _1 V; e* j
- [, Y7 X2 o$ Q% P+ i) ~) j3 ^$ x
5)对数函数+ W/ S* A  m( Q2 G
命令格式: ln(x);           #自然对数
2 Z, ]) j, b; _6 }! Flog[a](x);        #一般对数
0 O2 l! Q! H' [" \" n3 H- Vlog10(x);        #常用对数
4 W# v; v/ ^4 i! H3 n5 b! F一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   
0 z. _  e+ |, z9 g+ Q9 t  (其中,  )
! d3 a  `  P9 @' Q1 X5 F- |> ln(2002.0);
6 j8 K" I6 s  G3 x* }4 |   E: B7 X2 `2 h4 P
> ln(3+4*I);# E1 h. J$ c! L1 p5 S
6 v. ]$ B3 w$ \- y+ o
> evalc(%);    # 求出上式的实部、虚部
! r/ ]  M2 l# J8 x6 j! \' ?
; f0 x0 P+ Y2 e> log10(1000000);
4 r- l6 K4 m. f; |
3 m% p, p* o7 Y; o( B" N1 o5 l> simplify(%);   #化简上式
, w* Q  u) A' u- y# \7 [# T
- d% B0 _4 c& }. Y2.2.2 函数的定义
! E/ F$ Q! N2 ]# E/ HMaple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   & H: N& }5 P1 i$ W8 ~6 w
> f(x):=a*x^2+b*x+c;  }' d9 @5 R2 d" n2 s4 `: ^
+ z+ R6 O1 n' J  ~$ `9 B
可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   0 n7 n2 V3 V: i0 q
> f(x),f(0),f(1/a);1 R5 o9 g7 F  m9 ?4 o! e

- |5 O6 c* `; T! T" @* |- T% [% T) ]由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   ! d) I. c. q9 n8 \2 T! F1 `
> print(f);
: [+ U8 h( \' e) s1 w6 d9 K% U / Y9 f$ q! \) s) z
事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. 4 l7 T8 S6 ?0 H- Z, ~
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   4 ~5 m5 j6 G: Z8 a0 x- e
> f:=x->a*x^2+b*x+c;
  }3 Y- o9 A+ F* x: X9 ^. a ; N+ Y/ m. O5 ?. W5 O- G
> f(x),f(0),f(1/a);
; R- @/ {4 q( g+ q7 N5 e. R+ _
3 K- N, e; H0 }+ g多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). ' z1 Q9 W; S4 S1 N6 _: ^
> f:=(x,y)->x^2+y^2;
8 P$ D* t/ n. {
# G+ T/ s* `0 s3 O; _- U: c> f(1,2);
  K: W& X5 b  A# D  N8 d $ \6 W3 S* ~! }  o$ j) ~/ _
> f:=(x,y)->a*x*y*exp(x^2+y^2);
) e  j" b; A! R, [
0 Z% j" [* p2 n( O) q+ f综上所述, 箭头操作符定义函数的方式一般为:   
/ b( I+ R6 I, w$ }7 X0 ~+ z9 W& i一元函数: 参数->函数表达式
* ]( s, R+ E& U! }/ h) {; ^+ ~" |& m多多函数: (参数序列)->函数表达式
' I& i- I; F- Q4 E无参数函数也许不好理解, 但可以用来定义常函数:   
. T1 K7 R9 Y. i> E:=()->exp(1);
6 e7 E9 n6 ?8 r) C$ e# Y 6 i9 C6 B0 Q, [3 j8 l; T; \
> E();
/ u- Q; c7 C: [+ N0 o 4 i9 C, o" u5 \: X0 S$ D& d; ]
> E(x);
) u+ c  S8 ^, R* @
) B+ W+ Z) u2 r/ |另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数.
/ y# l4 U) g( X( s) j; P. e, M4 Y定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);          7 n* {, j/ G5 F/ g+ }( A
定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     
  w/ Z# H- p( [2 l& }( Y, Z> f:=unapply(x^4+x^3+x^2+x+1,x);
( j" }+ I, a6 Y; F" {% L
6 U, G& ?/ _/ p4 C  U  ]> f(4);
; n( T( W, p: u5 y' C% G/ I% X8 [$ o 4 Z; ~; _9 b0 {' L; d
> f:=unapply(x*y/(x^2+y^2),x,y);
. j1 n6 U* Z# m
9 X! B! S( g. A3 D> f(1,1);
" K7 e/ o6 `- A2 J& i) D * ^+ v. ^4 I, m7 S" v
借助函数piecewise可以生成简单分段函数:3 j  C$ \$ Y) I. m7 d$ Y
> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);/ I+ l0 U( N# p+ |( @
; C7 s, X2 }! ~
清除函数的定义用命令unassign.
: S) |" B3 g; T3 F; p> unassign(f);
- I: q; l' _( o- S> f(1,1);
" z' H% v& c9 O( E( W2 Z7 e
" L# a1 v/ v  H5 b) y除此之外, 还可以通过程序设计方式定义函数(参见第6章).
# X9 j. a  }1 C定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:
8 }. Q" q# c+ P# ]) `+ p/ ~op(expr);         
# ], p" z* K& @5 ^op(i, expr);         
" f8 n7 C% I- U) R$ O# k/ X( nop(i .. j, expr);      ' d' k% H3 z/ Q9 L2 v- ~
nops(expr);
, T& r2 t' C9 ^+ g如果函数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的类型.
# h" n3 A' g' S/ _6 k/ Z; k! k5 ~+ t命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上." V5 G9 c1 `' ^1 U  T$ f
命令op(expr); 等价于op(1..nops(expr), expr); 5 M, n9 T1 n  Y
特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...));
: X/ }% j. h5 O) n  t" F而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
  d  h2 l* @0 R1 c  j> expr:=6+cos(x)+sin(x)*cos(x)^2;
. v8 H; x  \+ J' z8 K; l
- j+ x' f# F0 h, N1 m9 j> op(expr);
  b7 M! k$ g4 s   j. ~2 W7 U# w7 @7 w! |" Q/ ]
> nops(expr);
+ O! e: P# v' t- ?' c: Z4 c! Y1 P! J $ F* O2 X7 z4 I4 z
> p:=x^2*y+3*x^3*z+2;
1 H. T) A8 h% F0 W5 C7 U; U9 Y # }; P6 D8 J0 f6 L
> op(1,p);
4 L! f* D$ A3 ~/ p. i( t
% h0 a/ n( A# x. f0 q> op(1..nops(p),p);6 C' J( k9 K  b- i
. P# R# G! L; ?
> op(op(2,p));
3 j) ]: R7 Q, y4 a
0 h6 @* _  A! y6 m5 M0 x* E9 T( n> u:=[1,4,9];
: x# M( G9 v9 C0 z" }. K; l ! C% M0 J. [4 O3 r8 I
> op(0,u);6 F0 z& q6 V3 k. U
  a( M; c& @, T9 K) h, ^* Q
> s:=series(sin(x),x=1,3);3 F4 @% z$ \2 I+ c7 G
: q+ u; X8 l7 X, m0 J3 v
> op(0,s);- K  d) i) B4 p% d
        - z; f" Y1 ~$ ~( ]  Z% V: C7 ~
> nops(s);2 _% a) L# G7 |  [! r% S# L
1 K* p: y! h: B! ?
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:. v, `# G5 ^% _' @; t& x( [
> op(x*y*z);
4 c/ E  u7 L) a* o4 C% k / E& P4 H3 s5 {+ L3 F# J' o
> op(x*y*z+1);
! ?- d% ~2 m- N8 Q. Y 1 _; }- n# R4 S8 |  v# H
2.2.3 Maple中的常量与变量名
% f1 b1 t; Q+ {3 a为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   , ]; I5 w- H# M9 w) _
> constants;
: ~, ], \8 f; D, |" i1 S; ^ ) K& {  _" \# B
为了方便使用, 现将上述常数的具体含义列示如下:   : W: X" v! E$ L. I' v# M
常    数        名 称        近似值) `/ ?! B: ~! E: M" ]' M& B3 r
圆周率
# ]# n# L/ H; x0 A# g7 q0 iPi        3.1415926535
$ g5 \! @3 B9 N1 [8 @7 R' \Catalan常数 ; w+ w" A3 `0 |
Catalan        0.9159655942
4 s" G- y7 ?% S6 @$ f- I; ~Euler-Mascheroni常数 % R: D( z1 |, r6 W
gamma        0.5772156649# B! l' E$ |0 ^# d7 V" d; _
' i& d2 {5 ?+ b: [
infinity       
& s( p( O: }3 A/ z# s+ `& P# I* G& }6 q$ c) R3 F! J7 Y' b3 I
需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取. + j8 T# I: C# j) B7 V% N& ^6 }* e
在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
6 H- ]: N  Y# S: ?# w" Y( w$ K8 \1 h2 n值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. . |; V1 o  m0 V% v* Z) k* q# {
在Maple中有一些保留字不可以被用作变量名:   9 g) X- z4 ~' B6 w  N2 Z
by      do      done     elif     else     end        fi        for      % {; i, S+ z; u/ H" L
from    if       in       local     od     option    options     proc         / k( u: y3 ^, j2 X1 d
quit    read     save     stop     then     to        while      D
5 V! Q5 I7 i0 `8 `Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名.
6 e3 S) _4 z7 g8 g7 b3 o+ ?另外一个值得注意的是在Maple中三种类型引号的不同作用:   
' @. c; g. t7 Z3 ``  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;   
0 C3 I$ M# v+ Y( r3 Z9 R, i) u'  ':   界定一个暂时不求值的表达式;   
+ Q0 C" W# X  ?9 p* n"  ":   界定一个字符串, 它不能被赋值. ) C% @) j0 e# B4 Y7 m
2.2.4 函数类型转换           
5 e& w8 A7 G" z( D$ P" y函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  * k5 l6 s; t' B) _, v( l
    convert(expr, form);        #把数学式expr转换成form的形式
2 ^; L! ~( ~' U0 E' X/ Sconvert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos! a2 S: M0 ^: }
convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   % ^9 ?( r# r3 J5 L* W
(1) exp: 将三角函数转换成指数7 X$ q* T  L( X' X: l- M2 ?
(2) expln: 把数学式转换成指数与对数
" z) x$ b5 t7 P+ n* f* |% V(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式5 ~5 W/ e$ s/ Q9 p
(4) ln: 将反三角函数转换成对数
+ g+ p. ~/ q7 r3 n& X(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式. _; _1 p! c- U+ n
(6) tan: 将三角函数转换成tan的形式9 c+ ~- ]& {+ R! J+ E  M3 l
(7) trig: 将指数函数转换成三角函数与对数函数
6 N( @3 G/ E* x7 F# ]> convert(sinh(x),exp);   #将sinh(x)转换成exp类型
# b1 ]5 y2 L& A# D/ A( W) |$ l
, G+ [" [4 H# ~6 ~! B. N2 C/ f" ]> convert(cos(x)*sinh(y),exp);
: Q5 x( D  j1 q3 C& [: x
2 y* }: Y, K" K- `5 g% \3 `> convert(cos(x)*sinh(y),exp,y);) u5 X; O% b# u

/ x5 P' k9 O8 H* b5 o2 S# ~7 g1 ]> convert(exp(x)*exp(x^(-2)),trig);" _9 B! F: f# s
; j7 x2 L  y3 A1 Z# y/ E
> convert(arcsinh(x)*cos(x),expln);
4 Y3 E! z- \% ?$ n7 A  j- p* c; N, a' ~
8 E  u; F# V3 X. F) u. T. n> convert(cot(x)+sinh(x),expsincos);# @# V4 M$ L# F

6 N9 z7 G+ V: i7 g' x( I> convert(arctanh(x),ln);
3 T2 v" P3 F6 Q( z' G9 X: @ . F- r6 T+ n- l" `8 x  R4 A
convert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   / B% T9 N' P! J* [
> with(codegen):
# p* P4 Q9 ^1 s+ D> p:=4*x^4+3*x^3+2*x^2-x;& O9 G8 W" b* M; x/ R+ m
7 z( U$ L2 @! H1 x: k1 @# i
> cost(p);3 Y3 M5 H  V! N( q: a1 u9 n& _

$ D: l6 q3 |7 v/ _# k> convert(p,'horner');  #将展开的表达式转换成嵌套形式5 `' B: [% q" q* B7 R

# G7 ^1 }6 f/ Z+ h' F> cost(%);+ S0 N$ N* c' \; k

9 D4 `! P7 Q$ C/ f同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量. - M& e5 E$ p/ x! _4 Q" \* l
> (1+x+x^2+x^3)/p;3 P  P$ ?& ~" ^0 [
7 U5 I* Y  y5 V7 R4 P' p5 d$ u+ q2 O
> cost(%);
9 H$ V% u- T, |7 N8 X% @5 k
% G3 o. f; r/ W) p% d+ ?8 w6 j1 X> convert(%%,'confrac',x);' k% z8 Z" y6 m0 R& q9 w+ E1 K& }
0 Q( b; ^# f% i3 K  e& Q6 [2 J' ^
> cost(%);3 ~) @+ a6 {: V& K: l1 V, q2 z

' ^7 D) ~; X. V( q8 y在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式. * s/ ~6 d1 P$ b+ Z
> convert(%%, 'parfrac',x);
+ ]) k" u2 e5 D; {
* |. {$ ~* E4 K) m3 w) h> cost(%);
2 X' K+ W) W+ p8 F; B) o
/ D/ t0 ?" G. w) D6 A/ l9 z- ~" P而把分数转换成连分数的方法为:8 k+ {# A* H* f: a$ b
> with(numtheory):
" v  S9 O" E: k, B% _> cfrac(339/284);1 _6 ^5 {. a$ D  J

$ ~- w; Y+ W! G% N2.2.5 函数的映射—map指令
3 d- V  t# U  h, `! _" O在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:* N6 `  \: y1 D9 q
map(f, expr);      #将函数f映射到expr的每个操作数
0 A8 G6 U0 Z7 z) lmap(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量
! R3 M6 \/ N% c* mmap(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量
9 v& V8 b8 Q/ P8 o$ @map2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为) m' U, @, A/ _
第3个自变量…, an为第n+1个自变量来映射函数f
( ~/ P# I) E' d; g; L> map(f,x1+x2+x3+x4,a1,a2,a3,a4);
) |6 X+ Z" y$ j( J- r' T& A
; F. U: }, u* v( s+ O> f:=x->sqrt(x)+x^2;. y8 e/ k  i4 }

& w7 b& P) C0 n0 \> map(f,[a,b,c]);
4 _- ]9 R' I$ G: _" {
5 g  E2 q  _: ]7 B> map(h, [a,b,c],x,y);
! \' n2 g$ n; I # @8 U# ~% \9 t, ?; x; D; i8 R
> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);
; z4 W% b: z2 ~ 7 J: c! }1 @0 ^) j/ E* x
> map(x->convert(x,exp),[sin(x),cos(x)]);
5 M! ^* u' R' h; c- D/ P) d( q9 j6 z
" T; @; U# R( j上式的映射关系可通过下式理解:; O- n3 ^  ?3 l2 A  i% G4 a% R, g
> [convert(sin(x),exp),convert(cos(x),exp)];5 c' Z  i1 `" X, l+ ?& \

- M% ?. f3 A! w> restart: - \) b5 l! g2 J  `9 l  `) Q3 i
map2(f,a1,x1+x2+x3+x4,a2,a3,a4);  C% {3 x# k7 n" h: S+ t. Z

4 t6 D/ f- I8 a6 c- Q! g' R0 l> map2(max,k,[a,b,c,d]); * x4 b: F) A' s8 W/ h
/ }! \8 g. O0 \1 S+ d+ ]! I" v( h
再看下面示例:   
4 f- B# x& M4 r. \1 x/ D> L:=[seq(i,i=1..10)];1 Q2 L( m# |! C# O, h
; s$ O7 o4 F' B
> nops(L);5 T6 ^. \: s5 V2 I' {
0 Y8 b  m# e+ z" k5 _- a. {
> sqr:=(x)->x^2;. h! C! R4 d3 d9 R, |

$ v" V  X5 J/ K: o4 t> map(sqr,L);
& O5 W" Y$ U% A. ]7 {3 q / \, s! p: U$ V1 X  e9 m
> map((x)->x+1,L);
; q5 u* `% s# p- ?  @7 f! z : h* Z" T$ o9 U- H
> map(f,L);" K- j8 A/ i9 ~$ q" `- w

; G% f$ W( e) ?- E> map(f,{a,b,c});3 m3 L- K5 O0 a" T* P/ X

' v! }- n+ e9 I% ~, m7 `> map(sqr,x+y*z);3 J, }, w8 R2 n
$ m% M7 A/ @( D+ W: Y
> M:=linalg[matrix](3,3,(i,j)->i+j);
: o5 p. C1 c/ A: S7 d
* {# ~# q$ G- [( N2 m: u> map((x)->1/x,M);3 q3 g. L8 R, J  N
/ B$ b% P7 K' C2 s
3 求 值( M0 R: {: k' O# K
3.1 赋值
4 r7 Y' c8 i2 c/ i在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. : |/ g0 Q2 X. U# o3 x  K3 h2 h
> p:=9*x^3-37*x^2+47*x-19;9 ]$ K/ o4 F2 C% o
5 Z' w7 z, ^. b8 y) D
> roots(p);3 p+ |0 V5 I8 p0 v) ]/ q" P( ^

/ c4 i. D5 \+ y1 `4 i5 ?) t> subs(x=19/9,p);
6 C( g; k$ a, p9 T. h
( W9 ]4 f. z* _2 R# Z+ n/ H在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证.
+ R" M0 `1 g4 r* q7 r- w3.2 变量代换
% U- `# [( Y7 y& g) V7 P6 \) C3 i" z在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   " S5 [% T7 m5 x  z/ @/ _2 Q. T* l
subs ( var = repacedment, expression);8 R/ D& Y: M7 Z3 \7 `- \9 `8 U
调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement.
8 X4 e8 Z9 F$ w, [; n3 X# X9 |> f:=x^2+exp(x^3)-8;4 Q6 T' |9 K6 C

$ G3 o( D, T. W, W/ i: Q> subs(x=1,f);4 Q/ a" @4 b9 r& t5 f
5 K3 c: f) p' D# b
> subs(x=0,cos(x)*(sin(x)+x^2+5));
. F7 {  g( k! q ; q0 e/ L8 S6 z4 ?
    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   ( @5 l/ T; ^5 Y, k9 _4 `, l5 S9 E( g
> evalf(%);/ A: J* g& l% I/ D  G# j5 t

1 W2 p$ c9 L1 q7 o  y: ~# v变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   & N# O8 @* p* H; m& b9 K5 j) L
subs (var1 = repacedment1, var2 = repacedment2, expression)) v. f6 M3 @! g  I, j
调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   
5 F8 D: B# W6 V( t! gsubs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
. v- h* l( a% Y6 F& h3 |: }/ H  j下面通过例子说明这几种形式的替换.
! x. O6 C7 X3 C6 T+ m' x- l# l> subs(x=y,y=z,x^2*y);              (顺序替换)
- b" G0 O0 C& B) G # z8 W9 H- d; ~3 K
> subs({x=y,y=z},x^2*y);            (同步替换)
$ F: M3 R" }' u
, ]' N0 v" t( b: `+ w# s' v# F  k> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)
1 }3 J) Q" Y- ~) i# U( ]2 Q2 w
% Y) C+ o6 K9 y+ }> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)( P0 M3 L. O5 l! E5 j% W

! q# F4 E* f9 L; V% B; G8 b3 s> subs({p=q,q=p},f(p,q));             (互  换)
6 W, e9 p7 @: X& k
( N. l' b& ~7 p: v9 Z3 c. O8 Q3.3 假设机制
2 I( |: y; {; c# N) N$ L, nMaple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.
- v' C, G5 k5 A8 H# J1 C在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);: i" P% ]; b4 E. j
函数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);”也不会产生矛盾.
; h4 T  n& N0 L) s9 J> Int(exp(-s*t),t=0..infinity);& R9 A: h" `) l+ h* s
! b# I6 x9 c2 r' q0 R, l7 l
> value(%);
$ o2 x) j7 B" p" a& b  g: `, tDefinite integration: Can't determine if the integral is convergent.
- g7 Y# ?7 m) q# G" M: A- _) X# eNeed to know the sign of --> s
9 n$ l1 _) U! k( L. f* I9 jWill now try indefinite integration and then take limits.2 Y( \* R7 y2 D3 y5 T+ O! |
! D) i& c  c, m
> assume(s>0);8 Q0 k! {3 F! R$ r. q. N
> Int(exp(-s*t),t=0..infinity);/ \2 h, C: C/ x/ K. q3 S

. A- ?3 y8 m* G; |8 j# q3 A> value(%);0 T* m! h& H  i5 O/ r) g  v
7 j( k! A* j8 V! p& ~. e
3.4 求值规则, d4 v) z' p$ }: z" k( z2 i
在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   4 z7 M/ a* y/ [! s7 {
> x:=y;+ D# F( t) Q' I/ Z; L0 M5 I, U7 l4 y

& i  N" g( C) A/ b6 s* T! p9 l5 _> y:=z;/ Y, A8 O% p( p$ J" T# i
/ W6 }/ p1 V9 I4 ?# Z
> z:=3;
, y3 l4 e) j3 h8 x0 a+ ~
" K: Z: U+ W  G( k1 u( ^> x;
8 P- c" C8 w( p. x& ]& J
3 l1 R$ |2 n2 ]> y;" F: r$ k* `; f& F, k
, W% f; r6 k2 N7 g
> x:='x';
# `! }1 z3 g( {" A3 Y8 h8 D   R: ~' `7 h  P- n2 d
> x;6 |- d& J$ H1 K/ F* N/ g

5 m* _- D4 M' M: X7 i> y;, @( ?( D' t9 v6 m6 a

4 W0 Y* W' q+ h0 x. ?1 K对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   
$ T* P! m" p% F, ]8 \0 o9 m1) 对表达式求值7 ?6 ?. R% j$ k+ i2 f
命令格式: eval(e, x=a);  #求表达式e在x=a处的值2 [1 l: S5 ~2 w
             eval(e, eqns); #对方程或方程组eqns求值
  K  t2 d, _6 U$ }9 k             eval(e);      #表达式e求值到上面两层! H; O# u) k+ E' Q+ ]. `' Q; I
             eval(x,n);    #给出求值名称的第n层求值2 p9 J  G, t& j
> p:=x^5+x^4+x^3+x^2+x+73;
, }% S) E% P  u( t" I' i. s# m
& ~6 A! E! w" Y6 z$ D' x> eval(p,x=7);
- l6 m: F9 t$ a0 j6 l3 C! u
, Q4 W  K6 r1 L7 I0 V1 ~> P:=exp(y)+x*y+exp(x);
; d# ~2 Y2 R. o* V9 H 1 x4 @/ z& A6 z6 j+ }. r
> eval(P,[x=2,y=3]);: ]  A: d1 R# d8 H3 k
) p+ H8 S( h4 j" i
    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   3 v5 E3 J2 D9 Q, K; J' x
> eval(sin(x)/x,x=0);1 V4 T' F; t# X2 k/ o3 S
Error, numeric exception: division by zero; n- n! ^# i8 Y( P0 m$ b* N7 }
    下面再看使用eval进行全层求值或者对名称几层求值的示例:   
( s- ^6 K- Q0 `" E* R# n0 v: ]/ U> a:=b: b:=c: c:=x+1:
4 E2 ?3 j, Q4 A! y  b3 w$ I/ n> a;              #默认的全层递归求值. O3 ~9 G% d0 T% N4 p5 R& I! H' t. K

/ [) r+ Y- p0 t' F9 y> eval(a);        #强制全层递归求值3 g) t, K+ M9 A1 N

3 t+ E1 I# e* `* g0 K& y> eval(a,1);       #对a一层求值
. ]) }/ b1 o: T4 i
5 q0 X8 S3 i2 I$ J> eval(a,2);       #对a二层求值
2 x+ i% z+ }- e4 _8 t5 I
; }1 e2 v2 l, L4 X. E> eval(a,3);       #对a三层求值, W2 q+ i6 j0 f: _1 c8 ?
$ G2 d& h; z, C0 g5 I; v
> eval(a,4);       #对a四层求值
& \  ~$ ~# K( }0 G : j/ j2 j) X0 m. U
    2) 在代数数(或者函数)域求值
" V2 X. ]+ X* s) j# C% D4 B! `命令格式: evala(expr);       # 对表达式或者未求值函数求值0 ]+ K% u9 E  E: `) y1 q* a4 A
             evala(expr,opts);   #求值时可加选项(opts)9 N( l% _6 c& \& p$ D  c
所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式.
# h, b+ O7 Q( F1 f8 Z1 x/ i: t代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   
7 }. a; i/ _4 L5 B; X& Y0 K> alpha:=RootOf(x^2-3,x);% @( ]3 z/ ^6 e& m2 s) b+ C+ J
7 j- ?4 S6 Y' m+ S+ f4 a7 C
> simplify(alpha^2);
  w# C) x* c1 Z1 J
& g* a: E; a" d, F9 a在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:
6 t1 y: T$ p: O> alias(alpha=RootOf(x^2-2)):
2 `1 d: |9 d4 D- R$ h& K/ _> evala(factor(x^2-2,alpha),lenstra);3 ?: C/ q, i- I5 i: P4 T) }# \, y
  u7 N8 N# A( K% J- U/ e/ g
> evala(quo(x^2-x+3,x-alpha,x,'r'));
" K: `* D' N# P* k# K* G% o8 g , b0 l6 Q% a& o4 n& X
> r;$ T1 w0 h! p) H0 o7 X
8 a/ F2 f+ m0 R- B
> simplify(%);
: G* F1 p, r) e7 S: G
1 K  t* v, c& g" K3 m0 n! T3) 在复数域上符号求值
$ @. r% }/ ~; F' |; u7 a& ~8 h  }操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:4 `5 R" K' h* A- ^$ v
evalc(expr);   
1 a" t/ w8 O5 D3 m0 W$ ^evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2. ) g; b8 A$ P4 M' d1 O  z
> evalc(sin(6+8*I));
: c5 @  H5 S) P# | & p* Q0 _" m1 ?  b0 P
> evalc(f(exp(alpha+x*I)));
3 ^4 T( W9 p, J$ Y% t
' D, ~" }# e) n2 _> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));& F* r; \3 ^; U6 P5 k3 c

7 i3 Z) b- N& M$ |1 q1 v4) 使用浮点算法求值
4 _0 B, e: ^' j% e* a2 @) f浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     4 W! t3 _' Z  J! {  O
> evalf(Pi,50);    2 h* z7 ]1 X, B; U

0 n5 [0 @' n0 l% \( A$ w$ C> evalf(sin(3+4*I));   
. |" v! s& |4 Y( |6 A% A 9 B( k. ?" b/ M: s, [
> evalf(int(sin(x)/x,x=0..1),20);
& q- h) c9 \4 b4 {2 r+ @. H0 O8 Q ( M& N( e5 K% T
5) 对惰性函数求值
+ K9 e" M* M& k. [2 T把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   
2 l. Q- K( C0 q' m' F2 @0 e> F:=Int(exp(x),x);) W% g9 ?( m- \5 J
( w$ o' X8 g9 |( `  L
> value(%);
4 Z7 F; a  `2 I* B
, ]$ ~2 z# u1 M" D3 z2 G4 ]. Z> f:=Limit(sin(x)/x,x=0);
- y6 o/ ?& Y/ J" P: d
3 `/ M# g$ a  g' M$ C> value(%);
$ ]6 f4 x. B6 |  x; k: U: O  Q2 X4 w
3 a7 f1 G: \- d, b: G另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   # x6 T0 ~5 Z& k; o' O& b
> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);. l9 u7 ?* F0 z% W8 z3 \

6 t3 v) s) l! r4 数据结构: N/ D) ~- u9 y+ ]1 M, A" ~
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表.
. R* J. @5 \2 K: \/ z4.1 数据类型查询
0 B7 K' X: Y8 S在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
8 d  Z8 k* u! ?' c3 P9 Owhattype(expr)        # 查询expr的数据类型
- |9 L2 o* P) E" dtype(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false& |+ Q1 r$ u7 ~7 |! @6 b
> whattype(12);
; q' j+ G6 A  ~) |5 a' f
/ x9 G1 g1 f5 W: I6 o> whattype(Pi);
9 Z, i- A2 Z9 D+ N: p) X ) A. I5 D+ y8 j: ^) ]; j
> type(1.1,fraction);6 f" W% Q* r: ?9 g

/ S; r# c2 V: }% {> whattype(1.1);8 L; J: ?! I7 c
/ g8 N' S) o7 U4 R
4.2 序列, 列表和集合/ e9 K" o7 ^/ C) g7 a
4.2.1 序列
1 m% c( S# E$ Y( n所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   ' c/ B& w( k6 C$ Y  F( G
> s:=1,4,9,16,25;- h# ?- d& }( M  L$ ^

, l7 f* d! [' H& F> t:=sin,com,tan,cot;
, S2 V/ ~5 x, K& [& n8 d+ ` . \6 U3 g0 u5 |' f9 V
一个序列也可以由若干个序列复合而成, 如:   + u: P0 ?! J3 q: R' y) ?& @
> s:=1,(4,9,16),25;2 W! l3 f, ?- z6 T. N% ?

3 x* k! ?/ J7 N7 m, n. m> s,s;8 o7 p- g0 C3 F
* r0 a$ C( c: A" q, n5 w  m* B
而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   3 }  m1 d; K6 ]5 [8 F$ Z* u6 k* n
> max(s);) t9 z9 M* r" k; V

8 K) z) p0 `- V3 t> min(s,0,s);% m0 `; ]$ o& M! m  L/ O5 L
$ }: ?' a0 ?% Z; f
值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中.
: {2 C' t4 O0 F) \3 D> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;( R5 X- \. @6 w6 \
$ t' v* ^' V9 n- g+ t5 q7 \
> op(s);0 F8 d& ]% G' G5 Q
Error, wrong number (or type) of parameters in function op
/ Q! D: ^" L1 i( P' J; t  A4 O> nops(s);
7 _5 |, E, p6 M5 ~$ `( Y. i) cError, wrong number (or type) of parameters in function nops
" b# U6 U7 }' K- V- P* v3 c, p> op([s]);
* f, w9 i' r3 q) q ' C1 H0 @+ D( [) t) e" l* g& l2 X
> nops([stuff]);3 h% r: N/ p+ S# h& Z( l3 a
6 T' T! D5 a7 H: d% G8 M. {; I
函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   
- w: t" V" [4 @* c$ ~7 w+ Yseq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)
1 W, Y* N, B4 Q( x; o* }seq(f(i), i=expr);  # 生成一个f映射expr操作数的序列) C6 ^0 }$ S5 X$ o+ B
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列
# {) D- ^7 n8 H% ]% T> seq(i^2,i=1..10);
( Y/ v( w/ d! @" b- [' x
8 I+ B/ C* b, o7 L% n9 h> seq(ithprime(i),i=1..20);
% ]/ o( c  F2 \8 L ' N6 N5 _' A5 W4 d
> seq(i^3,i=x+y+z);7 E: ]; P6 a" b# J

: Z/ n+ h! n2 L! H> seq(D(f),f=[sin,cos,tan,cot]);
- a% h2 O+ p7 y; y( @
' {5 L' A4 b* W> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));
* G& o4 x2 ~' G2 `5 d
4 u# Q) u" L# C* e获得一个序列中的特定元素选用操作符[  ], 如:   & {# |! Y( k, z3 \' F+ W0 T
> seq(ithprime(i),i=1..20);" _, @( K6 O8 i8 m; U+ t1 p; v3 R

4 [- ~  ]4 g$ m- T* e6 E/ z> %[6],%[17];
9 p! _' X" J6 G ' {! k2 J5 c) ?2 z$ A) Y
4.2.2 列表
3 }5 g  l: y& s5 w" p" D( K列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
) C$ ?6 G. Q8 j> l:=[x,1,1-z,x];/ `! D. n1 k9 Q+ x* Z; u
' A3 c( u7 U* }5 Q
> whattype(%);
+ ?- I$ j% c2 X9 O7 O2 d % y8 Y4 Z5 ], S% E, Z, g
空列表定义为[ ]. ( n+ [# r0 t# `7 `5 M
但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   
& g( S! I5 ]" w& _) R> L:=[1,2,3,4];
8 s2 `" w! X, H% b0 g
0 N) [7 i1 t5 `+ x1 A4 V$ u1 p> M:=[2,3,4,1];
: ^% L* m8 V& x. T% F+ K7 u ; x8 J, J; _/ C- u
4.2.3 集合
& \. Y( d* ~$ M' z2 ^$ q, _集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合. 0 t% J7 @# g0 ?1 O
> s:={x,1,1-z,x};
+ L1 Q. `' T8 I( |  I. k - z( P2 }2 K) A" _2 @% [) R+ G
> whattype(%);
! E7 A3 j& w, b0 x9 A6 u * V: p0 t. K2 E
空集定义为{ }. : k& D) f  V( c* `7 e/ B
函数nop返回列表或集合的元素数, 而op则可返回其第I个元素. " ^! t; {. ]2 `. Y" b: K
> op(1,s);
! l% ~) s- Q* b4 Z( y$ E & v9 V# R% M9 d/ C1 ?3 x, P2 e
> s[1];2 Z7 ^4 h3 |; q0 h

- l4 T8 R) H$ d$ E> op(1..3,s);1 [+ z  ^2 s. p3 @0 G) ^7 q6 v$ t

! m$ |7 e% l1 k, m1 O4 l+ x, L> s[1..3];
8 S7 ]9 r6 p' q( P* i , C* y6 N0 r( f  q
函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
  Q) ~* k& F$ [& M# o> member(1+x,s);) Q- U8 G  y$ I" Z9 Y) ~. O4 U7 V4 L2 e

! }9 m, l5 y" o. @可以通过下述方法在列表中增减元素:   
/ }3 P. V7 a/ C$ Z3 _+ z4 v( j# t> t:=[op(s),x];
3 L6 e+ h& u% o5 `7 T  u% M # e& v9 |1 v& M+ F9 g* _/ i
> u:=[s[1..5],s[7..nops(s)]];
* M- {  J% d0 y0 ~ , _- Q+ `8 A1 Y3 t9 |) E6 u, N" g
Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   
! Z7 ^7 g: m, g, z: f# h. ?> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};
' n0 {; L2 V# C- r
7 O: w/ J4 D$ }7 z3 e0 [ 6 j2 @7 E$ |, f9 ]# e/ _, x
> A intersect B;
  w+ J; A; {' f2 U0 l* v . }- p8 }( s9 o5 O, z  y6 l
> A union B; 6 s: y& w( G3 l9 g7 V" k

9 g" e6 Y2 @9 \0 O; l: {> A minus B;- T9 a: u3 W: \

/ v: C6 E/ m" ]' u- c4.3 数组和表
0 ]% v  \0 H% u在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
- c! M2 u& v' P: f0 w6 s9 n9 d    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的. * F9 O1 v* i% _+ {! |( l# G: M
> A:=array(1..4);
2 I- f" V: {- n$ [; I" D. ?  ` 3 k* \* _* C# \7 j, Y
> for i from 1 to 4 do A[i]:=i: od:
6 G6 q8 k* n" ~! i- y9 T7 \> eval(A);
; M0 Q; V+ w' B% A5 v& ^
" \8 M0 w. {$ V0 A( ]% s> type(A,array);
* F6 W$ U, M0 P6 _
4 G7 K0 H5 H) r1 g+ L/ T: Z> type(A,list);
! B8 _7 {' C; m6 \2 d
( J* W  Z- H2 \. |> T:=table();
: @' o. b- {% R0 b! S( ~: {# W
$ Y( {1 R( l+ ^9 |! l& L> T[1]:= 1;
  l! H* ~6 @/ J* i
) w4 R8 N. x& k5 u1 r6 @> T[5]:= 5;3 d( t# i. {8 X3 D5 U* n

7 |. U" d$ p9 `8 Y1 Z> T[3]:= 3;9 F) @" O. n2 U8 c* j5 M, F

+ `  c/ {: E! L# N: q> T[sam]:=sally;
4 U8 v- n6 y- M
& ?: [2 I$ M. s1 H3 h5 R. _> T[Pi]:=exp(1);
0 j7 b& N, Q$ }$ | - }8 H/ F4 v, t) {! Z5 Z
> x:='x';
7 c$ w. D: r/ U) E) r 9 K) R7 v0 Z4 [3 v* b
> T[(1+x+x^3)*sin(x)] := 0;
" _- W6 j( ]4 G ) K5 d' |6 G$ n( {! b, t
> eval(T);2 g# z4 @& B/ M& C
8 B; w* U# d2 \& O' V4 D
> T[3]:='T[3]';/ S# f' a4 e# G& K! O
1 K" [6 N- q* Z3 Q' y* q
> eval(T);6 d/ d# D6 P/ W/ C! S& q

3 e+ Y* {/ _" V6 O4.4 其他数据结构
) v; F) f6 s7 I* o9 B* N+ g+ ]串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来.
( H7 {- \  `6 W# z! Z; R3 P索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立. 6 P6 n1 d# s" A9 l* P6 k% x3 w
> x:=T[3];
2 {/ j, C' p; X4 p& p. Z* } ) n: z) o& D/ C
> eval(T);
0 V8 l) T3 X( h
) D1 T' P3 H& P9 _- k> T[5]:=y;% }- t' |' d5 N% h9 i( y

7 h% _, @0 O6 u# {> eval(T);, ^! A6 k3 f2 p8 @

& x- S& g; Y6 C, `! K由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
: q2 O# k9 j" a  s6 V6 S( h0 }+ T数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. $ J7 c  n/ o  f/ J9 E4 \! y0 O2 F
4.5 数据类型转换和合并
& B1 _1 ?5 e) [7 t! i5 v/ t2 r6 I% vconvert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   ; C  h! M' j4 r" d5 `: @' d' B. }
> L:=[1,2,3,4];- f  @+ a, {, O) t7 H

* d' h) F& m" P" g' `> type(L,list);
2 @9 \5 y3 y& w. N
6 U& k! |. ^! J; @* ?3 r- i> A:=convert(L,array);
& z( K5 E3 s8 Z' K5 F; _' i
- U$ k5 @/ e. ~+ d> type(A,list);
3 ~7 E& F, p. i4 x
9 d" j, J! }# ^> type(A,array);
* x! q: a1 o8 @5 Z : L6 X* C& o+ E7 C8 v1 e2 P
另一个有用的函数zip则可把两个列表或向量合并:   
- s! U; U$ m& |1 o% F8 V>L:=[seq(i,i=1..10)];, p2 O9 S: K0 W$ K; D5 Y. L

. p) ~0 B. D. y8 }- @/ ~1 w> Sqr:=(x)->x^2;9 s/ ]1 g9 f* u' |

- Z! T, R! a, x4 o( J4 c9 L/ }> M:=map(sqr,L);# P$ T+ y% W% U" N( P5 r/ {4 X( C) p

' `, b* g; }2 Y7 n( B> LM:=zip((x,y)->[x,y],L,M);5 p9 {) j- A' X

/ d* t2 \, ^" N# ?> map(op,LM);
0 ?6 ]. r2 H, J# |) L; a2 ]" l
& }; M( p3 Q6 G" S$ w! F% c& R" m5 Maple高级输入与输出操作
- Z) ]% e/ }1 c4 SMaple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里. # M# B: r9 G9 q  z1 B, K
5.1 写入文件
& P" q! F. h0 _" }. _3 U+ {5.1.1 将数值数据写入到一个文件
9 G% X% ]% v" T$ s2 }: b3 U4 F如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令.
( ]5 z* E+ Y5 R若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);& V3 I- v5 v* D5 T# o& y2 f
> with(linalg):
  f. _6 F+ B! ?. O> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);
* I, _# Q& M* t9 R% B ' O) Z4 P) Y: @! U2 j
> writedata("e:\\filename.txt",M);
! s( w. Y( [5 d而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);8 e$ J! Y: `0 Q( o5 e* P9 e/ {0 e' p
> W:=matrix(2,2,[1,2,3,4]);
5 ^6 \" z. s- T. N2 ^- L* b3 U 5 Y- z: W) n" C/ l; f* s5 ^
> writedata[APPEND]("e:\\filename.txt",W);
& U1 |6 E4 A& C- t需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.
( ^; P6 d' l' G# ]" G另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);0 O& `0 T: Y  {& \0 _
> writedata[APPEND]("e:\\filename.txt",W);
/ F; E# h  u" `+ v5 Y: o3 _> writedata('terminal',M);
, W  c. s9 h. U- _( m5 T3 G  G1                   2                   3           ! D% }1 e- Y0 O0 b$ U+ b$ u: F
4                   5                   6           9 @; O& _, C8 V# q1 b
7                   8                   9   
3 m' k8 I3 p- S6 Q+ P5.1.2 将Maple语句写入一个文件' ?; y4 @4 Y; }( g0 k, @
如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:/ }# p, U+ M( g1 p4 z2 ~
save name, "filename";
* i& H1 z( f) R$ Nsave name1, name2, …, "filename";
6 q- I# E9 e4 G' Z. M& n若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.
; z% A! P5 a9 `2 A+ e! M$ M9 ~" I> myfunc:=(k,n)->sum(x^k/k!,x=1..n);
  O7 i8 Y1 Q" z7 f5 q- p& D( K" w, Q / `; s- {% r9 C; r& v0 O
> myresult:=myfunc(6,8);
" o: g/ |1 M( x; @7 [
( U3 s' I0 Y! Q> save myfunc,myresult,"e:\\test.m";! n3 V/ Z. D) m& p; X
调用已存m文件用命令read. 试看下述实验:
- S, c& x; X% X- F7 ~' c> restart:# r. ~4 o3 f* q, Q# l+ n
> myfunc(6,8);5 ?' q/ T; ^6 A( j1 Q$ Q
; H! P2 V# R: ?
> read "e:\\test.m";& M: Y+ F/ L0 |: V9 `7 e# w6 Y
> myfunc(6,8);1 Q5 O& ~6 k6 I( f8 H5 L3 D

, U9 I3 R( G% T1 [# r0 G> myresult;2 T0 R6 M, [# j7 ^/ N0 T* w

+ c7 M) G. `2 M! I3 l2 H    而存为txt文件时则将整个语句存为一个文件:
. R0 Y, x' t4 B- K9 H> save myfunc,myresult,"e:\\test.txt";
1 S4 h7 N% x4 @' g2 A( z5 h4 f> restart: read"e:\\test.txt";
; t4 M7 S# r7 Y
  I2 M0 D: l+ u) h  E# w( S
4 k% z8 F! Z- H0 I5.2 读取文件
5 B+ |7 Z6 A5 W8 S在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.
. @1 T0 ], l4 s) I  L9 {5.2.1 读取数值数据& k, p  i+ s' O% |1 c  a9 f* u% G
如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.
- K, l* H# b# v1 x, B" K" e从filename文件里读取n行数据时使用命令: readdata("filename",n);, u4 g* [, x/ S$ {* b9 q( l& F0 g
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);) t) i$ T( L: u9 [
> readdata("e:\\filename.txt",3);
) p2 |, y6 O* V& t4 l1 J . |2 H) q! V6 E. i# r: p( U
    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:
' L0 x, y$ l5 L> readdata("e:\\filename.txt",[integer,float,float]);
( d8 Y5 h7 ]0 |: B; _7 v - T) v2 v* e$ |0 [& n1 }! B
下面再看一个运用大量的实验数据在Maple环境绘图的实验:
. i4 [3 t, d8 R( ]" |) X> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:2 |- u* d2 ^9 V" f& o
> writedata("e:\\data.txt",evalf(mypts));
4 [# l- w0 x) w: X$ }5 T: r( ]> dots:=readdata("e:\\data.txt",100):3 \* v" L  w( Z" }9 U
> nops(dots);
& U4 ?8 s5 ?2 N, [8 ]# V% { : l, t! c8 [( V8 N
> dots[1..4];, |# [& P. L3 @0 q- {6 l$ P& V, _

  b  f. Z3 M; Y  k4 \( n> plot(dots,style=line);
" t( N- j, Z% O6 b( \& e3 R : X4 S9 ?+ n$ ^3 x& \; f2 Y# r
5.2.2 读取Maple的指令
# I9 x) d( [4 A# g8 \在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:
( [( }  r3 {' K" c. M, Y/ t, Bread "filename";
& J$ d5 j5 d1 [" `$ d如下例:! Y# x' M6 Z' t
> reatart:& e5 \% H- x$ u/ N
> myfunc:=(a::list)->add(i,i=a);
4 p" p1 A' M+ `5 h+ A # @/ a/ O- G) E. g( I! q
> avg:=(a::list)->myfunc(a)/nops(a);
& K' ]/ N/ Q) r: ~" ^: l
/ T4 @3 @' ^- e7 a  {7 w% a> save myfunc,avg,"e:\\function.m";% A2 u2 i- y: J
> restart:4 H  ]) M1 c* p1 o5 F
> read "e:\\function.m";
& o! Y. U2 |1 V+ T. M7 R> myfunc([1,2,3,4,5,6,7,8,9]);& z0 ~# [" d; }) u( u, b1 L

8 y9 k' W9 O1 x" B' b  V> avg([1,2,3,4,5,6,7,8,9]);6 w" b' q% u/ x5 A, w

( M' ?: L4 Z# B% Q0 _: j5.3 与其它程序语言的连接2 O: k: ]0 K- g/ O9 C6 v( A) b
5.3.1 转换成FORTRAN或C语言
0 }$ Z* ^8 e. o调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:6 O, |/ T2 R. A5 n# n. \; I2 B
> with(codegen,fortran):
; S% j( D9 a9 v% Bf:= 1-2*x+3*x^2-2*x^3+x^4;
7 V! l: ^2 ~, a, ?1 X9 p/ p + \9 g. s4 K/ F4 w3 f0 X3 s8 z. M2 h
> fortran(%);) _: p1 ?% S0 B
      t0 = 1-2*x+3*x**2-2*x**3+x**4  {8 X) t3 {. `5 B& R" C5 x& S
> fortran(f,optimized);
0 H5 w- b1 [3 R" V3 T( i' M      t2 = x**2
* ~6 z- f6 ]) ~& ~- D, K, _      t6 = t2**26 b' n: R$ F. x
      t7 = 1-2*x+3*t2-2*t2*x+t69 z: z  ]7 v% Y. x4 j) ~# J- J
> fortran(convert(f,horner,x));
) _6 \4 d+ q- g, ]9 e      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
! g& n0 {4 o1 c2 k" [而codegen程序包中的C命令可以把Maple结果转换成C语言格式:8 }, ^7 s( G7 I, M' e2 V* X
> with(codegen,C):
5 q5 ^  R" [" n7 [" f9 @f:=1-x/2+3*x^2-x^3+x^4;
$ h) @+ t6 i/ n* S" L2 Q + H5 p+ P% [( D1 U  F
> C(f);4 D' f' ]' c- |% ]1 x$ d8 p
      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;
- u4 D" \5 l, W% g3 R> C(f,optimized);& ^! V' J0 q4 R9 A! U0 Z
      t2 = x*x;
4 x% I- B) {9 H! e9 e9 y' o      t5 = t2*t2;
0 M" ^2 g- o/ A4 ^      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;
3 J$ E* w5 S. Q6 n8 b9 _2 s9 zoptimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.- w3 h& k2 W0 F. n8 i  q- D8 {
5.3.2 生成LATEX( f( |3 l! h+ V9 d) e* |1 A8 w
Maple可以把它的表达式转换成LATEX, 使用latex命令即可:
& |8 m8 n, V2 R2 J/ s1 ~> latex(x^2+y^2=z^2);
" |' J4 Y; ]  j% l% ]{x}^{2}+{y}^{2}={z}^{2}4 s' {) R& p! q$ M1 i+ u5 i
    还可以将转换结果存为一个文件(LatexFile):
1 D3 ~; h$ Y# l2 t> latex(x^2 + y^2 = z^2, LatexFile);
6 Y3 a* w/ H3 a2 a; `    再如下例:
3 J, K0 P, C8 f> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));* X  V* X. \$ X4 ?
\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
7 k2 R/ N8 P! D4 G0 I+ T9 B3 i7 W
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年!
    & l, p7 u  b. \8 b) \, y1 g
    5 ^. C' P& V& V+ c
    - C, L+ j3 K1 [' J4 _5 R1 X
    回复

    使用道具 举报

    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-5-25 06:08 , Processed in 0.992490 second(s), 103 queries .

    回顶部