Tên name và xâu kí tự Tên là một xâu hình tự string of letters được dùng như một chỉ mục hay một nhãn để đại diện cho các đối tượng trong Maple có thể thay đổi được như biến, kí hiệu t
Trang 1Chương 3
Các khái niệm và các hàm cơ bản trong lập trình trên Maple
3.1 Các khái niệm cơ bản 85
3.1.1 Tên (name) và xâu kí tự 86
3.1.2 Biến trong Maple 87
3.1.3 Sự định giá 87
3.1.4 Ngăn cản định giá 90
3.1.5 Sự tự động đơn giản biểu thức 91
3.1.6 Các tính toán số trong Maple 92
3.2 Các hàm thường dùng trong Maple 92
3.2.1 Ước lượng giá trị 92
3.2.2 Đơn giản biểu thức: lệnh simplify 94
3.2.3 Tìm giá trị lớn nhất và bé nhất 96
3.2.4 Thay thế trong biểu thức: lệnh subs 97
3.2.5 Tổ chức biểu thức theo một số biến chính 99
3.2.6 Sắp xếp các số hạng 100
3.2.7 Chuyển đổi dạng cấu trúc dữ liệu (lệnh convert) 102
3.2.8 Thực hiện một phép toán trên nhiều thành phần 104
3.2.9 Xem cấu trúc và thành phần của một biểu thức 105 3.2.10 Kiểm tra một phần tử có thuộc một dữ liệu có cấu trúc nào đó 108
Trang 23.2.11 Kiểm tra một tên đã được gán hay chưa 109
3.3 Cách tạo lập hàm trong Maple 111
3.3.1.Thiết lập các hàm kép (hàm hợp, hàm lồng nhau) 111
3.3.2 Định nghĩa hàm bằng toán tử mũi tên (->) 112
3.3.3 Định nghĩa hàm bằng toán tử hợp thành @ 113
3.3.4 Dùng chu trình proc() end để tạo hàm 114
3.4 Các cấu trúc dữ liệu cơ bản 117
3.4.1 Cấu trúc dữ liệu dãy 117
3.4.2 Cấu trúc tập hợp và danh sách 119
Tập hợp 119
Danh sách 119
Lệnh tạo danh sách và tập hợp 120
3.4.3 Cấu trúc dữ liệu bảng 122
Lệnh tạo bảng 122
3.4.4 Cấu trúc dữ liệu mảng 124
3.4.5 Sparse, symmetric, những giản đồ chỉ định đặc biệt cho mảng và bảng 126
3.1 Các khái niệm cơ bản
3.1.1 Tên (name) và xâu kí tự
Tên là một xâu hình tự (string of letters) được dùng như một chỉ mục hay một
nhãn để đại diện cho các đối tượng trong Maple có thể thay đổi được (như biến, kí
hiệu toán học, các biểu thức nói chung, ) mà ta có thể gán cho nó Tên là một
trong các thành phần không thể thiếu được của Maple trong việc tạo ra các biểu thức Chiều dài tối đa của tên phụ thuộc vào hệ máy tính mà Maple chạy trên đó (với máy 32-bit thì chiều dài tối đa của tên là 524275)
Bất cứ biểu thức nào đều có thể được gán cho một cái tên Nếu không có giá trị nào được gán cho một tên thì nó sẽ nhận chính tên nó làm giá trị mặc định
Chương trình Maple sử dụng tên bắt đầu với một dấu gạch dưới ( _ ) làm các biến toàn cục, và vì thế chúng ta nên tránh sử dụng chúng
Một xâu ký tự bất kỳ (string of characters) có thể không phải là xâu hình tự (vì
có thể chứa các ký tự đặc biệt như: khoảng trống, dấu chấm than, ) và do đó không
Trang 3thể là một tên hợp lệ Tuy nhiên, Maple cho phép tạo một tên từ một xâu ký tự bất
kỳ bằng cách cho nó vào trong cặp dấu nháy đơn ( ` ) (backquote), thí dụ như xâu
kí tự `a variable!` là một tên biến hợp lệ, và người ta có thể gán cho nó giá trị 10 bằng lệnh `a variable!`:=10
Một xâu hình tự thường là một tên hợp lệ và được xem là trùng với tên được tạo bằng cách bao chung quanh xâu này bằng cặp dấu nháy (vì thế mà x và `x` đều chỉ
đến một tên) Tuy nhiên, nếu xâu hình tự mà trùng với từ khóa của Maple thì không phải là một tên hợp lệ, và muốn cho nó trở thành một tên ta lại phải cho nó vào trong cặp dấu nháy
Hai dấu nháy liên tiếp trong một xâu kí tự sẽ được hiểu như là một dấu Ví dụ như khi ta viết: print(` I``m a student`); thì kết quả sẽ cho ta xâu: I`m a student
3.1.2 Biến trong Maple
Biến trong Maple là những tên được dùng để thay thế cho một đối tượng nào
đó, thông thường là các giá trị cần thay đổi, hoặc các biểu thức tính toán cần cho
giá trị, Có hai loại biến trong Maple: Biến lập trình và biến toán học
Biến lập trình là những biến có thể gán bởi một giá trị nào đó và giá trị đó được
lưu trữ cho đến tận lúc nó thực sự bị thay đổi
Một biến toán học thể hiện cho ẩn số trong toán học, không thể được gán giá trị và tất nhiên ta không thể dùng nó như là một biến lập trình Nếu bạn không muốn phân biệt biến được gán (biến lập trình) và biến không được gán ( biến toán học ) trong Maple thì bạn có thể nghĩ rằng biến toán học trong Maple là biến được
gán mà giá trị luôn bằng chính tên biến
Biến cũng giống như một tên, bắt đầu bởi một hình tự, theo sau là các chữ cái
khác, các chữ số, và dấu gạch dưới
3.1.3 Sự định giá
Một tên mà được gán một giá trị (khác tên nó) thì sẽ trở thành biến chương trình, còn nếu chưa từng được gán một giá trị nào thì nó nhận chính tên nó làm giá
trị và được xem như là một kí hiệu biểu thị cho ẩn số trong toán học (chẳng hạn trong phương trình, biến trong đa thức, ) Như vậy, việc phân biệt một tên là một biến chương trình hay là một biến toán học (mang ý nghĩa là ẩn số) là rất quan trọng đối với Maple trong lúc thực hiện các lệnh có chứa tham số Ta xem xét chi tiết bằng cách phân tích một ví dụ cụ thể
Trang 4x không chứa giá trị nào (hay nói đúng hơn là giá trị của x chính là kí hiệu x)
Sau các phép gán, giá trị của , ,z y t đều tham chiếu đến biểu thức
2 5 12
x + xư , chúng được xem như là biến có thể lập trình được, giống như khái
niệm biến trong các ngôn ngữ lập trình truyền thống như C, Pascal, Còn x thì chỉ
được xem là biến theo ý nghĩa toán học, tức là một kí hiệu thể hiện cho một ẩn số : [>z;
Biến y có thể được gán bởi các giá trị khác, do đó nội dung của nó hoàn toàn thay
đổi, và tất nhiên giá trị của z cũng bằng giá trị của y:
[>y:=10;
:=
y 10[>z;
10
Ta có thể hiểu điều này như sau: Bất cứ khi nào Maple thực hiện việc tính toán, các tên trong biểu thức đều được kiểm tra xem có phải chúng được dùng như là biến chương trình (tức là có phải chúng đã được gán giá trị) hay không Nếu đúng như vậy, Maple thay thế tên bằng nội dung của nó (có thể là một tên khác, biến, hằng, hay biểu thức, ) vào trong biểu thức đang tính, rồi sau đó nó tiếp tục kiểm tra xem liệu có còn giá trị hay biến chương trình nào có thể được thay thế nữa không, còn nếu nội dung của tên đấy chính là tên của nó thì Maple xem tên này là một biến toán học và được giữ nguyên Quá trình cứ tiếp tục như vậy cho đến khi không còn tên nào được gán nữa Kết quả thu được, sau khi không còn có thể gán thêm được nữa, thì được gọi là biểu thức được định giá hoàn toàn và Maple thực hiện các phép toán trên đấy Như vậy, trong ví dụ trên, khi đọc đến z để in giá trị của nó, Maple thay thế nó bởi y, sau đó thay thế y bởi 10 rồi mới in giá trị 10 ra như là giá trị của
z Còn biến t vẫn không thay đổi nội dung của nó:
Trang 5+ ư
x2 5 x 12
Biến toán học chẳng qua là biến chương trình được gán giá trị chính là tên của
nó Khi ta gán cho nó một giá trị khác (so với tên của nó) thì nó trở lại thành biến chương trình, thí dụ:
282429536481Bây giờ xem i như là kí hiệu toán học và thực hiện lệnh sum() trong đó i là chỉ số tính tổng:
Trang 6Error, (in sum) summation variable previously
assigned, second argument evaluates to, 4 = 1 n Trong thông báo lỗi này chỉ rõ i trước đó đã được dùng như là một biến chương trình (vì đã được gán giá trị là 4) Khi lệnh sum được thực hiện, Maple trước tiên thực hiện việc định giá hoàn toàn cho các đối số của lệnh sum Vì thế, (i^2,i=1 n)
được biến đổi trở thành (16,4=1 n) trước khi lệnh sum được gọi đến Thông điệp lỗi
được phát sinh bởi vì "4" không là tên chỉ số tính tổng hợp lệ
3.1.4 Ngăn cản định giá
Sự định giá biểu thức được Maple dùng để tính toán các công thức cũng như biểu diễn các công thức toán học hình thức (như các phương trình, ẩn số, ) Tuy nhiên việc định giá các tên trong biểu thức trước khi được tính toán đôi khi làm cho biểu thức bị thay đổi ngoài mong muốn làm cho phép tính sai hay lệnh sinh ra lỗi (chẳng hạn trong ví dụ ở phần trước) Do đó Maple cung cấp cho người dùng khả năng ngăn cản việc định giá với mức độ nào đó phù hợp với điều kiện của phép tính
Ta sử dụng x như là một biến chương trình:
[>x:=100;
:=
x 100[>'x'+1;
+
x 1
[>%;
101
Trang 7[>'(x+15)mod 20';
mod(x 15 + ) 20[>%;
15Trong trường hợp bạn muốn loại bỏ giá trị đã gán cho biến chương trình, khôi phục lại nó như là một kí hiệu toán học, thì bạn hãy gán tên của biến cho chính nó: Biến x được gán là biến chương trình:
Sau đây là những nét đặc trưng đáng chú ý của sự tự động đơn giản trong Maple:
Phép tính số học trên tổng, tích, và luỹ thừa của các số tự nhiên và các số hữu
tỷ được Maple tự động thực hiện
Ước số chung lớn nhất của tử số và mẫu số trong số hữu tỉ được rút gọn Các thừa số chung trong tử số và mẫu số của một phân thức cũng được rút gọn
Tích của các số hạng thì được sắp lại sao cho số hạng là hằng số là phần tử
đứng trước trong biểu thức tính tích đó
Các phần tử giống nhau trong tổng hoặc tích thì được gộp lại, chẳng hạn x+x
được gộp lại thành 2*x, x*y+x*z được gộp lại thành x*(y+z)
Trang 8Nếu biểu thức là tích của một số với một tổng các đơn thức thì Maple thực hiện phân phối phép nhân với phép cộng Ví dụ như 1/2*(x+y) sẽ cho x/2+y/y trong biểu thức kết quả
3.1.6 Các tính toán số trong Maple
Maple tính toán số một cách chính xác Các số vô tỷ chưa có ký hiệu biểu diễn
được Maple gán tên một cách thích hợp, và Maple có thể cho giá trị xấp xỉ của các
số này (cũng như bất kỳ số vô tỷ nào như: ,eπ , ) với độ chính xác "tuỳ thích" (nghĩa là đủ lớn!) Trong tính toán, chúng ta thường làm việc với các số thập phân với dấu chấm động (là những số có chứa dấu chấm ngăn cách phần nguyên với phần thập phân) Số lượng các chữ số trong phần thập phân càng nhiều thì độ chính xác của số đó càng cao Các ngôn ngữ truyền thống như C,Pascal, cũng sử dụng các số có dấu chấm động trong việc biểu diễn và tính toán các số thực Số lượng các chữ số trong phần thập phân của các số được biểu diễn trong các ngôn ngữ quy ước trên là cố định, do đó độ chính xác của các số này bị giới hạn trong một khoảng
nhất định Dĩ nhiên, chúng chiếm ít bộ nhớ hơn các số chính xác được biểu diễn
bằng Maple và đồng thời các phép toán thực hiện trên các số này cũng nhanh hơn Kết quả tính toán của Maple với các số chính xác thì độc lập với sai số làm tròn,
điều mà ta không thể có được nếu sử dụng các số thập phân có dấu chấm động cố
định
Đôi khi ta nhận thấy việc sử dụng các phép toán cho kết quả gần đúng là cần thiết, chẳng hạn như khi bạn chỉ muốn ước lượng nhanh giá trị của một số và biết chắc rằng sai số do việc làm tròn số không làm ảnh hưởng xấu đến chất lượng tính toán Maple cung cấp các hàm dùng để ước lượng các số theo dấu chấm động Chúng ta có thể yêu cầu Maple ước lượng các số với độ chính xác cần thiết, chẳng hạn bạn có thể yêu cầu Maple ước lượng các số với 10, 20, hay hàng trăm chữ số thập phân sau dấu chấm Mặc định, Maple thường thực hiện phép tính các số có dấu chấm động chính xác đến 10 chữ số Xem thêm về hàm evalf để biết thêm chi tiết
3.2 Các hàm thường dùng trong Maple
3.2.1 Ước lượng giá trị
Mô tả
• Hàm evalf(expression,n) cho xấp xỉ của số có trong biểu thức
expression dưới dạng số thập phân có dấu chấm động với độ chính xác tới n chữ số thập phân (n là số tự nhiên) Tham số expression có thể nhận bất cứ toán tử, biểu thức hay là các hàm tính toán khác mà những hàm này phải cho giá trị là các số cũng như các hằng số
• Hàm evalf(expression) mặc định sẽ cho kết quả là các số có 10 chữ
số thập phân sau dấu chấm động Nếu muốn thay đổi độ chính xác tính
Trang 9toán, ta có thể dùng lệnh trên, hoặc thay đổi giá trị mặc định này bằng lệnh thay đổi biến Digits
[Digits]: Là tham số tuỳ chọn, nhận giá trị là số tự nhiên (số
lượng các số sau dấu chấm thập phân)
Ví dụ minh hoạ
Nhiều biểu thức cho kết quả chưa được định giá trị số mà để dưới dạng là các
số chính xá c:
[>bt1:=ln(2)+sqrt(3);
:=
bt1 ln 2( ) + 3[>bt2:=1423/23546;
Trang 102.425197988128822602944678462964048935019 Hàm evalf(expression,digits) ước lượng các số với số các chữ số thập phân xác định bằng tham số digits:
[>evalf(bt2,5);
.060435[>evalf(bt2,70);
đa thức, cũng như không rút gọn ước số chung lớn nhất trong các hàm phân thức (tỉ số giữa hai đa thức) Nhiều phép biến đổi trong Maple chiếm nhiều thời gian cũng như bộ nhớ cần thiết để lưu trữ, và thông thường thì các tính toán còn phụ thuộc vào mức độ ước lượng của người sử dụng trong những trường hợp nhất định Chính vì vậy mà Maple đã để các phép biến đổi này cho người dùng tự áp dụng tuỳ theo chọn lựa của riêng mình
• Hàm simplify là một hàm đơn giản biểu thức dùng chung cho nhiều dạng
ước lượng khác nhau Nó thực hiện chính xác trong hầu hết, tuy rằng không phải là tất cả, các trường hợp Chẳng hạn như nó luôn được dùng để đơn giản các biểu thức phân thức, cũng như được áp dụng cho tất cả các loại đơn giản biểu thức chuẩn mà ta sẽ liệt kê dưới đây Bằng cách sử dụng simplify, ta có thể biến đổi x^2-y^2-(x-y)*(x+y) thành 0, đơn giản hoá
sin(x)^2+cos(x)^2 bằng 1, hoặc biến đổi log(x^2) thành 2*log(x) Chúng ta cũng có thể thực hiện việc đơn giản một phần biểu thức bằng cách dùng tham số chọn lựa các phương thức đơn giản biểu thức dưới đây
• Các phương thức đơn giản biểu thức:
atsign : toán tử hàm ví dụ: sin@arcsin cho ta x-> x
GAMMA : theo hàm gamma ví dụ: GAMMA(n+1)/GAMMA(n) cho ta n
hypergeom : theo các hàm hypergeometric Ví dụ: hypergeom([1],[1],z) thì cho ta exp(z)
power : Đơn giản liên quan đến luỹ thừa, hàm mũ, logarithm ví dụ:
ln(x*y) cho ta ln(x)+ln(y)
radical : Biểu thức liên quan đến luỹ thừa hữu tỉ Ví dụ: 4*x+4)^(1/4) cho ta (x-2)^(1/2)
Trang 11(x^2-RootOf : Biểu thức có chứa hàm RootOf (tức là nghiệm của một phương trình nào đó)
sqrt : Biểu thức gồm căn bậc hai hoặc luỹ thừa của căn bậc hai Ví dụ : 16^(3/2) cho ta 64
trig : Đơn giản liên quan đến các hàm lượng giác Ví dụ:
expression : Biểu thức cần đơn giản
rule: Các phương thức cụ thể để đơn giản biểu thức như đã liệt kê ở trên
Trang 123.2.3 Tìm giá trị lớn nhất và bé nhất
Lệnh:
max - Xác định phần tử lớn nhất của một dãy các biểu thức
min - Xác định phần tử nhỏ nhất của một dãy các biểu thức
• Các hàm max, min cho giá trị lớn nhất và giá trị bé nhất của một hay nhiều đối
tượng được cho dưới dạng đối số của hàm
• Thông thường các đối số có dạng số: số nguyên, phân số, hoặc số thập phâ n Tuy nhiên, các hàm tổng quát cho phép nhận bất cứ đối số nào và khi đó hàm
max() hoặc min() cho một hàm không định giá trị
• Giá trị lớn nhất hay nhỏ nhất của một họ các đa thức có thể được biến đổi thành một hàm từng khúc (piecewise)
Ví dụ minh hoạ
Hàm max cho lại số lớn nhất:
[>max(3/2, 1.49,-34,1.49999);
32
Hàm max, min với đối số không định được giá trị thì cho một hàm không định giá trị:
max ,y x 2 + [>min();
Trang 13x 3 x ≤ 12 + 12 21 ư
var,var1,var2, ,varn: các kí hiệu cần được thay thế trong biểu thức
repl,repl1, , repln: các biểu thức sẽ thay thế chỗ của var, var1, ,varn trong biểu thức expr
Mô tả
• Trong các phép tính nhiều bước, một đồng nhất thức như sin(x)^2+cos(x)^2=1 thường phải áp dụng trong một biểu thức nào đó chẳng hạn exp(x^2+sin(x)^2+cos(x)^2) Chúng ta có thể thực hiện việc này bằng cách thay mỗi biểu thức sin(x)^2+cos(x)^2 trong biểu thức đó bởi giá trị 1 trong vế phải của đồng nhất thức Phép thay thế này nhanh hơn việc định giá của Maple, do đó giảm được thời gian tính toán Sử dụng lệnh
subs(var=replacement, expression) để thay thế biểu thức var
bằng biểu thức replecement trong biểu thức expression (trong ví dụ này khi thay sin(x)^2+cos(x)^2 bởi 1 ta thu được biểu thức: exp(x^2+1))
• Ta có thể sử dụng cách phát biểu thứ hai trong phần khai báo cú pháp lệnh để thay thế một cặp biểu thức: subs(v1=r1, v2=r2, expression) Trong
đó, mọi vị trí trong expression có v1 đều được thay thế bởi r1, và vị trí của v2 được thay thế bởi r2 Tương tự như vậy, chúng ta có thể thay thế
nhiều vị trí bằng cách áp dụng hàm subs với đối số bao gồm một dãy các
đẳng thức var=replacement và biểu thức expression cần được thay thế
Trang 14Ví dụ minh hoạ
Lệnh subs có thể áp dụng cho nhiều kí hiệu, và khi ấy thứ tự thay thế sẽ được thực
hiện từ trái qua phải Trong ví dụ sau đây, ta thực hiện phép tính khối lượng m thông qua năng lượng e và vận tốc ánh sáng ctheo công thức Einstein:
Khi cho c=300000 đứng trước trong trật tự được thay thế thì lệnh tiến hành ngay
đối với nó Nhưng do biểu thức f=m*g không có kí hiệu c để mà thay, cho nên nó
bỏ qua sự thay thế này và chỉ thực hiện thay thế 2 ký hiệu tiếp theo là m=msol, g=9.8 và do đó kết quả của lệnh là một sự thay thế không đầy đủ:
[>subs(c=300000,m=msol,g=9.8,f=m*g);
=
f 9.8 e
c2
Nếu cho m=msol lên trước thì ngay sau bước đầu tiên biểu thức trở thành:
f=g*e/c^2, và các biến g, c lại được thay thế tiếp Kết quả là ta có sự thay thế
[>restart;
Trang 15[>reduit:=proc()
if n<>0 then simplify(subs(cos(n*Pi)=(-1)^n,sin(n*Pi)=0, expand(args,trig)));
• collect() là một lệnh được sử dụng khi bạn muốn tổ chức một biểu thức
theo một biến số chính hay với các biến được viết dưới dạng tổng của các số hạng, trong đó mỗi số hạng là một luỹ thừa của một biến chính hay một biểu thức nhân với một hệ số liên hợp (associated coefficient) Có hai dạng kết quả
có khả năng thu được: hoặc là biểu thức đệ quy hoặc là biểu thức phân phối
• Với dạng đệ quy, kết quả được cấu trúc phân cấp Nó được ép thành dạng đa thức theo biến đầu tiên trong danh sách biến cho trong lệnh gọi ( ví dụ như
collect(x*y^2 + x^2*z + y*z + y,[x,y]); thì x là biến đầu
trong danh sách biến [x,y]), hệ số của biến đầu này lại là đa thức của biến thứ hai trong danh sách biến ,và tiếp tục như thế cho đến biến cuối cùng trong danh sách
• Với dạng phân phối, kết quả được viết dưới dạng đa thức khai triển tổng của các số hạng Mỗi số hạng là tích của các luỹ thừa của các biến trong danh sách với các hệ số ( các hệ số này không phụ thuộc vào các biến trong danh sách biến ) Dạng này rất hữu ích khi bạn muốn xem nhiều biến như là "biến chính" mà không cho trước một sự ưu tiên đối với bất cứ biến nào
• Đối số tuỳ chọn thứ tư "coefficient simplifier" là tên của chu trình đơn giản sẽ
được áp dụng cho hệ số của các số hạng của kết quả.Ví dụ như, nếu expand là
đối số thứ tư, thì các hệ số sẽ được khai triển Vì thế, có thể thiết lập các hệ số khác với dạng phân cấp và dạng đệ quy mà collect tráo đổi các phần của biểu thức có chứa các biến trong danh sách
Trang 16Minh họa
Gom các số hạng của biểu thức theo biến x, rồi theo y, cuối cùng theo z [>expr:=r^2*x^2-2*x^2*r+x^2+8*z*y*r^2-2*y*z*r*s-
r*z*x*t^2;
6*z*y*s^2+t^2*z^2+3*r^2*x*y*s*t-r*s*x*y+s^2*y^2+r^3*z*x-expr r := 2x2 ư 2x2r x + + 2 8zyr2 ư 2yzrs 6zys ư 2 + + t2z2 3r2xyst rsxy s ư + + 2y2 r3zx rzxt2
Sắp xếp một danh sách theo các trật tự cho bởi ordering:
• string: sắp xếp danh sách theo trật tự của các xâu kí tự
• numeric: sắp xếp danh sách theo trật tự số
• address: sắp xếp theo địa chỉ được Maple lưu trữ
• một hàm cho kiểu boolean gồm hai đối số f(a,b) trong đó a đứng trước b
nếu f cho giá trị true, ngược lại nếu f cho giá trị false
Mô tả
• Maple sắp xếp các toán hạng theo một trật tự cố định Nếu một biểu thức được
in ra y+x+z trong lần làm việc đầu, thì nó cũng sẽ tiếp tục như vậy trong những lần tiếp theo Tuy nhiên, trật tự thuận lợi để cho Maple làm việc có
Trang 17hiệu quả thì có thể không phù hợp với trật tự mà chúng ta muốn quan sát thấy trong kết quả Ví dụ, Maple không sắp xếp các số hạng của một đa thức một biến theo trật tự giảm dần của bậc hoặc theo trật tự abc Để có biểu thức được sắp xếp như mong muốn, chúng ta phải sử dụng hàm sort(expression)
để thay đổi trật tự các toán hạng trong các tổng hoặc các tích có trong biểu thức theo một trật tự nào đó
• Đối với các biểu thức có chứa luỹ thừa của nhiều biến (hoặc nhiều biểu thức con), sort nhận ba đối số Khi chúng ta có một biểu thức gồm nhiều biến
trong đó có một biến được xem là biến chính, và chúng ta muốn sắp xếp các
số hạng của biểu thức theo sự ưu tiên đối với số hạng nào có luỹ thừa cao nhất của biến chính, Hàm sort(expression,variablelist,plex) sẽ sắp
xếp các số hạng theo cách ấy variablelist có thể là danh sách biến với biến chính đứng ở đầu danh sách Để sắp xếp các số hạng có cùng luỹ thừa theo biến chính, luỹ thừa của biến tiếp theo trong danh sách variablelist
sẽ được dùng đến Nếu điều này lại tiếp tục xảy ra đối với biến thứ hai thì biến tiếp theo được áp dụng và cứ tiếp tục như vậy Cách làm này được gọi là
sự sắp xếp theo từ điển vì nó giống như quy tắc sắp xếp các từ theo thứ tự từ
điển
• Cách khác để tổ chức các số hạng của một biểu thức là theo tổng bậc (total degree order) Tổng bậc của một tích các luỹ thừa của các biến là tổng của tất cả các số mũ Hàm sort(expression,variable list,tdeg) sẽ sắp
xếp các số hạng của biểu thức theo cách này Để sắp xếp hai số hạng có cùng tổng bậc, hàm sẽ sắp xếp theo thứ tự từ điển dựa trên các biến sắp xếp trước trong danh sách biến
• Nếu danh sách (list) được cho vào như một đối số của lệnh sort, thì các phần
tử của danh sách được sắp xếp theo thứ tự tăng dần Một đối số tuỳ chọn có thể được dùng để định rõ kiểu sắp xếp sẽ được sử dụng Đối số này có thể là
từ khoá mà Maple có thể nhận ra hoặc có thể là hàm so sánh do người dùng
định nghĩa
Minh họa
Maple lưu các đa thức không theo trật tự tăng hay giảm của bậc các đơn thức
mà nó lưu trữ một cách lộn xộn thích hợp cho việc lưu trữ và tính toán của nó Để thu được biểu thức được sắp xếp, chúng ta sử dụng hàm sort():
Trang 18x3y3z5 x4y3z2 x5y2z 2 x2 1S¾p xÕp danh s¸ch theo alphabet:
[>sort([a,x,z,t,e,d,v,m,b,u]);
[a b d e m t u v x z, , , , , , , , , ][>sort(c+b+a);
if a<b*2 then true else false fi;
Trang 19resulttype : dạng dữ liệu biểu thức của ta cần chuyển sang
Mô tả
• Các cấu trúc dữ liệu biểu diễn tổng, tích, tập hợp, danh sách, mản g nói chung
là tương tự nhau Mỗi cấu trúc dữ liệu đó có thể được xem như một nhóm các
phần tử được viết theo một kiểu nào đó Chẳng hạn như một danh sách và một
tập hợp được viết ra trên màn hình chỉ khác nhau ở chỗ dấu đóng bao hai đầu
của chuỗi dữ liệu là ngoặc vuông và ngoặc xoắn Về hình thức ta có thể thấy
hoàn toàn có thể chuyển đổi một tổng (sum) thành một danh sách (list) bằng
cách thay dấu cộng bằng dấu phẩy, rồi đặt dấu ngoặc vuông bao toàn bộ biểu thức
• Trong một số chương trình đôi khi rất cần thiết phải thực hiện việc chuyển đổi
như vậy Chẳng hạn khi ta muốn tính tổng các phần tử của một danh sách các
số, cách tốt nhất là ta biến đổi cấu trúc danh sách này thành cấu trúc tổn g Trong Maple chúng ta có thể làm được điều này một cách khá dễ dàng bằng cách sử dụng lệnh chuyển đổi cấu trúc convert()
Trang 20• Các phép toán trong Maple như evalf, normal, thông thường nhận các đối
số là một số hoặc một biểu thức và chúng tính toán trên số hoặc biểu thức đó Tuy nhiên, khi các hàm này được truyền đối số là một danh sách các số hay biểu thức, thì chúng vẫn thực hiện một cách bình thường bằng cách tính toán với từng phần tử của danh sách, sau khi tính toán chúng cho một danh sách các kết quả Khi muốn xây dựng một hàm có thể thực hiện một tính toán giống nhau trên tất cả các phần tử của một danh sách, ta sử dụng hàm map() Hàm map(f,expression) thực hiện tính toán hàm f với các đối số lần
lượt là các phần tử của cấu trúc dữ liệu expression Hàm map() tạo ra
một cấu trúc mới trong đó toán hạng thứ i của cấu trúc này là kết quả của việc
áp dụng hàm f cho toán hạng thứ i của cấu trúc dữ liệu ban đầu Kiểu của cấu trúc mới được tạo ra cùng kiểu cấu trúc dữ liệu ban đầu, ngoại trừ khi sự
đơn giản hoá tự động thực hiện sau đó làm thay đổi chúng Vì vậy, hàm map
làm việc không chỉ trên danh sách, tập hợp, mà còn trên tổng, tích, phương
trình, mảng, bảng,
• Dạng thứ hai của lệnh map trong khai báo trên được sử dụng trong trường hợp
chúng ta muốn áp dụng một hàm gồm nhiều đối số trong đó tham số đầu tiên của hàm f lần lượt được tính toán bằng các giá trị là các phần tử của cấu trúc dữ liệu trong expression, các tham số thứ hai trở đi nhận giá trị arg2, ,argn Nó tạo ra một cấu trúc dữ liệu mới cùng kiểu với biểu
thức đã cho ban đầu với f(op(i,expression), arg2, argn) được
gán cho phần tử thứ i của cấu trúc mới
Trang 21[1.047197551 6000000000 -.4338837393, , ]
Ta có thể tính giá trị của một hàm f trên từng phần tử của một cấu trúc dữ liệu nào
đó bằng cách sử dụng hàm map Việc áp dụng hàm map nh− vậy gọi là sự ánh xạ hàm f lên các phần tử của một cấu trúc Chẳng hạn ta thấy hiệu quả của việc ánh xạ (mapping) hàm sin trên danh sách, tập hợp và tổng: