QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

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

( w$ B, b. H& I! H( Z. P1 i! k, Y
' e5 E% d- f* l- ] & I% E8 ^) o# |7 |/ \
- M8 E% k8 o: b9 ?5 S* c

  ]% }8 ]: J9 w/ c- H4 j2 a   B' \" r# b" @9 e4 C$ S& I" h% }
% M, B7 B# w  S1 p3 f! o8 u% X4 L
# ^3 x  F9 H$ A* O5 c' K

0 ?: b$ k* N) W: w1 X
* A8 r9 \. _: r6 y2 H2 t& dalpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu
' U; I$ r0 h" I: @/ r
6 _" f* F3 H  |- X; a* W
8 e, B2 x4 s8 i. C! \
" J8 [2 X. p) C; g6 R
" Y, ^1 m- u- }5 s
0 [) k$ C& S" b7 M/ p8 ^$ g; \   m; I5 h$ H9 K' H

" a3 A: D  |- }2 o - Z& Z; u" Q& E; l! b

# T3 t3 @8 f7 |; A9 s
6 A* t( E% y& g5 F' C* Y1 y1 t  `; [1 m 6 O0 n6 |4 d) y* T; U# }. c5 o( ^
6 x0 \' A1 b2 G6 i. i4 ?4 _( b
: ~( H! s) ~- o$ a& G9 `
nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega' q2 N) R8 T" `- w( d4 X
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:
4 f% L. W0 v/ K> for i to 10 do
6 U6 x" m5 S' P, jprintf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));
9 z7 q0 g7 t2 k! F8 j" Ood;, D" K) k: |# R
i=+1 and i^(1/2)=+1.000i=+2 and i^(1/2)=+1.414i=+3 and i^(1/2)=+1.732i=+4 and i^(1/2)=+2.000i=+5 and i^(1/2)=+2.236i=+6 and i^(1/2)=+2.449i=+7 and i^(1/2)=+2.646i=+8 and i^(1/2)=+2.828i=+9 and i^(1/2)=+3.000i=+10 and i^(1/2)=+3.162
) V# t, U7 w) a% j" T9 I' a7 A! G+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:8 ?3 Z0 J3 Y( F; i2 c, c# o
> for i to 10 do
& T6 }1 B1 Y5 Aprintf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));
' U* e% S- i) w$ O2 w; Tod;
0 G' H8 i7 A# Li=+1 and i^(1/2)=+1.000) k( e* |+ b) c% R" _* N
i=+2 and i^(1/2)=+1.414' X$ F0 L5 i# B2 L) ]: S% F+ d
i=+3 and i^(1/2)=+1.732* I' ?6 l! v- h' n/ S- X
i=+4 and i^(1/2)=+2.000% J2 P- }. S" Y
i=+5 and i^(1/2)=+2.2368 [9 e( b: ]4 x5 |1 E) q$ Y
i=+6 and i^(1/2)=+2.4490 z) ^8 z2 |7 c
i=+7 and i^(1/2)=+2.646
- Z$ e4 r" C7 }- S% }i=+8 and i^(1/2)=+2.8284 t: G. |4 C& t  }4 y- l2 }/ r' [" I& u
i=+9 and i^(1/2)=+3.000; g! p" ^/ z6 p% @# P# D! b6 }( s
i=+10 and i^(1/2)=+3.1621 ?: d! H" M/ c5 ~' ]9 A. E* I
再看下例:将输入的两个数字用特殊形式打印:/ e* ?8 s& [, `
> niceP:=proc(x,y)
+ ^* ~8 C' W7 r! r, Dprintf("value of x=%6.4f, value of y=%6.4f",x,y);
4 n; W: o( M/ a, X3 o3 pend proc;
  F0 R) G% ?. C# V
3 W$ i% o! O: P) r7 @. M) A! S> niceP(2.4,2002.204);$ ~- B0 @+ f6 v2 {; ~
value of x=2.4000, value of y=2002.2040
# _5 S9 K( d* C! ]& G1.4 Maple联机帮助% I, L+ Z* T  ~4 w. U1 I; }
学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用. & x; B+ E, e2 k9 w  v) R! y5 d" u% X
在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可. " ?7 h' A. j1 ^( ~* q+ o2 [+ z
2  Maple的基本运算
, E0 w, o& F% j7 k/ Y  L) g2.1 数值计算问题
. J& E7 B: K( \算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”.
7 m4 [  l9 t: \在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.
' i& n# C# E) O' t$ ?: }Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算. $ Y2 Y- t" c( I+ S
但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明. . x6 @( l' R$ Y* f5 \
第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   
& a) z3 p8 D# L% l. ~* C> 3!!!;' O  P' q' p! |' M1 m. a& k
26012189435657951002049032270810436111915218750169457857275418378508356311569473822406785779581304570826199205758922472595366415651620520158737919845877408325291052446903888118841237643411919510455053466586162432719401971139098455367272785370993456298555867193697740700037004307837589974206767840169672078462806292290321071616698672605489884455142571939854994489395944960640451323621402659861930732493697704776060676806701764916694030348199618814556251955925669188308255149429475965372748456246288242345265977897377408964665539924359287862125159674832209760295056966999272846705637471375330192483135870761254126834158601294475660114554207495899525635430682886346310849656506827715529962567908452357025521862223581300167008345234432368219357931847019565107297818043541738905607274280485839959197290217266122912984205160675790362323376994539641914751755675576953922338030568253085999774416757843528159134613403946049012695420288383471013637338244845066600933484844407119312925376946573543373757247722301815340326471775319845373414786743270484579837866187032574059389242157096959946305575210632032634932092207383209233563099232675044017017605720260108292880423356066430898887102973807975780130560495763428386830571906622052911748225105366977566030295740433879834715185526028053338663571391010463364197690973974322859942198370469791099563033896046758898657957111765666700391567481531159439800436253993997312030664906013253113047190288984918562037666691644687911252491937544258458950003115616829743046411425380748972817233759553806617198014046779356147936352662656833395097600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 B! ~4 i0 _  T9 w) Y
上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?
( `9 k. x  r5 H+ r为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式9 T9 e. {: e- j2 p
. Q: G# l( O5 O8 p: \0 K' P
可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   ( ^4 B# B9 ~. l7 \/ r

" @0 C& ?8 t! ~6 t; c这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性.
* O" {( k6 k7 i另一个例子则想说明Maple计算的局限性:   7 |- n, r6 _) A1 ?, p
  
& J+ k! M& n) c& x2 @% Y# nMaple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   
0 }$ Q( I  k* [- m) c
$ i: i2 @( Z" U1 h' E( \显然这是错误的. 这一点可以从代数的角度予以分析. * \3 Z% ^2 R. o; g" o4 C, s) u) m
不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果. 5 R% ^; g2 E, h/ u/ E0 s/ F+ C
另一方面, 设 , 则 , 即:* G1 |) D( ^6 H& U

) k, u! a% D! }; Z* ^显然 有6个结果, -2、2是其实数结果. 0 I) ^  x, Q* ?* l
这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性. 1 q0 z, d& v* {6 j0 h, D
尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的. 5 x5 x- T* K8 o! \' m6 @! F
2.1.1 有理数运算
- c0 ~7 A  u+ j2 G4 g作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20).
/ q4 z- D% v. R* }1 M+ R7 Q> 12!+(7*8^2)-12345/125;; |- K. s; f% U2 Q0 a
/ m+ K( {$ r6 V) H0 ?9 ]& ^
> 123456789/987654321;
2 b' X: l' `6 T4 N/ j
$ v" v+ Z  @& Q0 r. N  k> evalf(%);
7 T; A% ]6 f$ r: W
% N* y! X* Y: J5 X# Y4 z> 10!; 100*100+1000+10+1; (100+100)*100-9;$ Z0 y$ b0 C, W% X
6 o- K5 D+ Y8 c  f  E8 b

7 n7 M3 c8 s+ ^
( a1 ]* d$ ^' H) L> big_number:=3^(3^3);7 r- K" O: \! |; z

, j9 ]9 {& l0 ?* `" n2 l> length(%);
! F- k1 B  F" l/ d) @
' |7 H% t# y' q% Q5 B+ _+ L上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   
1 r6 D" K, v, e( {1 M* z    1)整数的余(irem)/商(iquo)7 O# ?6 X# |* H. E
命令格式:   / ?  J( A5 `4 t* b% L( n' c
irem(m,n);        #求m除以n的余数1 V+ ?( s- G  p
irem(m,n,'q');    #求m除以n的余数, 并将商赋给q0 |! m8 \( s- ~+ Q! N8 i
iquo(m,n);        #求m除以n的商数
$ Y9 t# O: G$ Fiquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r6 K4 i* c. t5 ?3 M! q; q* m6 K! z
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值.
  g: \" w4 w# O- P+ h> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q5 c- g% z) g6 [5 R

  h0 p7 C8 C7 P* B' h> q; #显示q9 M3 x7 I; g3 z& ^

9 K& a) L9 z% X: c! K# _7 R, M% r> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
% P0 z( l2 p' i( Q( R # ^$ U- x# Q0 _$ _& o- t
> r; #显示r5 r2 u+ `/ g# G& S* M; X6 O

: [# M- W9 t/ b5 X- _> irem(x,3);
: i, h6 K5 _" u & W9 r6 `9 F% Z/ A
2)素数判别(isprime)$ \+ t+ V& L1 X& W* L" [5 F
素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); 2 C# g! d+ I0 u; @" l( ~+ l
    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数. ' T3 O  b  ^- T3 z; @, t% j
> isprime(2^(2^4)+1);  o2 f! f# D: U" L; x0 f
" s  j0 s# D+ `/ z/ S9 e: Z2 D7 |. G
> isprime(2^(2^5)+1);
1 n4 o% J. ]% H* ^( O' v# n
' h9 K& d8 r) ]& q上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. - q/ d3 p# V5 g! ^  D0 y
3) 确定第i个素数(ithprime)
& x- g" a& P0 Y$ a$ Q( @3 u若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);   
% W0 e) C4 }5 r6 E4 o' G1 r> ithprime(2002);+ ]6 W6 V4 V9 F! x/ B
% D9 v1 z; }" K& R7 u, {
> ithprime(10000);2 q- w+ E% [! v& |* Z5 K
. n" K1 d5 X& p( o+ P% |
4) 确定下一个较大(nextprime)/较小(prevprime)素数
+ p/ h1 a/ h0 }% S* U, l4 h  O当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
" ^4 S- ^2 w/ v  s) R" W: L6 L! hnextprime(n);    \2 A" N& i5 i
prevprime(n); # B' m0 [1 }0 v5 }9 u
> nextprime(2002);
+ Z: ?2 q+ R/ |1 X" W; p2 k
0 }! c- l4 Q4 H> prevprime(2002);
! [  L: o9 L( Y, g( D; u
7 b) f9 O1 D0 x( G8 t5) 一组数的最大值(max)/最小值(min); y. H' a& c9 ?/ k: @. `
命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值
4 p/ V5 K! j" l! u8 |! C             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
/ z- r$ b1 M7 X; ]2 g" c: ^> max(1/5,ln(3),9/17,-infinity);3 |$ K# X3 j7 B1 E0 l/ W1 Z
" T0 m; J# g. `- _% j$ S
> min(x+1,x+2,y);) ]. m1 i; @4 S- {7 A

6 t% O- E; L6 I6)模运算(mod/modp/mods)
* R" ~5 L& w( \6 V  v9 C命令格式:  e mod m;    # 表达式e对m的整数的模运算
3 b" r0 \6 F& B4 o7 t+ Vmodp(e,m);  # e对正数m的模运算0 s) \5 a( X$ u/ v4 w) F; J! \
mods(e,m);  # e对m负对称数(即 -m)的模运算
  X1 o0 J; Q. C. v+ r5 J3 ~`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价4 z- H8 j" E5 j9 m9 c$ [
值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/.
  S. b0 x  z! G7 R! F> 2002 mod 101;8 w8 r- k( V9 h2 Y- V* l* m* I0 L

* A  M; i8 f) H0 _6 D7 O" ]- x> modp(2002,101);
2 F3 ^- W! R' H- P# t& K% M
/ W8 ?( u; |7 ~0 x) e& [> mods(49,100);2 c' S- f$ a$ U5 \. Q

" @# o1 T* j+ h3 p' b% J> mods(51,100);8 V: g/ C+ \0 Q  K6 v& C  j
7 o) D) G: H) e, h
> 2^101 mod 2002;  # 同 2 &^101 mod 2002;( L( d3 u$ [! ~7 e5 I& f

( ^7 V9 M! R7 |. T4 c  Y6 r7)随机数生成器(rand)
# u9 F; ~2 u3 T- b/ |命令格式:   9 N* T* |+ g7 @* a  Z+ S
rand( );    #随机返回一个12位数字的非负整数9 ?7 W. z, n5 W3 X7 |! ^4 ]
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数
5 r7 n; g( n. g& D( A7 u> rand();/ ^* g# p+ u  ]6 x; k) j; U( T

' r2 \7 {! B& h9 \$ Y# S> myproc:=rand(1..2002):, L7 w- J1 G- [1 o2 y( Y; g3 t9 [# L
> myproc();8 z: d) s5 p" p2 U0 j% Y! w
8 R- u) A, v/ S: T/ J8 L- Y. a: A
> myproc();
- w( `4 k& V9 z9 Y2 h+ R
1 a: ^. {7 L# f" [( _9 b) A, i+ X    注意, rand(n)是rand(0..n-1)的简写形式.
2 q) D2 P" U$ C7 z7 c/ o2.1.2 复数运算; w, B' H8 s, Q/ g) r- ^
复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   
+ ?. f7 `, ]" O" ^/ d1 S! l# v> complex_number:=(1+2*I)*(3+4*I);( V% @6 E" w# ~7 h- |  K  c% M
! q4 w) g* c# f7 u6 x0 _
> Re(%);Im(%%);conjugate(%%%);argument(complex_number);
; s7 T% T$ [- A3 \, v# Q2 ?) D & v! t* S/ K1 J, K# ]) d

/ p& }1 r4 j7 g! F1 g( U: f 7 @4 M0 A8 \# Z5 d, v1 q
, w; I' b) d3 w
值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%. * y  K0 i* i% Z8 I1 b. X# w3 D
为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   
! m$ h1 C: ~2 T  u5 \9 \1) 绝对值函数& Y) m5 M6 G( Z! n; L( h% R, q
命令格式: abs(expr);  + {: q$ t. ]& ^1 s/ q4 ?/ R
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.3 G* I" V8 G: [! i4 g9 W
> abs(-2002);    #常数的绝对值
$ K0 [4 j; ]7 J. B3 n1 e) z
) s2 \3 ]) B1 N. q$ Q, ]> abs(1+2*I);   #复数的模% n. \# R+ K1 E2 d

% x% @( G4 E' _1 v6 \> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值
1 g" W1 D! m3 R% r6 u- z # ]0 [/ V& ]' W1 L. O& W2 U
> abs(2*x-5);   #函数表达式的绝对值
; P3 M6 q7 g" |% ` - G2 s8 T4 Q) v# u
2)复数的幅角函数) M) {0 w# b6 p' T9 f
命令格式:   argument(x);  #返回复数x的幅角的主值
6 I# M3 \3 O0 B/ j+ Q6 g1 J> argument(6+11*I);
; B% l' w" @0 f; a+ e! h4 u
7 T& G* _. B. d5 P+ ^> argument(exp(4*Pi/3*I));+ k6 h" d- r! P) F) l1 t

- G! X! G' D. ?0 B, P  _. u  o  L3)共轭复数
2 X1 M9 Y* ~% j( F+ ]5 O  v4 Y2 g命令格式:   conjugate(x);  #返回x的共轭复数
: ~2 p( ~" {/ Q> conjugate(6+8*I);8 ]3 B0 e2 n% s4 J* _+ u9 k! J' n
+ ~4 n& |# N! H$ o
> conjugate(exp(4*Pi/3*I));& ]+ i( M0 {1 l0 n$ c" m5 e

( S$ D1 ]* v+ i6 ], I  y8 e2.1.3 数的进制转换
8 n  l; c; F4 H! y数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可.
: }" {1 X$ u" p. x/ U9 {. j命令格式:   convert(expr, form, arg3, ...);   
( K" \& K( T; Z其中, expr为任意表达式, form为一名称, arg3, ... 可选项.
: T' b; ?9 N/ ?" Q: I$ j! D0 m1 Y下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述. ( z, M# D1 z7 Q+ u4 B8 |4 q
    1)基数之间的转换2 i- m3 G3 o1 s% \$ o' Y' [
命令格式:   8 x. e; x2 n8 X0 G+ L
convert(n, base, beta);      #将基数为10的数n转换为基数为beta的数
) @3 v1 ^) s- b2 r% V& C8 A( k8 j    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数
# r0 H) Z6 c9 Y8 Q" ~1 y2 U  [> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7# O2 S8 {2 F! Q0 ?" c
" ]+ G# r4 y5 _7 _/ P
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数- C3 R8 I! ?! M

( K2 |0 q2 v) A4 Q0 u' [> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)
5 S6 r5 s* W3 _, H  C9 F: u 0 o6 d7 ~. ]2 Z) h: g
    2)转换为二进制形式
% F4 ^  }* P1 s3 m* W* S命令格式: convert(n, binary);
* O6 l" J/ C# M% i4 z0 P其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂. 2 e/ ^7 D8 }/ ?  j
> convert(2002,binary);   ! s; }- ^. x% e: m7 J( R: }6 g: L" j
6 c% Y3 D1 u5 r
> convert(-1999,binary);
0 a2 G0 U, p- N; P0 E! o8 s; h
8 s/ D6 v: w4 h# N, r4 A: [> convert(1999.7,binary); & V; M% Z% M2 P8 [. k
$ T+ Z1 d3 g) M! Q2 n0 o( j! [
3)转换为十进制形式# L8 A) `7 J4 R! G
其它数值转换为十进制的命令格式为:   % Y5 @+ J* l  g! Y. Y  T5 q  m2 \
convert(n, decimal, binary);   #将一个2进制数n转换为10进制数* i) `2 t- \) b- ?  V# j' b
    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数4 A, Y$ `! Z; B; J
    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数* X( [; \; C5 M- g6 i3 c5 H' K
> convert(11111010010, decimal, binary);   
* U/ R0 N* b* W2 O+ \) T: c" @ ' o# F& j+ L7 l1 l1 t& n) V; \: e) s
> convert(-1234, decimal, octal);           
0 F% s+ d/ o* g $ U* |4 G- ^3 v/ c% Z4 R4 E- `
> convert("2A.C", decimal, hex);         
& {1 n4 F5 s% }   h6 h. @$ ~4 H8 c- r: x
4) 转换为16进制数
; q4 ]3 u& D( e% u( g0 Y! z将自然数n转换为16进制数的命令格式为: convert(n, hex);   , {$ u- s) O7 W- \0 W% W
> convert(2002,hex);  convert(1999,hex);; z% k* [. y& U% M3 |( p
3 l2 \( Q) x& V9 }" P" s8 D
/ n8 N" y/ C  W- }  {
5)转换为浮点数  u: ]" o/ D4 s; W$ a4 E- q
命令格式: convert(expr, float);
3 E- ~+ L, t: T注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用.
/ N6 l2 j; q& C# J3 X; n> convert(1999/2002,float);
" t! i' C! ?/ ~9 M! y ( m1 t# i( ]/ e- N* N/ m
> convert(Pi,float);
5 s  H1 v/ {1 P0 e 3 M$ a1 x9 W2 C! }
2.2 初等数学5 S- C( Q/ o4 k- m4 g- y( f
    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识. * R# q9 [  l& _% U
2.2.1 常用函数) B* |9 g1 I5 {! Y/ O8 w. t
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   ( ^1 w8 K" u/ S+ C. y
指数函数: exp
7 F" b- F' p" p% E3 u0 h一般对数: log[a]
2 b/ t% ]1 m& K) d) c自然函数: ln
; q. J7 [5 g9 E: n3 V% E7 o) d+ ~常用对数: log10
3 }+ j5 o$ R9 w% v! |) u- N( D平方根: sqrt
# |( z8 a: g$ }6 ]6 V* ?绝对值: abs2 J9 Y; e) n2 o, r( @; [
三角函数: sin、cos、tan、sec、csc、cot: g" |& N) ]* |. c
反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot
+ r$ s. D5 ~1 K* Y2 u双曲函数: sinh、cosh、tanh、sech、csch、coth
: i& n/ k/ j. f& n6 z* m1 ~( b反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth
$ E* Q, w3 X6 e  u; {贝赛尔函数: BesselI、BesselJ、BesselK、BesselY' d$ H$ C1 c: |# u+ t
Gamma函数: GAMMA
! z+ p, E1 [- d+ Y  [( J误差函数: erf* K3 L: ?2 T% F
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. , n' B, m$ E& Y
1) 确定乘积和不确定乘积
, p/ ]$ S. u: ~命令格式: product(f,k);  9 S  F2 n* n& u0 c% J, [
product(f,k=m..n);  0 e9 o: \6 S4 K9 E8 m. ^) i
product(f,k=alpha); $ ~8 {) @3 i1 c) [
product(f,k=expr);
% R) H9 S9 o% f4 U3 F$ l) D- A3 a& D其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
( {  ~) g* Z7 Y. d' a) ?" d> product(k^2,k=1..10);   #计算 关于1..10的连乘
3 ^0 l8 b+ I" ]- f5 {( ]
3 m, ^+ K3 |* g5 }7 U" D# L% g> product(k^2,k);         #计算 的不确定乘积6 j. ?$ l  b2 d0 h/ z0 ~

6 R! V5 f0 ]% _# t3 g* @> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘
/ I3 y, B  l& O2 i 2 r) b- B6 k1 t* U5 U* e1 |
> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘
7 G/ \0 l. f1 f: z6 [) D
) U3 M- ?: T' b3 @% J> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式
1 j0 v: l  e' Y 0 l7 x3 S5 U/ v: ?
> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积- U/ g# U* F* K' ]1 X. [+ P

: Y3 T! |( p1 D$ x/ i5 L; b    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
# L9 [. S; m( d4 k: v! U' t5 u) @> product(x+k,k=0..n-1);
- J8 _1 w8 m8 x ! d1 U6 I  y# K. k3 M, c% d* _
如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   
+ ~0 h( V' q9 B3 |# P) A! d& `> mul(x+k,k=0..3);
/ t/ x, R( R, j
: j- S. {, R/ q% \( d1 F7 ^2)指数函数* l( G! k* k! K% \8 I0 d
计算指数函数exp关于x的表达式的命令格式为: exp(x);
3 x& Y4 l7 O* h7 B+ X- b- o> exp(1);+ |  P- E: q3 A5 G. A! N) n
) U6 J1 |4 r  T0 }* }) D0 W
> evalf(%);
9 d, ^. ~4 W0 P( h  y1 Y
! N0 Q0 W: Y; R$ r& C* p: r& }> exp(1.29+2*I);$ Q" d$ l& t) u3 Q4 ~

  C1 G% q# V) }2 q> evalc(exp(x+I*y));5 q3 F9 K% K; w$ w2 `, s

2 ]& Z" S0 c, w4 n3)确定求和与不确定求和sum. T, K" B" X  X- \
命令格式: sum(f,k);  0 W* m( `; B- W( r, j; v0 w# ~
sum(f,k=m..n);  3 s0 \! W( r* N- F/ _6 G1 |2 E
sum(f,k=alpha);
; G( v, A5 v4 a* J) C- s( L3 k) @sum(f,k=expr);
4 r% r; e$ m% ^  F其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
+ N7 c  u! @! Z/ y6 \; A> Sum(k^2,k=1..n)=sum(k^2,k=1..n);  ~# O3 H; e1 v- o* l
2 M' ~$ I' b  ^
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);
; W6 R5 M2 n, n. a' `0 J ! O% C# y8 d- a, G" W- B* l" k# k
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);
% A1 k& D2 \$ U2 q! S( a5 Q : F$ v! j: K% p0 h+ h) j3 y
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);0 m2 ?% T: M1 ~& z4 k

3 Z% k- w- p1 Z  L> sum(a[k]*x[k],k=0..n);
8 r% K/ F' V$ e9 ^; I+ ] - ^2 K1 K8 @6 l/ h) N
> Sum(k/(k+1),k)=sum(k/(k+1),k);
; R" I3 J8 \. F
. w, s$ q: M- G. r) L1 b> sum(k/(k+1),k=RootOf(x^2-3));
# r$ Q8 j# N1 Y6 V% e) B# L , T9 y) K4 X; a& r% ?1 G2 f
sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的.   S4 ?9 u# B; [" n+ P: F5 A
> Sum('k','k'=0..n)=sum('k','k'=0..n);4 N! P: r" ]; V% |3 u: ^. M1 @

8 I3 c1 K( b1 z) T如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   
% y. p" k/ {& \2 ^! r: Z8 H) t> add(k,k=1..100);- y4 H' p, v0 M; z4 o
# y0 ^  m+ y( y0 P3 r. G
尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令. ! `* r9 V. w$ q* ^1 l- u
另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性. ( T+ D8 j8 }7 r: N, T1 O7 r3 I: V
3)三角函数/双曲函数# o# W, y/ O) h# s9 p! [
命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);
: D9 t' O% t" q8 O          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);
" w8 L! a$ `0 h* @其中, x为任意表达式. 3 R5 a, u" F* @4 h' i2 h' @
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert." F# ]4 h0 Y# Y3 z5 s) h: @& ?& O
> Sin(Pi)=sin(Pi);
* M# U6 P& c2 a: R! |7 d
; K7 F" e- Y# x* ]( H, M> coth(1.9+2.1*I);
. |  A/ r; W& j( H * F+ E  ^5 g; A: ^
> expand(sin(x+y));     #展开表达式
: Q* t( d! o9 Q3 X3 f0 I9 v& _; I3 \
) ~4 c) w- F# a/ @+ O2 C> combine(%);        #合并表达式3 ~/ Z, Q0 _: C( D- d# Y
- U8 {# k0 \# k- j; K
> convert(sin(7*Pi/60),'radical');0 U+ o/ Z# h$ M7 ?; C: m
0 G. _( g( r& P# {8 B9 b
> evalf(%);6 \# j7 p" L: Y0 P: q/ X/ G
9 ?; h9 Z4 }' D0 a7 y! R
但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.
" o1 E+ C" F8 Q1 z! I4)反三角函数/反双曲函数. T5 a) U3 l/ `) O* D0 X
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);
1 D3 P  J1 K$ ^, M9 [: Y3 ]/ R     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   
( g% _2 K2 g) ~7 H; J3 G4 barctan(y,x);6 B% F1 \! P0 K1 a4 b, K) x  a  f
其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算. ) H$ e( N" f) d' N- m3 s5 H1 J
算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin., W% E/ V+ d- P. v" ?
> arcsinh(1);
" Q! A. N3 k$ c: ~9 n' i 3 k7 |) E* [$ `$ z( ?
> cos(arcsin(x));
9 `; u) P! K& l" p+ }3 H$ Y9 O . ], t' b! p8 Q) L- ~1 g* ?
> arcsin(1.9+2.1*I);* b" O+ O9 L( I$ d* G/ ?
6 ^( D: M+ j! a# X! {
5)对数函数
+ h+ g! t8 C' }命令格式: ln(x);           #自然对数6 A. z1 H! U1 r  p
log[a](x);        #一般对数9 E5 O1 h" t/ H2 ]/ P9 q3 c
log10(x);        #常用对数" c6 i. G1 t4 {9 E5 I6 l) f
一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   
% r4 N8 S  @( {" l1 Z+ E  (其中,  )
+ n0 D! q; K$ B+ U> ln(2002.0);/ g6 E1 v! ~8 l) }8 @# ^/ h, @

! l3 X/ x* g: }( D3 ?( p) L5 \> ln(3+4*I);
0 h- f" \# s! V( K6 P. ^ ( |3 p1 O: H! A( ?, M- R$ [$ u
> evalc(%);    # 求出上式的实部、虚部' @; O$ o+ r/ G2 e

! {: t6 ^4 g9 l7 ^  s3 v+ s1 L> log10(1000000);
% m+ e# q$ \4 Z  W) I2 p0 M * p1 K5 R& O& w* ^! B2 D( [. U
> simplify(%);   #化简上式
7 P, v5 \9 w& ?+ K, Z
8 n& h& }. ^2 P+ w2.2.2 函数的定义
1 d. c9 X9 U+ {, lMaple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   ' v3 ~- N% V  k& U
> f(x):=a*x^2+b*x+c;
5 B* L) ~9 G! L: g0 v0 a & J, u: V! Q+ E8 J4 S* N% |
可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   ! S: z" Y( t8 x; _) R6 ~$ b
> f(x),f(0),f(1/a);8 {2 r5 G# q; X1 S
* H# t( c8 ~0 w+ B
由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   ( O  v" t! o( g% P9 Y
> print(f);# n/ ]% E. ]8 w- |

' R% G( ?- @3 X  t* |, E事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. ( n5 p  r: `& a; E- a
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   
$ N8 i& d1 Z; i8 O4 [> f:=x->a*x^2+b*x+c;
* Z+ R3 W% \  q- t$ q& e1 C
1 I. \5 t1 b$ ^; \" {$ j7 ?> f(x),f(0),f(1/a);
0 t: O; B% N$ p2 A
6 |1 G5 P/ J* j) a' \多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). & J% B; o2 F' K2 V7 C0 U6 O1 e1 H+ y
> f:=(x,y)->x^2+y^2;$ N3 I- L7 A# T4 ^) B
4 L. W  w1 H/ A0 Q
> f(1,2);
5 s! |; ^+ ?, }6 P+ u; T2 i" u# v 0 {8 q2 M& }" }+ M1 @: A7 U( F# `
> f:=(x,y)->a*x*y*exp(x^2+y^2);
" k5 m2 c. Y' v' V - ~' H5 x( R9 T7 ^! A* ?
综上所述, 箭头操作符定义函数的方式一般为:   ) X; x2 r. {# A3 y- t- C) j$ R  J
一元函数: 参数->函数表达式
6 O. x# a6 \. \0 I多多函数: (参数序列)->函数表达式
; {9 p+ i1 q, `" X/ V无参数函数也许不好理解, 但可以用来定义常函数:   , l6 j( s8 a: G, k. A! M
> E:=()->exp(1);* m2 b2 Z# }0 T& A3 L2 r9 ~3 |% W4 A4 L
# i2 ~7 ]- L3 }$ Y& J5 Q
> E();
$ W+ d9 T% V# R
$ E: ~# B: `7 n: X> E(x);! v: M) Z8 S! |

. L, u: F# O( S: D' M8 o6 t另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数. & m9 K# s" R2 W# ^! v5 E/ R% _
定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);         
4 `; Y) h# t' x5 [3 ]4 I定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     
, E4 T! @3 ^$ Z  V1 m4 R, M5 m+ e> f:=unapply(x^4+x^3+x^2+x+1,x);
: x% V4 u( h  E* r% t9 T7 j" u  ] % `+ }& A4 b7 E( n
> f(4);
0 A6 O8 `! Q" }6 l/ X( R # M7 D5 `0 W8 F' k; [3 g
> f:=unapply(x*y/(x^2+y^2),x,y);+ u3 P. T; q9 w# b( U
" J! E  c+ l( K3 n& b
> f(1,1);- }# {, h+ F8 M6 N4 ]0 y
1 r' g2 f; w! n6 l
借助函数piecewise可以生成简单分段函数:2 d3 M% Q6 g$ x$ g) c4 L3 M
> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);% d! L, w2 ~2 A
( [$ l  [: |& R8 t0 g+ C- ^
清除函数的定义用命令unassign. ' U4 v$ q5 B5 S8 Z/ }  L7 W: L7 ?7 r) Y
> unassign(f);. _+ x4 d; H; P8 H; M% N( n
> f(1,1);
+ m+ \3 B1 Z1 ~' I( V
7 B; }; Y: M% S- o2 B0 e除此之外, 还可以通过程序设计方式定义函数(参见第6章). % \8 a1 }- @) a! A, |
定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:) B. [# D( _- ^0 \
op(expr);         
6 A3 ?: S$ B7 }, f; lop(i, expr);         
# u! ^& Q8 @: h! ?op(i .. j, expr);      
  d! b8 j/ G, a) o1 _nops(expr);6 T/ y' |, z3 C+ \( Z/ i
如果函数op中的参数i是正整数,则op取出expr里第i个操作数, 如果i是负整数, 则其结果为op(nops(expr)+i+1, expr); 而i=0的情形较为复杂, 当expr为函数时, op(0, expr)返回函数名, 当expr为级数时, 返回级数的展开点(x-x0), 其它数据类型, op(0, expr)返回expr的类型. 1 p% f$ [( A! g& ~9 i& s" Z
命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.
7 A* {3 q# N/ H' B命令op(expr); 等价于op(1..nops(expr), expr); ' V1 v" N- ]+ |! w1 t  Y; n
特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...)); " |8 ~% `8 f& B8 I- q! F! I
而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
" {  J2 u( e- \3 o' R) e> expr:=6+cos(x)+sin(x)*cos(x)^2;; d* P; u0 z8 L* \; D  ]5 h
( c) x2 R+ l8 K1 d" o6 K( N; |
> op(expr);* J7 Q0 Q! {& t7 F/ L* ~/ @/ R( ^8 x2 H

/ @0 L& W: g; D7 X> nops(expr);
. m$ `8 h) \  W5 s4 O 1 B. S) K. T; d: B8 Q5 q/ S  K
> p:=x^2*y+3*x^3*z+2;
5 a2 E; A; q  o$ n) X' o2 n5 i   _( Y4 a( D4 f3 s
> op(1,p);9 A9 L7 K6 e' O

; Z; O  X/ `& j% ^4 N> op(1..nops(p),p);
$ l! P0 c$ L; G* _: N* ^3 b7 L7 e   Q# E. r  u  F8 R
> op(op(2,p));, w6 w9 R! h5 o9 C/ O9 |: A
  Z( \# ?- `% |( \$ {- C+ F; @
> u:=[1,4,9];
9 @  h" {8 f, t4 a2 h' U 4 j# p8 P: E$ p/ x( }+ _
> op(0,u);6 g  |% f4 e% Y* p; U1 Q
- ?. A! }5 |0 M# Q) y$ v5 {
> s:=series(sin(x),x=1,3);
3 G# I- R/ m  g3 r1 N9 }
8 W! n: ?8 t0 V" Y1 H% z' k/ _& s> op(0,s);+ ]; M7 x9 I) a" x2 D) D; @
       
! N* U( R# M: r$ Y) {3 `& K> nops(s);
) J+ ?" b  ]0 }( r1 d: z
& e0 Q) C7 E' j2 i+ r下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:
6 V% s2 ~+ n6 h& K) A5 |$ Q+ Y6 M> op(x*y*z);6 c. @3 {  D+ e8 L) S- Y% c0 L
$ W! h$ A% o% I
> op(x*y*z+1);
& h1 i% r& Z: Y+ ~: D
0 H; E- Z& Q9 S% q( T8 h2.2.3 Maple中的常量与变量名
* A/ d: ?" F: c; f为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   # m3 S) D4 \2 d$ O3 D4 z
> constants;
5 {2 u  U# A/ n; M
* {6 A5 Z: v) ~6 [0 v" }为了方便使用, 现将上述常数的具体含义列示如下:   
6 J. O3 r3 _+ N: E( Y常    数        名 称        近似值
8 t. ^0 `! q1 q# T8 v) H0 G圆周率 0 k, g  C( R# T  b& I
Pi        3.1415926535
5 c5 I8 ~$ _. c& W: ?Catalan常数 1 Y' w' |4 a! P# z, V) O7 s4 p; W
Catalan        0.91596559427 @1 h8 l  {' u' s
Euler-Mascheroni常数
% {& j$ s& ^9 Q: o( r# I& igamma        0.5772156649
( G3 U8 ~3 e% A9 O2 q, s0 `, L/ {
# C! b- P4 j' q9 winfinity        / m" B% I) T6 V4 A% ^8 `/ l
3 G* X' F0 K1 H' D% A8 Q! V* T# x- _
需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取.
5 C4 G. v. ], Y7 s( f% r3 N在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.   `; T" T- h. S# _
值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. 6 f. y  s7 v0 v+ [+ g
在Maple中有一些保留字不可以被用作变量名:   
2 r/ w" L# y$ r' A0 Hby      do      done     elif     else     end        fi        for      0 h) ]. T$ F7 A+ M6 C- x
from    if       in       local     od     option    options     proc         ; v3 D! I5 \6 Y
quit    read     save     stop     then     to        while      D
' A! F& v% w" J9 RMaple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名. " w  J( C4 X" N, W$ G; Q- m
另外一个值得注意的是在Maple中三种类型引号的不同作用:   . |9 Z; c; m' M/ C( @& h
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;   
3 u1 ~: p, i  R% ?'  ':   界定一个暂时不求值的表达式;    ! N: Q$ x. _& D5 p$ w) |
"  ":   界定一个字符串, 它不能被赋值.
8 S  ^2 m  I" c0 u+ L2.2.4 函数类型转换           
$ H, R  V. G0 j' M6 L/ [  l, D% o. z7 b函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  
2 ~8 d1 }  b3 w" ]! v3 X& i    convert(expr, form);        #把数学式expr转换成form的形式
5 p3 ], A$ C. F/ s, b7 gconvert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos! d9 E2 u1 D9 d$ E2 I
convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   : m! o; ^' f4 I  o
(1) exp: 将三角函数转换成指数8 a1 e+ O8 T& q% n7 W! ]
(2) expln: 把数学式转换成指数与对数! }, L$ t4 I( @% K! g+ k
(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式
' G7 e( {( x4 |) h2 ]) Q(4) ln: 将反三角函数转换成对数% R' I6 g. V$ C, L& M
(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式
( T8 {- T0 l- H$ y' h(6) tan: 将三角函数转换成tan的形式  N% y1 h! x2 @3 ]& L/ ~# T1 g
(7) trig: 将指数函数转换成三角函数与对数函数
& Q" \7 i- |1 ^5 y> convert(sinh(x),exp);   #将sinh(x)转换成exp类型) s" @, {" F9 Q; x& Z
  w5 F4 R; V  R! E9 i1 K7 y  t
> convert(cos(x)*sinh(y),exp);
& c$ k, X: Q/ @: G! ?' @
  I! T3 N( T5 U0 _# c6 R7 u: d> convert(cos(x)*sinh(y),exp,y);9 x8 g, s% k7 p3 D; O
6 Y$ t* J7 F( P+ m5 G( k: Z3 x: B
> convert(exp(x)*exp(x^(-2)),trig);' o0 K3 `; w# w, r$ h
( V: k1 ?4 Z" ?( U2 v
> convert(arcsinh(x)*cos(x),expln);: C  d& m. c$ H: y) n  j. |

% U3 V, q; Y. Q) d: y6 h3 h( P: U> convert(cot(x)+sinh(x),expsincos);
0 g' n4 @3 U& @# o0 `  |; B : j& R! L9 @1 @4 v
> convert(arctanh(x),ln);) |: z+ p9 g, F6 k. k7 I6 A

4 o& T& l# @: e( B1 Nconvert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   
5 E3 J" N% o  N' u: J> with(codegen):
! ~1 r& F+ c) {# i  s> p:=4*x^4+3*x^3+2*x^2-x;
+ s3 v/ e* {# Y( X. e1 u, i. z; x
4 i" @7 u6 f6 t0 S- R, d. ]. n6 _1 m> cost(p);* i* B. S) K) a
5 T" _. o6 T. }8 o4 i+ P
> convert(p,'horner');  #将展开的表达式转换成嵌套形式* h# J% R5 P  i0 O, @: F
* ~2 j7 J. E& w
> cost(%);
+ k$ `1 ]) {. d 7 B, r' {1 V, B$ r, M
同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量.
& j  l3 i5 X& X, f, x& z* |$ Z> (1+x+x^2+x^3)/p;
- ?1 q& p) R/ J0 d; d% G 6 g9 ?/ y4 u; N0 u$ \
> cost(%);: j' c( c# ?: t8 g
# f7 m! P1 ?9 ^* J6 r& N/ @' Z
> convert(%%,'confrac',x);
2 K! f+ J- a1 Z
( x/ z2 i1 M$ @* A> cost(%);! x; s9 W$ U, z8 R1 x- A+ Y. l

4 k1 i' ^% B$ A; Z% y在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式.
0 ?: ?7 ]$ Q1 u. G  {> convert(%%, 'parfrac',x);
. t  J& O* h; B; H0 r# s
8 m& ?8 _. [/ g7 ^8 I' W> cost(%);& ?% P! C! N$ J0 E8 m7 Y% L( v8 V2 M
: n7 u6 B( E; `- j2 X
而把分数转换成连分数的方法为:+ t) D/ g% `$ W3 [/ o. {1 Q% ?9 k
> with(numtheory):
0 [( J7 r! x9 q( |9 h> cfrac(339/284);
5 N7 p# d+ P6 C* Q; m9 W) Z. k! M   E: i2 x5 h4 i2 g5 H. `" h1 S
2.2.5 函数的映射—map指令
- c$ G0 }# G% a0 M9 |: }7 h% ?在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:! {$ |! h( H4 X# X' c
map(f, expr);      #将函数f映射到expr的每个操作数
8 U, x( ?, s6 i5 g& jmap(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量
- k3 k" q7 ], x1 h3 d4 smap(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量
( X2 e* A+ N( n9 y, q9 E7 Vmap2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为
. m5 F" F' A: _0 e第3个自变量…, an为第n+1个自变量来映射函数f+ e7 F3 @2 m8 @* y" v+ ^9 E
> map(f,x1+x2+x3+x4,a1,a2,a3,a4);
% Z; N6 g5 l7 Y" V( s$ f. C6 k
; w8 `* J% E3 x, F0 [  ?> f:=x->sqrt(x)+x^2;% P) _0 T" o3 j) N: p4 g7 Z
$ h7 Q" p! `$ h6 Z; o1 ~
> map(f,[a,b,c]);( N, Y/ w8 h1 z% X: \% Y

; f9 A7 r" k8 ]& u" M> map(h, [a,b,c],x,y); 8 k0 @/ \' `' n8 Z* J- |
0 S8 P: P( n+ p
> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);& s/ x+ n6 D' k, p1 U
/ y% l3 B5 y  u
> map(x->convert(x,exp),[sin(x),cos(x)]);. x  D! ~8 o. {9 X& L

: f4 K0 U( g. |1 N$ k上式的映射关系可通过下式理解:
4 D0 S) v+ |  m- J4 x" u3 z' k1 [6 E> [convert(sin(x),exp),convert(cos(x),exp)];
& o9 [3 E/ v' U5 o" ] ! P; p. R2 t8 W$ a
> restart:
; A+ O! g! W+ ]( v7 `# h) Y7 Nmap2(f,a1,x1+x2+x3+x4,a2,a3,a4);% j6 V) U) {+ ~5 g9 t; _1 y7 n

7 q! w* M" x" f> map2(max,k,[a,b,c,d]);
$ k4 L: K! ?$ v1 W* Q: v3 d % n$ L2 E# {! Y/ n( [' \1 `
再看下面示例:   
: |! t% N# l; F  F9 S$ ~# N> L:=[seq(i,i=1..10)];
& k% r) U( ^& g4 v+ q- v' u 6 C3 x- l( d6 N. b
> nops(L);6 z" d0 l+ o# E5 \7 B

* |0 f9 a: N# d> sqr:=(x)->x^2;; o- N) D8 P$ C: A+ b- v" C
# d$ k; |% u* N, A& z& C$ I4 J
> map(sqr,L);
# @0 }0 W6 A$ R: k 6 P% ], b2 ]3 `8 V  Q
> map((x)->x+1,L);% _' N; V& z9 b

+ z5 j1 K6 W9 v3 g3 y4 x) \> map(f,L);+ M& m0 _* J  J/ d+ W& A
' u4 Z8 z2 _- l: r4 x
> map(f,{a,b,c});  U) F- G/ b- S1 L

( e6 y) @1 `) j+ W4 o7 R. I> map(sqr,x+y*z);" A# P$ w4 {2 C1 p
; O9 ^! u. }/ f* ^; j2 B
> M:=linalg[matrix](3,3,(i,j)->i+j);
. `, J& S( y6 A( S
% g: L, F) `& S, L2 `  W- k> map((x)->1/x,M);3 u4 c# y0 l, `! y  w% u+ O
3 f0 q4 V6 W# Q9 ^& @
3 求 值! y5 s9 e2 O  Q
3.1 赋值4 w1 d1 f' l  V
在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. 4 U3 C( P, v: Q! B! |2 s
> p:=9*x^3-37*x^2+47*x-19;: u$ [7 ~( o- G5 O; x
2 c8 ?8 }% r  }& |. k# V
> roots(p);
8 x% {: R. L/ Z( i$ h  J& t
% Z: D8 e/ b- w1 I0 D; C0 L' Q> subs(x=19/9,p);1 N, \. T0 b2 I. J* ~
8 G3 L: a" b/ O. {8 W
在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证. ; N8 R$ s+ ^( N
3.2 变量代换
8 V$ \# j1 S/ P在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   
2 b. n9 z) K: @7 o. Psubs ( var = repacedment, expression);
  ~$ M# D, u% R+ c6 k7 b* x) b% ^1 R调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement.
1 f8 w6 Q& f# e& g9 z8 L. j2 E> f:=x^2+exp(x^3)-8;
0 K( y5 g7 U; Z& u9 x
3 f/ B4 w3 Z5 K+ d: S9 @) ], x3 U> subs(x=1,f);
  y  }6 t, \# Q) x9 G, y 5 w  Y0 p% T! p( m9 I2 e; F8 R, A
> subs(x=0,cos(x)*(sin(x)+x^2+5));+ `4 J' ~$ _- j1 i) y5 V4 X0 A

' e+ f; ^0 `/ Y' w    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   
8 P6 ~9 |3 s6 K! G$ ]3 @# _6 I> evalf(%);
' h  B# |7 ?* ]( O5 V# N2 m 3 `9 s  l& I& y5 K3 @8 v3 a
变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   $ n8 L. ~( N5 p. y8 J4 O
subs (var1 = repacedment1, var2 = repacedment2, expression)" ]: z& `0 S1 ]. ~4 h1 @. K
调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   
" ?0 N" Z( P( G% W6 m8 k# nsubs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
/ B3 w2 X9 l& L9 N! |下面通过例子说明这几种形式的替换. / l, }1 a. ^, q% h6 H
> subs(x=y,y=z,x^2*y);              (顺序替换)6 L; Q. T3 ]+ x1 A

) u! A  t/ z" Q" p# }6 S> subs({x=y,y=z},x^2*y);            (同步替换)
3 f$ V3 P6 Z3 a
/ C, [- G8 u5 Y> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)' M6 f6 H4 a! l* X: A
  c1 l, Z. x0 j# E: R8 G7 p. E2 C
> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)
% Q" s4 x/ x5 l2 @0 Q ! t) V$ |; F& z  r% z" z1 y
> subs({p=q,q=p},f(p,q));             (互  换)
9 o6 b  |8 M2 n! q; i6 E. A2 c; X
) _2 P  K2 E: d: T3 }0 U; b3.3 假设机制
' N5 x" b% ?' P, T: ^$ {! H+ vMaple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.
/ L) X! y. a( ]8 ]在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);
  e/ V( `  n( D3 E0 x/ x函数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);”也不会产生矛盾. + t5 ]: Q  {( t( `6 K
> Int(exp(-s*t),t=0..infinity);
9 r9 a; b; ?+ r+ {: x# ] * n1 ?' [( c0 f. q
> value(%);
) j7 H4 A' P) bDefinite integration: Can't determine if the integral is convergent.
' _* L4 A! L3 R4 H2 P! L- qNeed to know the sign of --> s
- h: Y& q# b& m8 t4 FWill now try indefinite integration and then take limits.
- s* ?& A. U& W  d% `1 c# `0 U( h 3 W( P% v# Z. z8 }: ^
> assume(s>0);
' c% u. F: H+ T> Int(exp(-s*t),t=0..infinity);
$ c4 ]# ~$ Y, a9 m+ ]; M' N1 w 4 A) h' r% s: P$ w& ^* d% o
> value(%);) c2 G( }# M- x5 ?* x1 c
: k7 m0 a! [' X. g2 K0 v5 Q
3.4 求值规则, m6 {$ z1 G3 ^8 A; h
在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
8 d/ W, \, v/ r3 Y- V> x:=y;2 a% o2 Q% s4 y$ @- B
, c* C/ I9 ?& R& E! g; o; s9 {
> y:=z;, p1 b- T/ M0 ^4 A

5 P: ]# p: w: o9 R& J4 K. S> z:=3;$ |# h; j& T( |) R2 O# u, ^$ N
6 X# [# }$ m9 I2 @- w0 ], g
> x;
+ q" x, Q; O6 A& z$ m5 F 1 b1 o) d" ~; |# {' a: o
> y;8 u$ r) y9 Y# c6 i' V
3 m* h6 i2 z; f
> x:='x';
0 C/ Q( m6 p! o + d# \% w' f4 V9 `; h* _
> x;
$ s0 U' `( V# E0 @+ ~7 ^9 d$ ]- Q3 \ * C2 C4 s$ S" d& x" Q
> y;! G3 V. M8 O: O) U' D1 B

5 ]* G" s. q" _# c& u! B7 {对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   
: t% ~; W2 Y& s  c' J" O1) 对表达式求值
, V$ Z7 J7 m" P4 G) ?% z9 c命令格式: eval(e, x=a);  #求表达式e在x=a处的值
1 f% n! Y& d& C; \/ V             eval(e, eqns); #对方程或方程组eqns求值
2 d; L1 J" R; j3 j3 O% `5 d             eval(e);      #表达式e求值到上面两层  R* ?% V5 w/ H  l) o+ E) O
             eval(x,n);    #给出求值名称的第n层求值
, o/ S( ?* ]$ c: L: C6 S. o4 p5 w> p:=x^5+x^4+x^3+x^2+x+73;
- t" L7 w8 s8 I# R' f; |1 v  {5 ~# P
: G$ l9 S" W' W7 l> eval(p,x=7);3 I; c  |; o& i' f! S3 V

7 ^4 b) z: y) L/ p  l> P:=exp(y)+x*y+exp(x);  b9 Q2 d- x5 z. |# ~& \" G
. f' r1 l" ^* G% f1 F
> eval(P,[x=2,y=3]);
3 _8 A) E3 n: K1 C' b$ ?
: ^# E! g) F9 R* @; p/ ^! o1 L    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   
- B8 N, V1 [4 s# |1 A; Z> eval(sin(x)/x,x=0);2 w' J' I; ?" g$ ~1 T$ u8 B* @
Error, numeric exception: division by zero
, h: a/ E! }9 b  w& M; q' y    下面再看使用eval进行全层求值或者对名称几层求值的示例:   2 o/ v! |4 d9 m2 ~
> a:=b: b:=c: c:=x+1:7 `9 N7 A) n9 S- p& ~- I
> a;              #默认的全层递归求值- @3 R2 j* P4 M1 s5 O3 M
4 _6 F4 M. p# p! Q6 t1 h9 V
> eval(a);        #强制全层递归求值& J, O' z! V! q7 ~9 ?& C
3 J- O9 O; Z1 i& Y9 U4 @
> eval(a,1);       #对a一层求值
4 N; N. S( N. q  R$ m $ I- F! T# `+ h/ L! G; T
> eval(a,2);       #对a二层求值
  G, w2 S' n! ^2 m  K
) c) S2 `# D3 `+ Y> eval(a,3);       #对a三层求值
- [) \  x# B) V) U- a
7 Q4 p5 H$ a4 h2 S$ |0 Y> eval(a,4);       #对a四层求值
9 k5 Z/ v& ~6 j; Q8 { & Y- }7 ~3 t. r
    2) 在代数数(或者函数)域求值
4 b# Q1 ^5 G" s: O" w+ R% S命令格式: evala(expr);       # 对表达式或者未求值函数求值. n+ p4 ^8 m+ T+ r2 x. F
             evala(expr,opts);   #求值时可加选项(opts)
- N" q4 y/ r- `所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式.   u! \9 l" C1 {* W8 ?' `
代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   : z6 o" p( ^8 P1 B$ f; b& r
> alpha:=RootOf(x^2-3,x);' L3 g( |* X" |) f. ?  T
- k9 Z! y6 _% r  ]4 v
> simplify(alpha^2);
9 V$ V, ?7 X0 i! P
( N1 w# ?) H8 E; ^. E在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:* Z; B8 i; s& s9 a+ w* j: m, ?
> alias(alpha=RootOf(x^2-2)):  j; J. Y% V* T; }& K
> evala(factor(x^2-2,alpha),lenstra);% o7 L/ Z% X- z6 l. X

; ]- z) B  A6 ]! t> evala(quo(x^2-x+3,x-alpha,x,'r'));
; W' T4 e4 L" _( u* Z% R
: y2 W4 j3 h: V+ t( a2 P! N. p+ g> r;
9 ^' E" h, c5 u1 A' L
! C7 p8 e) Q% Z5 i9 H% }6 x/ i/ o$ N> simplify(%);& V- \. p3 H: k. Z
$ ?+ T' s( Z/ v5 P7 N/ w" v
3) 在复数域上符号求值) b  ~; Z; @! \, z: M& Y. c8 ]1 |
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:+ j! G- K1 v7 h! ^/ }* Q* ^
evalc(expr);   0 v5 X; S5 J- n% `7 F
evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2. ( b% x7 B2 i* o' _8 W
> evalc(sin(6+8*I));1 G+ J( ~# C' X9 ^* R  d: P' L0 i% d

9 @9 F, T! u7 f( x/ z> evalc(f(exp(alpha+x*I)));0 A& g9 v: m% b8 V
0 m: y% Z1 B5 |8 v. k4 q# ^# {" F
> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));. q* B# `/ c6 p" I5 n
: H# \+ z/ \0 T, o9 b& E8 K  O
4) 使用浮点算法求值2 b- r$ B' j" ?
浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     
3 g) ]) ^& i( b8 {! {1 A> evalf(Pi,50);   
4 Z3 n+ s" p# \+ q: ]6 c3 I
, Q4 G2 [( w" D0 M> evalf(sin(3+4*I));   7 c2 x: V0 ^2 ?

  P8 {% p5 n" s+ p6 u( e4 R6 R; ?; F> evalf(int(sin(x)/x,x=0..1),20);
5 W& V* v( A4 F! ^' Z' w9 F8 ?7 | % s; n% D; F" C, K% L
5) 对惰性函数求值
$ V4 M( K+ s2 B0 u) g把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   " j# E' i* Z/ u- q( W+ j) s0 |
> F:=Int(exp(x),x);
' ?/ R5 h) x# B+ j  y7 f
# j! n+ F. Q. ?/ E8 K> value(%);
& Q) y3 D9 b. j! G% k
# E3 |' d' }! Q- s; ]& d$ [- R5 B9 l! j> f:=Limit(sin(x)/x,x=0);* B7 E/ U- t5 C! \

1 ?( K+ z  ]. F7 @> value(%);0 n! ?7 k! i  ]/ f
! e" D' z! C: h. f, N, }, U
另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   
( q) e% P6 S$ i# s# x5 T8 J, |> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
. F( u! T) \% U/ A2 o% z1 m) ~# l5 ] . V4 `9 X4 D& G0 d0 m% {
4 数据结构7 j; H/ M7 C3 q  y. Q( f
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表.
( l8 B) x/ c$ ^  _8 X0 h* w0 P" E4.1 数据类型查询2 ^/ G1 a8 S  d( F  Y
在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
# ~9 a6 Y! o: _whattype(expr)        # 查询expr的数据类型* D' Q7 M4 G1 C+ u" O
type(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false
2 e; ~0 G  q" v: a7 S> whattype(12);$ V5 j, v# m# {- h% Q

2 T5 L7 N; P- r> whattype(Pi);
/ s% g4 ~' a$ L# |, B
' E. i( H3 Q8 r( U> type(1.1,fraction);
2 V' t0 o  ~, v
1 y' \" u5 G: i1 g6 o! m; N> whattype(1.1);$ s+ _; H/ ?4 A/ o8 x
, u! ^0 G; A0 f5 u; Q9 h! f& y$ P
4.2 序列, 列表和集合
$ `, M# s" y7 E, Q( ?4.2.1 序列4 y- i$ f- ]9 ~! h
所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
0 e& K( v5 k1 A. o4 X- v> s:=1,4,9,16,25;2 y  ^8 `, T1 h/ R# t3 v
3 H" ~- K3 @/ g9 e7 k/ {
> t:=sin,com,tan,cot;: z8 A: Z) p+ k& F- k( D

; e* B3 a1 g: [9 p一个序列也可以由若干个序列复合而成, 如:   
7 c- H+ q# [7 i3 ?( f# q9 `> s:=1,(4,9,16),25;6 b/ f0 \- z2 S# n
! W- ]* Y& s# `( e! ]
> s,s;2 r4 e1 o/ D- Z: X

, {% H4 [" `; z3 ]5 j而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   
8 N3 B0 n6 R1 Q% f> max(s);. K% o; u( H7 Z4 S% E* w3 @8 q

4 G9 q& k* k, D  }> min(s,0,s);
  Z7 p' p6 X9 L4 a$ N 4 N: m7 B& R& X$ Z% |! t- G- [7 o
值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中. + t1 c+ W& n" N( g' p+ L
> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;) g0 P8 @# x+ `9 z5 a
$ r) B& v/ j% h& F
> op(s);
  z, t4 A/ b1 @; d1 ?Error, wrong number (or type) of parameters in function op
- _9 b. G/ i; f! _3 ]0 o9 ]> nops(s);" s+ j" L( n7 r( A2 |; j
Error, wrong number (or type) of parameters in function nops
; H5 j$ |$ Y% c) J+ P) v& X* u> op([s]);6 }9 z/ w0 S* P5 s; {  h! w

" ?& \& z0 m8 ~  G> nops([stuff]);
9 i. X+ q# [: d4 g3 N$ A8 q; b
# R8 h6 C8 ], O4 k函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   
# R, K( b3 P: e8 B  x" n) _& X3 Q0 Gseq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)# e: q! y8 m0 H1 ?; j! j: j
seq(f(i), i=expr);  # 生成一个f映射expr操作数的序列; H6 q0 c8 ~" t2 a% m+ R- S2 x: a
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列3 B: e2 [# S% h" q4 q
> seq(i^2,i=1..10);
2 ]& e  y( }2 t4 P, }9 y9 C) H $ C$ m( a% C4 K4 ~
> seq(ithprime(i),i=1..20);9 ~7 v' _8 X0 f' v# T1 h
3 L& i5 _/ X$ s* c( ^( |
> seq(i^3,i=x+y+z);3 u* T) h2 m7 g' R* n
: P! x. z! H6 D+ X$ e
> seq(D(f),f=[sin,cos,tan,cot]);5 y5 z) V! o$ N8 h) v  c7 J  Z

( G/ u7 v$ ~: q: E5 n, v> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));; I9 W+ I1 s* \2 R+ ]% Q
( V" U) v" S1 S
获得一个序列中的特定元素选用操作符[  ], 如:   
! x( e( w0 Z- n; x# Q5 j% b> seq(ithprime(i),i=1..20);
5 }0 \  a' ?; t& o& c- Q 1 K/ ?* {' G" w* d
> %[6],%[17];
2 K" H2 r' s/ ?- f; V6 a
4 r3 ]  N( Y. H4.2.2 列表
4 Y0 m1 f" K! }4 }: Y列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
0 T, I5 L4 q8 i# q> l:=[x,1,1-z,x];
4 h. O% Z5 X6 {$ _: n& b. ]3 k ( B8 G0 F9 z' ^. i- B7 t
> whattype(%);  y" ?% O' Y9 {% f
7 v; T. N) l0 y6 p! s* g
空列表定义为[ ]. 0 D' ?8 M. a) {) R; ]
但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   0 |8 r8 ?5 A* ~8 |1 ]4 `
> L:=[1,2,3,4];3 X; o' d& B2 u% u% |$ U
% |3 @9 d& Y( h" C/ V$ r- h
> M:=[2,3,4,1];
% U  x0 d! T, v1 O8 L
$ `1 Z& C9 }! s; T( {" n8 B4.2.3 集合
, S4 w0 D1 |/ f- F4 r! I集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合.
: n0 K& t5 z" L% C4 R> s:={x,1,1-z,x};5 Y. Q3 [9 ]/ O4 v' w

# G3 o( V8 j7 A; W# T7 D> whattype(%);* q& P  b; \5 d4 C4 E/ S7 }0 V0 ?

8 F4 f0 K% j" E3 D) y/ X空集定义为{ }.
4 ~# \+ L0 Z5 G: p  d$ ?6 K函数nop返回列表或集合的元素数, 而op则可返回其第I个元素.
  k" U6 r! \2 y1 w6 l" Z" O> op(1,s);! N5 n4 Z! K2 h% W
. n, F* L2 L" D5 s1 n9 E
> s[1];+ v. }6 t' N6 N+ ^

) x7 a; D6 V( B- K( z! C" }> op(1..3,s);
, P# Y- m1 {# h / ~# j$ F  a& j  T4 l
> s[1..3];4 k/ o2 r, f( F5 D5 B* [& N
  X; O! L5 e; _8 j
函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
% S& o* N& e) E> member(1+x,s);. S. |- `4 t& W8 R
7 x" I' [, [: W1 j# g' G
可以通过下述方法在列表中增减元素:   
1 V6 N8 @& L9 S$ o% C2 d7 g3 z1 |> t:=[op(s),x];
) P5 Q, \$ W( \0 |1 t
: F! g6 _; m/ M7 V  N% Z( w> u:=[s[1..5],s[7..nops(s)]];- x5 z) e" ?# G+ ^. H
3 c8 ?# u% O9 k' K+ W
Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   0 ~* ]0 k& N% S# g, L' }
> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};9 x' D  t0 e+ n- _" z6 K7 K

4 [1 s6 V6 k! Y# [1 F+ w
/ I9 D! z& y- b% ?$ b7 P> A intersect B;
. ~' k' p# l9 H& o
3 Y6 d, \8 m& F> A union B;
) A3 c, p' ~3 M; r6 p& r5 G 9 i1 h8 a7 W. c5 W
> A minus B;
. k1 i/ m  b8 s3 P& d ' M  a9 ?; r8 s" ?. t2 B/ D
4.3 数组和表
- P8 q. j: ?  `) R0 ^2 ~在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
4 @7 x5 j$ p; ]    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的. 7 R9 C- g* t. e( D
> A:=array(1..4);
. x) X! m2 H2 |6 ^ 2 M( a) j. U; }7 r3 g
> for i from 1 to 4 do A[i]:=i: od:
$ Q0 J1 ^! a7 m3 Z> eval(A);- A9 [" {6 `) N7 R. D7 y* Z
; a) s4 T1 d8 z4 K; Q
> type(A,array);
$ _4 D1 x. W- h6 E8 O9 N7 W: m
: ?3 C6 X* B0 v> type(A,list);% }2 l6 H" S1 U$ J: r

; Q  h! Q6 d, L( j> T:=table();; _( ^& p+ _9 p

& o. b3 p8 x+ [> T[1]:= 1;, z- G9 y2 w% d. R

7 P- ]* \+ S( q! T& ]* d/ v: |3 r4 Q5 M> T[5]:= 5;
; E8 E8 q  t5 S+ X. A1 u
# ?( m, Q. s7 E0 ]8 B* D1 R> T[3]:= 3;7 s0 o$ `) U2 M' m( ~5 R

' C6 W6 v& g! E0 u> T[sam]:=sally;+ q( e( W# j% W; I2 V, C

: C7 R  Y' y- S& \> T[Pi]:=exp(1);  [' c- ]* q# \, M
- h8 e, \7 N) D, ~5 f5 a
> x:='x';" _7 O% v7 O% ?" f1 I

2 ~# v5 P, {$ s& r3 C  g> T[(1+x+x^3)*sin(x)] := 0;
, j+ e2 N% w) E$ ` # e: @. _8 Q* W& |. j
> eval(T);( R* M6 L. y9 X1 r1 c3 p
/ y5 G  p% q- G8 i
> T[3]:='T[3]';8 p2 F6 n; m. u8 t% s5 |
# ?8 J' n7 n. p+ _6 ]
> eval(T);
3 u8 q/ \! s. ]* i  | / E+ Z4 [. H) R3 |
4.4 其他数据结构
" \, S) G8 \& X1 G: B0 ^串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来.
% z& e; w# m; T3 i( r. K, G索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立. : U4 g0 b+ r( K; @" L7 w
> x:=T[3];4 n/ h  J. m' t* n7 w$ B
6 N+ b' y) ]6 w+ X" D6 X
> eval(T);
, J9 z0 T5 Q$ c: }7 U, B3 g$ D8 D % O, F% p, Y8 t- S
> T[5]:=y;4 @7 b! F0 h) M0 W+ j

1 H2 A7 N. b5 a> eval(T);8 Y& u/ o/ h, l# n" A% p( X; Y

5 R# D1 H) I! ^# V2 o6 v9 I& c由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     8 v5 n$ |* h& m
数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. $ U8 Q) X: ?  m. \
4.5 数据类型转换和合并7 N7 V' t! _  r1 h+ f1 H( R$ Q  a
convert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:     m. o% D5 c. a( Q* y
> L:=[1,2,3,4];6 T% a3 \$ O9 S9 J- D  B! D

/ y: y. e* P' `7 [$ C' O> type(L,list);7 n9 A" T. P# g$ `8 C

' a& l" d$ b$ O& `# [$ z> A:=convert(L,array);
8 z8 B. z% {) Y$ ]5 v# a
  V6 @3 f1 T4 x; s- k> type(A,list);
3 s* x, P! R7 R; K% y4 e
8 m0 C  {2 n8 d9 ~> type(A,array);
: v  p9 z! e; ]. w2 X# t ( ~8 k! z4 ^9 w& ?; v
另一个有用的函数zip则可把两个列表或向量合并:   
8 Y6 ?* H" ^2 q( H; J>L:=[seq(i,i=1..10)];
0 o! [  d: ~% i& Z2 J " G# `5 H( Z) x/ P  p# f- y
> Sqr:=(x)->x^2;* K3 `- g( w5 b. [; e

( U8 i: `9 g  P2 j7 w> M:=map(sqr,L);& ^8 r' ?2 Y' S+ z) F$ H( ^) L+ p

5 @/ z) B8 h- |> LM:=zip((x,y)->[x,y],L,M);3 |; P: V( X' A% v% d5 V4 {
$ }6 ~0 O0 u( f; E/ E) I2 E. h
> map(op,LM);! X( t  q3 E" q+ W
4 _& y' [7 L, B5 ~( t; t
5 Maple高级输入与输出操作
& L# @. p! {/ I' a+ h. Q4 c6 ZMaple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里.
  j/ W) Y' e3 m5.1 写入文件) H# a9 g+ m# o) I- w  C. @  Q8 j
5.1.1 将数值数据写入到一个文件
' a  S- c7 ^9 p/ `如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令.
" F, `# U# ?  b" H若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);
  y! `5 @7 y! e3 e5 D1 y> with(linalg):
- U& ]5 G& D4 |, v> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);
) ?& W  V$ U" x. W; P$ s7 B2 E
/ w$ h: t2 u1 M- t> writedata("e:\\filename.txt",M);
* ~, q, c( L9 i6 j* C而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);
+ M  m0 ]7 n7 S; T> W:=matrix(2,2,[1,2,3,4]);3 `3 o$ S' o9 ?5 L& M( s

1 F- x' x5 l9 D4 }1 D> writedata[APPEND]("e:\\filename.txt",W);
9 ?9 y7 D) w5 f4 @" E需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.* m; d6 N' l0 Z/ Y5 V! B0 X
另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);
9 z1 Z0 @; U8 M: f! P: I/ t% \4 M# @> writedata[APPEND]("e:\\filename.txt",W);
% Z; J/ e/ T* b+ i5 N) C0 z> writedata('terminal',M);
( q% p) v) K1 D+ l" R  ^1                   2                   3           
% H7 w/ @6 \9 `4                   5                   6           
# L' [' Z# Q' C7 a& j7                   8                   9      ~+ S. b% C- ~: V8 ]; v
5.1.2 将Maple语句写入一个文件) J- k  z( A( _: J, U
如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:( i* j9 D, h5 r( p# b5 b% n
save name, "filename";7 W- Q" h1 @5 T4 x- P2 k# Q) o% |
save name1, name2, …, "filename";
: M- ?5 G4 n9 g& @1 r4 Q1 n- f若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.8 |4 L# M- K9 R) J% T
> myfunc:=(k,n)->sum(x^k/k!,x=1..n);: U+ C$ O) i# ^* D; Q" Y
& n2 _" `1 V1 z' [' K
> myresult:=myfunc(6,8);8 r- f& n2 Y9 ?- [& j+ q/ s

: o" H+ Z  d+ D8 z- I- h> save myfunc,myresult,"e:\\test.m";
2 G5 h  `  n5 I1 }4 t8 ^: t' H1 R9 h调用已存m文件用命令read. 试看下述实验:
1 Y2 L1 c3 \% ]+ e4 N> restart:( ?8 C' m- ~8 i2 c4 \2 s
> myfunc(6,8);# g9 Y' @) I1 v( ]' C8 k0 W
- O" [! P4 N7 ], D9 J
> read "e:\\test.m";! }; v, V. N* [; P
> myfunc(6,8);# g! Z0 T. \7 X# ], n% V, [" \( `
  U! P# g+ d' F- F
> myresult;1 M2 j) `3 n6 s' M: K3 C
) H$ M+ |; a! y" M1 [
    而存为txt文件时则将整个语句存为一个文件:! y0 ~7 K' r: ~5 z& s
> save myfunc,myresult,"e:\\test.txt";
6 p# [* r- d( }) @6 Q2 ]; J  {> restart: read"e:\\test.txt";4 g' _$ N; o! B
% k# J  O+ V; F4 [* F& r

6 `1 p' a& Q) P8 \8 _+ C5.2 读取文件2 Q: I4 I/ z' a: ^5 s" Z( M
在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.
* f4 k0 x: F9 P8 t5 _* X! h5.2.1 读取数值数据4 f) H- ^: V8 g( D6 x2 c2 W" H
如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.; E  f. V, v% U2 ?1 [8 `' L
从filename文件里读取n行数据时使用命令: readdata("filename",n);
2 l$ y. q' W. C" ?- Y# l以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);7 r# ~  U' O% D9 i7 Y. T
> readdata("e:\\filename.txt",3);& l% K1 f; |. d6 e( N
; Z+ ]' j0 v, q
    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:/ \8 ?% C7 u. Z: X& Q
> readdata("e:\\filename.txt",[integer,float,float]);
3 l! @, `' u. [( V1 Q* \+ y 3 V5 }! P! o% o, d+ E$ n: a
下面再看一个运用大量的实验数据在Maple环境绘图的实验:$ R; u0 A3 ?# [
> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:
# x# |) s2 a6 V) `9 m( o* f> writedata("e:\\data.txt",evalf(mypts));5 f/ s8 y. }( J
> dots:=readdata("e:\\data.txt",100):
4 H8 s: N: v# ]! B9 E/ r> nops(dots);
3 C: _- H, {" B) B2 w 5 m: l& Y- ~- Y$ A
> dots[1..4];/ T* S4 q5 c3 X. e

4 g+ G" M1 U- U$ q( D% C> plot(dots,style=line);
* b& }' H3 M( m+ C. F" G5 z- F
( V4 E1 D2 M( l' X5.2.2 读取Maple的指令
( R2 C  q% d; x: w& U在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:. _3 ~, R- T; Z" v+ a6 j/ b
read "filename";1 i; F" G$ x- ]
如下例:2 J" z4 u) J/ {4 j- ^
> reatart:1 b9 m2 E% C2 W. \% w. f, _
> myfunc:=(a::list)->add(i,i=a);
+ Q! x) ]" P/ R* j- | * K9 v0 ~) ?2 p8 l
> avg:=(a::list)->myfunc(a)/nops(a);4 W2 C& I  m0 w* k# i- o8 [
- s/ B: I& g! W% _- ?
> save myfunc,avg,"e:\\function.m";2 n4 W4 H% w1 Q/ ], }5 J
> restart:1 A( x/ U$ R+ Q; @4 F
> read "e:\\function.m";
6 \- N, }' [2 S% O" q8 Q# D> myfunc([1,2,3,4,5,6,7,8,9]);
( k: _, R9 f" ]- d! Y9 O , ~- G6 ^8 L; G! W/ j- a' Z
> avg([1,2,3,4,5,6,7,8,9]);. @8 _" k3 _& F1 ^/ n2 G: a

9 s  o. h# g# L% z% [4 T5.3 与其它程序语言的连接* X2 p6 W- v1 m, S
5.3.1 转换成FORTRAN或C语言
/ W9 H+ R- m! j" _) K6 L: f) D; S调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:) c4 B4 ?. C9 z( D/ l% \
> with(codegen,fortran):/ m3 i* B1 d" Q" ~: ~2 |! E6 T, l( Z
f:= 1-2*x+3*x^2-2*x^3+x^4;
$ k- S+ B! `3 V- O8 h( U; l0 U 3 q; ~2 M; ^2 d8 F/ |& G
> fortran(%);
9 i  e# |% T4 X1 b      t0 = 1-2*x+3*x**2-2*x**3+x**4* g) f& {9 _/ X$ W; V" Z6 f
> fortran(f,optimized);( D  e0 y% d7 M3 W1 J
      t2 = x**2  n" f6 o% T5 ^7 f+ ~. P  L
      t6 = t2**23 T" p4 m# L3 D; B7 K; m8 C5 _# a
      t7 = 1-2*x+3*t2-2*t2*x+t6+ T1 G  ~- Q( k& l
> fortran(convert(f,horner,x));4 m+ N' l" v+ U0 g& z- J
      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
3 ^& {. Q8 \6 D9 Z) d4 C+ @/ ^而codegen程序包中的C命令可以把Maple结果转换成C语言格式:
* b3 b8 G4 E& J> with(codegen,C):
8 T" x5 Y9 J. y# nf:=1-x/2+3*x^2-x^3+x^4;) W" X) M% ^8 k+ a! o& O* y+ X

- D3 x9 w, s+ ]( W> C(f);
4 G+ U( I7 P' T& M# J$ s3 c  T      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;
& o6 m- C  E/ N; y) |> C(f,optimized);* M+ ~$ j3 i6 X
      t2 = x*x;. d$ ?& X0 e( B/ j+ P! X4 G
      t5 = t2*t2;$ s% @0 ]& H- \7 k
      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;
  _( x4 ~2 i1 ^3 [optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.# J6 w- e* ~/ Z$ D! ?: Y
5.3.2 生成LATEX6 q% L5 B$ Y* r7 n5 @; o' V$ e" u
Maple可以把它的表达式转换成LATEX, 使用latex命令即可:, E: p: A5 j, H. a2 r1 a
> latex(x^2+y^2=z^2);& P, A" ~3 `# X( A; ~
{x}^{2}+{y}^{2}={z}^{2}
2 ~' y& V4 h; B0 I# y% N) g& j4 G    还可以将转换结果存为一个文件(LatexFile):3 z7 m0 p9 V* p" R. c: |) s
> latex(x^2 + y^2 = z^2, LatexFile);
" {$ p8 b2 }. w2 e0 Y5 a7 E2 H    再如下例:7 K5 ^+ B' [) K; j% r; i. ^# X% c
> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));4 g1 M; z* r$ u; l( {
\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)1 w; s6 H) l* D" Q2 o
7 g( [7 ?. b  t8 m# _: L, f
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年!
    9 D3 `: q+ a8 F- k6 q4 r
    . L; |: I. K8 z
    ) m* l+ s* T& F: w2 D) {+ P
    回复

    使用道具 举报

    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-4-17 11:33 , Processed in 0.534517 second(s), 99 queries .

    回顶部