Tải bản đầy đủ (.doc) (35 trang)

Lập trình symbolic với ứng dụng giải toán rời rạc nâng cao bằng MAPLE

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (324.8 KB, 35 trang )

Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
Mục Lục
Mục Lục 1
LỜI CẢM ƠN 1
CHƯƠNG I: GIẢI BÀI TOÁN BẰNG MAPLE 2
I. GIỚI THIỆU 2
II. SƠ LƯỢC VỀ LẬP TRÌNH TRÊN MAPLE 4
2.1. Các lệnh lập trình cơ bản 4
2.2. Giới thiệu lập trình Maplet trong Maple 13
CHƯƠNG II: MỘT SỐ PHÉP TOÁN RỜI RẠC BIỂU DIỄN BẰNG MAPLE 16
I. Một số phép biến đổi trên ma trận 16
1.1. Phép biến đổi trên dòng 16
1.2. Phép biến đổi trên cột 16
1.3. Ví dụ 16
1.4. Kiểm tra ma trận 17
1.5. Phép toán trên ma trận 18
1.6. Tìm hàm đặc trưng 19
1.7. Lược đồ trực giao Gram – Schmidt 20
TÀI LIỆU THAM KHẢO 35

LỜI CẢM ƠN
Trước tiên, em xin gửi lời cảm ơn chân thành nhất tới PGS - TS. Đỗ Văn Nhơn
đã tận tình hướng dẫn, giảng dạy truyền đạt những kiến thức nền tảng cơ bản
cho chúng em về môn học:"Lập trình Symbolic và ứng dụng", và có những gợi
ý giúp em hoàn thành đề tài: "Lập trình Symbolic với ứng dụng giải toán rời
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 1
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
rạc nâng cao bằng MAPLE"
Em xin được gửi lời cảm ơn chân thành tới các thầy cô giáo trong khoa
Công nghệ thông tin - Trường đại học Công nghệ thông tin- Đai học
QG.TPHCM đã tần tình giúp đỡ và giảng dạy cho chúng em trong những môn


học vừa qua.
Trong thời gian vừa qua mặc dù em đã cố gắng rất nhiều để hoàn thành
tốt môn học. Song chắc chắn kết quả nghiên cứu sẽ không tránh khỏi những
thiếu sót, vì vậy em kính mong nhận được sự chỉ bảo và góp ý của quý thầy cô
và các bạn.
Em xin chân thành cám ơn!
Hà Nội, tháng 02 năm 2013
Học viên thực hiện
Bùi Hữu Tiến - CH1102010
CHƯƠNG I: GIẢI BÀI TOÁN BẰNG MAPLE.
I. GIỚI THIỆU.
Như chúng ta đã biết, trong những năm gần đây, với sự phát triển của Công
nghệ thông tin (CNTT), nhiều phần mềm hỗ trợ cho việc tính toán đã xuất hiện và
càng ngày càng được hoàn thiện. Tại nước ta, mặc dù chưa trở thành một hiện
trạng phổ biến, nhưng trong rất nhiều trường Đại học và Cao đẳng, nhiều cô giáo,
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 2
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
thầy giáo đã thực hiện “một cách tự phát” việc sử dụng CNTT nói chung và phần
mềm tính toán nói riêng trong việc giảng dạy Toán.
Nhiều người đã sử dụng phần mềm STATA, SPSS để xử lý các số liệu thống
kê, EVIEWS, MFIT để xử lý các số liệu trong các bài toán Kinh tế lượng,
MATHEMATICA, MATLAB, MAPLE trong các bài toán về Toán cao cấp, Toán
tài chính.
Việc sử dụng các phần mềm tính toán đã đặt ra cho các nhà quản lý giáo dục,
các cô giáo, thầy giáo một vấn đề cấp thiết là sử dụng chúng như thế nào trong
công tác đổi mới phương pháp dạy và học Toán ở các trường Đại học, Cao đẳng
và Phổ thông.
Qua kinh nghiệm thực tế, chúng tôi thấy rằng việc sử dụng các phần mềm để
xử lý các số liệu đã tỏ rõ tính hiệu quả trong việc đổi mới cách dạy và học một số
môn học Toán. Chẳng hạn, tại trường Đại học quản lý kinh doanh, môn Toán kinh

tế gồm hai phần: Mô hình toán và Kinh tế lượng. Mỗi phần chiếm 3 đơn vị học
trình. Chúng tôi đã dành 8 tiết (hơn nửa đơn vị học trình) cho việc thực hành phần
mềm về Mô hình toán và dành trọn 1 đơn vị học trình thực hành phần mềm MFIT
cho Kinh tế lượng trên máy tính. Điểm thi môn Toán kinh tế chia 50% cho Bài thi
trắc nghiệm trên máy về Mô hình toán, và 50% cho Bài tập lớn về Kinh tế lượng
mà sinh viên phải tự thu thập dữ liệu, xử lý dữ liệu trên máy tính và đưa ra các kết
luận theo từng yêu cầu của đề bài đặt ra. Tuy nhiên, một cách làm như vậy đòi hỏi
trường phải có đủ một số lượng máy tính và phòng máy, để sinh viên có thể thực
tập mỗi người một máy, với số tiết thực hành 23 tiết trên tổng số 90 tiết dành cho
môn học này. Phải chăng đó cũng là một trong những khó khăn khi muốn áp dụng
rộng rãi CNTT vào việc dạy và học ở các trường Đại học của chúng ta hiện nay?
Một vấn đề còn đang gây nhiều tranh luận quanh việc sử dụng một số phần
mềm khác như MATLAB, MATHEMATICA, MAPLE… trong việc dạy và học
môn Toán cao cấp. Các câu hỏi thường đặt ra là: Nên hay không nên sử dụng
chúng? Nếu sử dụng thì sử dụng đến mức nào và nhằm mục đích gì? Các phần
mềm nêu trên ngoài việc tính toán trên số, còn có một khả năng rất mạnh là tính
toán trên ký hiệu (symbolic). Không phải phần mềm tính toán nào cũng có thể
cộng 2a với 3a cho kết quả 5a, hay lấy đạo hàm một biểu thức giải tích. Trong
EXCEL, ta có thể tính được ma trận nghịch đảo của một ma trận không suy biến
với các phần tử là các số, song với các phần tử bằng chữ thì máy không làm được
việc đó.
Trong khuôn khổ báo cáo này, chúng tôi xin đề cập đến một trong các phần
mềm mà chúng tôi đang khai thác là MAPLE. Cho đến cuối năm 2012, trên thị
trường nước ta đã có phiên bản MAPLE 16. Theo chúng tôi, MAPLE đủ đáp ứng
cho các tính toán trên số và trên các ký hiệu.
Kinh nghiệm cho biết tất cả các đối tượng cán bộ và sinh viên đó đều tỏ ra
hào hứng khi tiếp nhận một công cụ mới. Đồng thời nhận thức của sinh viên được
nâng cao lên rất nhiều.
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 3
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn

Phần mềm Maple là một trong những công cụ hỗ trợ cho việc giảng dạy, tính
toán và cũng có thể lập trình để hỗ trợ các bài toán giảng dạy nào đó trong trường
học. Đây là phần mềm được thiết kế riêng cho việc hỗ trợ tính toán, nó giúp cho
việc tính toán một cách nhanh hơn và hiệu quả, mang lại những kết quả thật chính
xác. Thông qua đó có thể giúp cho học sinh sinh viên tiếp cận với phương pháp
nghiên cứu khoa học mới với nhưng công cụ hỗ trợ tính toán rất ưu việt.
II. SƠ LƯỢC VỀ LẬP TRÌNH TRÊN MAPLE.
2.1. Các lệnh lập trình cơ bản.
2.1.1. Vòng lặp While.
a. Cú pháp.
While <điều kiện> do <dãy lệnh> od;
b. Chức năng.
Vòng lặp while cho phép lặp chuỗi các câu lệnh giữa do và od
khi mà điều kiện condition vẫn còn đúng (tức là biểu thức điều
kiện cho giá trị true). Điều kiện condition được kiểm tra ngay tại
đầu mỗi vòng lặp, nếu nó thỏa mãn (giá trị của nó là đúng) thì
các câu lệnh bên trong được thực hiện, sau đó lại tiếp tục kiểm
tra điều kiện condition cho đến khi điều kiện không còn thỏa
mãn nữa.Vòng lặp while thường được sử dụng khi số lần lặp
một hay một chuỗi biểu thức là không xác định rõ, đồng thời ta
muốn các biểu thức đó cần được lặp trong khi một điều kiện nào
đó còn được thỏa mãn.
Điều kiện condition trong vòng lặp phải là một biểu thức
boolean, tức là giá trị của nó chỉ có thể là đúng hoặc sai, nếu
không thì sẽ sinh ra lỗi.
Trong trường hợp muốn thoát ra khỏi vòng lặp ngay từ trong
giữa vòng lặp, ta có thể thực hiện bằng cách dùng câu lệnh
RETURN, break hoặc quit.
Chú ý rằng vòng lặp while- do- od; không bắt buộc phải nằm
trên nhiều dòng lệnh nhưng người ta thường viết trên nhiều dòng

để câu lệnh dễ đọc và dễ hiểu hơn.
Vòng lặp While cho phép lặp chuỗi các câu lệnh nằm giữa do và
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 4
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
od khi mà điều kiện vẫn còn đúng.
2.1.2. Vòng lặp for.
a. Cú pháp.
for name from start by change to finish
do
statement sequence
od;
Hoặc dạng phát biểu khác:
for name in expression
do
statement sequence
od;
b. Chức năng.
Vòng lặp for được dùng để lặp một chuỗi các biểu thức được đặt
giữa do và od, mỗi lần lặp tưng ứng với một giá trị phân biệt của
biến chỉ số name đứng sau từ khoá for. Ban đầu, giá trị start
được gán cho biến chỉ số. Nếu giá trị của biến name nhỏ hơn hay
bằng giá trị finish thì chuỗi lệnh nằm giữa do và od được thực
hiện, sau đó biến name được gán giá trị tiếp theo bằng cách cộng
thêm vào nó giá trị change (name:=name+change). Sau đó, biến
name được so sánh với finish để quyết định xem việc thực hiện
chuỗi lệnh có được tiếp tục nữa không. Quá trình so sánh biến
chỉ số name và thực hiện chuỗi lệnh được lặp liên tiếp cho đến
khi giá trị của biến name lớn hơn giá trị finish. Giá trị cuối cùng
của biến name sẽ là giá trị vượt quá finish đầu tiên.
Chú ý. Nếu các từ khóa from start hoặc by change bị bỏ qua thì

mặc định from 1 và by 1 được dùng.
Vòng lặp for- in- do- od thực hiện việc lặp với mỗi giá trị mà
biến chỉ số name lấy từ biểu thức expression đã cho. Chẳng hạn
vòng lặp này được sử dụng hiệu quả khi mà giá trị của biến
name là một phần tử của một tập hợp hoặc danh sách.
Trong trường hợp muốn thoát khỏi từ giữa vòng lặp, ta có thể
dùng các câu lệnh break, quit, RETURN giống như trong vòng
lặp while.
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 5
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
2.1.3. Lệnh điều kiện if.
a. Cú pháp.
if condition then
statement sequence
| elif condition then statement sequence |
| else statement sequence |
fi;
(Ghi chú: Các câu lệnh trong cặp dấu ngoặc đứng là các lệnh tuỳ
chọn. Thí dụ: biểu thức | statement | cho biết rằng statement là
một câu lệnh tuỳ chọn).
b. Chức năng.
Nếu bạn muốn một dãy biểu thức được thực hiện khi điều kiện
nào đó được thoả mãn và một dãy biểu thức khác được thực hiện
nếu trái lại thì có thể dùng câu lệnh if- then- else- fi. Trong câu
lệnh trên, nếu điều kiện condition là đúng thì chuỗi biểu thức
đứng sau then được thực hiện, nếu trái lại thì điều kiện condition
sau từ khoá elif sẽ được kiểm tra, nếu nó đúng thì chuỗi lệnh
tương ứng sau then được thực hiện, cứ tiếp tục cho đến khi các
điều kiện condition đều không thỏa mãn, thì các biểu thức sau
lệnh else được thực hiện.

Lưu ý rằng cấu trúc lệnh (tuỳ chọn) elif then được lặp lại với
số lần tuỳ ý. Từ khoá elif là dạng viết tắt của else if.
Các biểu thức điều kiện condition được sử dụng trong câu lệnh
if phải được tạo thành từ các bất đẳng thức, các đẳng thức (các
phép toán quan hệ), các biến số, các phép toán logic, các hàm có
giá trị trả lại là giá trị logic. Nếu trái lại thì sẽ gây ra lỗi.
2.1.4. Lệnh break.
a. Cú pháp.
break
b. Chức năng.
Trong lúc vòng lặp while/for đang được thực hiện, nếu lệnh
break được gọi thì chương trình sẽ thoát ngay lập tức ra khỏi
vòng lặp while/for tận trong cùng nhất mà có chứa lệnh break
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 6
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
(vì cũng có thể có nhiều vòng lặp while/for được lồng nhau).
Một ví dụ khá điển hình trong việc sử dụng lệnh break là trong
quá trình tìm kiếm search, rõ ràng là bạn sẽ muốn dừng quá
trình quét lại ngay khi bạn tìm thấy đối tượng cần tìm. Khi đó,
ngay tại thời điểm tìm thấy, bạn dùng lệnh break để nhảy ra khỏi
vòng lặp tìm kiếm. Trước lệnh break thường có một câu lệnh
điều kiện if then
Nếu lệnh break dùng ngoài các vòng lặp while/for thì sẽ sinh ra
lỗi.
Chú ý: break không phải là từ khoá (từ dành riêng cho Maple),
vì vậy ta có thể gán giá trị cho biến có tên là break mà không hề
sinh ra lỗi (mặc dù điều này là không nên).
2.1.5. Lệnh next.
a. Cú pháp.
Next.

b. Chức năng.
Cũng giống như câu lệnh break, lệnh next được thực hiện trong
vòng lặp while/for với mục đích bỏ qua một số lệnh bên trong
vòng lặp để nhảy qua lần lặp tiếp theo. Khi gặp lệnh next trong
vòng lặp, chương trình bỏ qua các lệnh tiếp theo của vòng lặp
tận cùng nhất chứa next cho đến khi gặp từ khoá xác định kết
thúc vòng lặp (ở đây là lệnh od). Đến đây vòng lặp tiếp tục nhảy
qua lần lặp tiếp theo (nếu có thể) bằng cách tăng chỉ số hoặc
kiểm tra điều kiện để quyết định xem có nên thực hiện vòng lặp
tiếp theo.
Lệnh next sinh ra lỗi nếu nó được gọi ngoài vòng lặp while/for.
Tương tự như break, next cũng không phải là từ khóa, do đó ta
hoàn toàn có thể gán cho next một giá trị (xem như next là một
biến). Ngay trước lệnh next cũng thường là một câu lệnh điều
kiện if then
2.1.6. Sử dụng các hàm RETURN, ERROR.
Hàm RETURN được sử dụng để cho giá trị hàm trước khi thoát
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 7
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
khỏi chu trình. Nếu không có lệnh RETURN, chu trình tự động cho
kết quả của phép tính cuối cùng trong chu trình.
Hàm ERROR được sử dụng để đưa thông điệp lỗi ra màn hình từ
bên trong chu trình.
2.1.7. Cách thiết lập chu trình.
a. Giới thiệu.
Maple là một ngôn ngữ lập trình hướng chu trình (procedure).
Chúng ta có thể làm việc với Maple bằng hai chế độ khác nhau: Chế
độ tương tác trực tiếp thông qua việc nhập từng lệnh đơn lẻ ngay tại
dấu nhắc lệnh của Maple và nhận được ngay kết quả của lệnh đó.
Chế độ chu trình được thực hiện bằng cách đóng gói một dãy các

lệnh xử lí cùng một công việc vào trong một chu trình (procedure)
duy nhất, sau đó ta chỉ cần gọi chu trình này và Maple tự động thực
hiện các lệnh có trong chu trình đó một cách tuần tự và sau đó trả lại
kết quả cuối cùng.
Maple chứa một lượng rất lớn các hàm tạo sẵn đáp ứng cho những
yêu cầu tính toán khác nhau trong nhiều lĩnh vực. Các hàm này
được lưu trữ trong các gói chu trình (package) và người sử dụng có
thể dễ dàng gọi đến mỗi khi cần thiết. Tuy nhiên, người dùng Maple
có thể tự tạo cho riêng mình những gói chu trình cũng như có thể
trao đổi dùng chung những gói chu trình nào đấy, phục vụ cho công
việc mang tính đặc thù riêng của mình.
Các khái niệm cơ bản cần phải nắm vững để tạo ra một chu trình
(procedure) là:
 Cấu trúc proc() end; cùng với các khai báo trong cấu trúc
này (global, local, option, ).
 Các cấu trúc dữ liệu và các hàm có liên quan (dãy-sequence,
tập hợp-set, danh sách-list, mảng-array, bảng-table).
 Các hàm lập trình cơ bản (đã nêu ở trên) và các hàm liên
quan đến việc xử lí dữ liệu (eval, evalf, subs, map,
convert, ).
b. Khai báo chu trình.
Lời gọi khai báo một chu trình:
procedure_name:=proc(parameter_sequence)
[local local_sequence]
[global global_sequence]
[options options_sequence]
statements_sequence;
end;
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 8
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn

Giải thích các khai báo:
parameter_name: Là một dãy các kí hiệu, ngăn cách nhau bởi các
dấu phẩy, chứa tên các tham biến truyền cho chu trình.
local_sequence: Là một dãy các tên được khai báo là biến cục bộ
trong chu trình, nó chỉ có giá trị sử dụng trong phạm vi chu trình
đang xét (local được sử dụng để khai báo cho các biến chỉ sử dụng
bên trong một chu trình).
global_sequen: Dãy các tên biến toàn cục có giá trị sử dụng ngay
cả bên ngoài chu trình.
options_sequence: Dãy các tuỳ chọn cho một chu trình.
statements_sequence: Dãy các câu lệnh do người lập trình đưa vào.
c. Tham biến.
Tham biến (parameter) là các biến được đặt giữa hai dấu ngoặc
trong biểu thức proc( ). Tham biến được dùng để nhận dữ liệu
truyền cho chu trình khi gọi chu trình đó. Ví dụ ta có thể khai báo
chu trình tính tổng của 2 số [tong:=proc(x,y) x+y; end.] thì khi gọi
chu trình này để tính tổng của hai số 10 và 5 ta phải truyền các dữ
liệu này cho các tham biến (cho x nhận giá trị là 10, y nhận giá trị
là 5), tức là tại dấu nhắc lệnh ta phải viết tong(10, 5); và sau khi
thực hiện chu trình trả lại kết quả là 15.
Tham biến có tính cục bộ: chúng chỉ được sử dụng bên trong chu
trình đã được khai báo, bên ngoài chu trình này chúng không mang
ý nghĩa gì.
Kiểu của tham biến có thể được khai báo trực tiếp.
d. Phạm vi các biến.
Biến toàn cục:
 Biến toàn cục được khai báo sau từ khoá global trong khai
báo chu trình.
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 9
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn

 Biến toàn cục được khai báo bên trong một chu trình, nhưng
có phạm vi giá trị trong toàn bộ chương trình, tức là bên
ngoài phạm vi của chu trình mà nó được khai báo trong đó.
Biến cục bộ:
 Biến cục bộ được khai báo sau từ khoá local trong khai báo
chu trình.
 Biến cục bộ chỉ có giá trị bên trong chu trình mà nó được
khai báo. Ngoài chu trình này nó không mang ý nghĩa gì.
Tham biến:
 Cũng giống như biến cục bộ, các tham biến chỉ có giá trị bên
trong phạm vi của chu trình mà nó được khai báo. Sau khi
chu trình kết thúc, chúng không còn giá trị.
 Tham biến còn được sử dụng để trả lại kết quả, như các
ngôn ngữ lập trình truyền thống. Ngoài ra, do Maple có
những hàm có khả năng trả lại nhiều hơn một giá trị. Ta có
thể gộp các giá trị này vào một danh sách để trả lại như một
phần tử.
e. Định giá các biến.
Định giá tên hàm và tham biến: Như đã đề cập trước đây, các tên
biến trong một biểu thức được Maple định giá trước khi thực hiện
các phép tính trên chúng. Đối với việc thực hiện các hàm cũng
tương tự như vậy. Trước tiên là tên chu trình được định giá. Sau đó
lần lượt đến các đối số trong danh sách các đối số truyền cho chu
trình (được định giá từ trái sang phải). Nếu tên chu trình được định
giá trỏ đến một chu trình, thì chu trình ấy được thực thi trên các đối
số đã được định giá. Tuy nhiên vẫn có một số chu trình ngoại lệ: đó
là các hàm eval, assigned, seq.
Định giá biến cục bộ và biến toàn cục: Các biến cục bộ và tham
biến truyền cho chu trình được định giá một cấp (định giá một lần),
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 10

Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
còn các biến toàn cục thì được định giá hoàn toàn (full evaluation).
Hàm eval( ) được dùng để ép định giá hoàn toàn cho biến cục bộ
và tham biến, và định giá một mức cho các biến toàn cục.
f. Các chức năng khác.
- Muốn in ra màn hình các "vòng lệnh ẩn" ta sử dụng biến
printlevel. Đây là cách đơn giản nhất để xem xét các quá trình
thực hiện lệnh. Khi printlevel được gán giá trị âm thì không
hiện gì cả, nếu được gán giá trị 0 thì chỉ có kết quả của các câu
lệnh được hiện ra.
- Dò từng lệnh trong chu trình:
trace(f)
trace(f, g, h, . . .)
Tham số: Các hàm f, g, h, là các hàm cần chạy từng bước.
Lệnh trace cho in cách thức hiện từng lệnh của một chu trình ra
màn hình.
Lệnh dò trace() hoạt động tương tự như khi ta gán cho biến
printlevel một số đủ lớn để có thể hiện ra màn hình tất cả các
câu lệnh cũng như điểm vào và điểm ra của hàm mà ta đang thực
hiện.
Trong suốt quá trình thực hiện, các điểm vào, các kết quả của
các câu lệnh, các điểm ra của hàm cần dò được hiện ra màn
hình. Các tham biến được hiện ra ở điểm vào chu trình, giá trị
trả lại của hàm được hiện ra ở điểm cuối chu trình.
Chú ý: Không thể dò từng bước một số hàm có quy tắc định giá
đặc biệt, bao gồm: assigned, eval, evalhf, evalf, evaln, traperror,
seq, userinfo.
- Xem mã nguồn một chu trình:
showstat(procName)
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 11

Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
showstat(procName, statRange)
Tham số: procName: Tên của chu trình cần hiển thị mã nguồn.
StatRange: Phạm vi các dòng lệnh cần được hiển thị (từ dòng
nào đến dòng nào).
Phần lớn các lệnh trong Maple đều được viết bằng ngôn ngữ
Maple, do đó chúng ta có thể đọc được mã nguồn của những
lệnh này. Maple cung cấp hàm showstat() để hiện đoạn chương
trình là mã nguồn của các lệnh trên. Nhờ có hàm này mà người
học lập trình trên Maple có thể dễ dàng học được cách thức cũng
như đặc trưng ngôn ngữ bằng cách nghiên cứu phương thức mà
các lệnh của Maple thực hiện (thông qua việc xem mã nguồn
của chúng). Ta có thể hiển thị một phần mã nguồn của các chu
trình bằng cách định rõ phạm vi của các dòng cần thể hiện.
Chúng ta cũng có thể sử dụng các hàm print() và interface() để
đọc mã nguồn của các hàm trong Maple. Thông thường thì
Maple không hiển thị phần thân của các chu trình đó nếu ta cho
hiển thị chúng. Muốn làm điều này, ta phải gọi lệnh interface()
với tham số verbosepro =2 trước, sau đó dùng lệnh print thì ta
có thể xem được thân của chu trình.
- Chặn bắt lỗi:
traperror(expr1, expr2, )
Tham số: expr1, expr2, là các biểu thức.
Maple sử dụng biến lasterror để lưu thông báo lỗi của lỗi xảy ra
mới nhất trong quá trình tính toán. Ta có thể sử dụng biến này
giống như bất cứ biến nào khác trong Maple, cụ thể là ta có thể
gán giá trị bất kì nào đó cho nó, tính toán trên biến này và ghi
giá trị nó đang lưu trữ ra màn hình. Tuy nhiên khi xảy ra lỗi,
Maple tự động gán cho biến này xâu kí tự thông báo lỗi mà hàm
ERROR() sẽ hiển thị ra màn hình.

Cùng với biến lasterror, hàm traperror() được sử dụng để chặn
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 12
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
bắt một lỗi nào đó trong một biểu thức trước khi lỗi đó được
thông báo ra màn hình. Nếu có lỗi nào đó xảy ra trong lúc định
giá trị hoặc đơn giản biểu thức, hàm traperror() sẽ trả lại xâu kí
tự thông báo lỗi của lỗi đầu tiên gặp phải khi tính toán biểu thức
đó. Nếu không có lỗi, hàm traperror() trả lại kết quả tính toán
biểu thức. Mỗi lần gọi đến hàm traperror(), Maple tự động xoá
đi giá trị cũ có trong bốn lần tính toán trước.
2.2. Giới thiệu lập trình Maplet trong Maple.
2.2.1. Các ứng dụng Maplets là gì?
Một ứng dụng Maplet đó là một chương trình với giao diện đồ họa
người sử dụng (GUI – graphical user interface) bao gồm các đối
tượng: windows, textboxs, menus, buttons và hàng loạt các visual
interfaces khác. Các ứng dụng maplet chạy trên nền Java Runtime
Environment[TM].
2.2.2. Các thuật ngữ cơ bản
Window: cửa sổ trên đó bao gồm nhiều đối tượng khác, các đối
tượng này có thể điều khiển các chức năng và cách bố trí của
window. Một ứng dụng Maplet có thể gồm nhiều windows
Dialog: hộp thoại, chứa các đối tượng khác tuy nhiên không giống
với window là các đối tượng của nó có một cấu trúc địịh trước.
Elements: các đối tượng, tập hợp các đối tượng sẽ tạo một ứng dụng
Maplet, thí dụ: windows, buttons, and check boxes
Layout: bố trí, một cách bố trí sẽ xác định các đối tượng trong
Maplet sẽ được biểu diễn như thế nào.
2.2.3. Cách tạo các ứng dụng Maplets
Có hai cách để tạo các ứng dụng Maplets:
- Sử dụng Maplets package (syntax-based).

- Sử dụng Maplet builder (GUI-based).
2.2.4. Maplets Package.
Maplets pakage bao gồm tập hợp các lệnh (command) sử dụng để
tạo và biểu diễn các ứng dụng Maplet.
Maplets pakage được phân thành các gói lệnh con (subpakage):
Elements, Tools, Utilities, Examples
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 13
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
Cấu trúc của một maplet
>with(Maplets[<Subpakage name>]): # khai báo subpakage
MyMaplet:=Maplet( [
[<Command 1>],
[<Command 2>],

[<Command n>]
]): #Ứng dụng có tên là MyMaplet bao gồm tập hợp
> #các lệnh (tổ hợp lệnh) <Command 1>,<Command 2>,…,
<Command n> trong gói subpagake đã khai báo
>Maplets[Display](MyMaplet); # Chạy chương trình có tên là
MyMaplet có nội dung như trên
Gói lệnh Elements
Bao gồm tập hợp các lệnh dùng để tạo các đối tượng (Elements)
trong một ứng dụng Maplet, thí dụ: windows, buttons, checkboxs …
Gói này gồm có:
Action AlertDialog Argument BorderLayout
BoxCell BoxColumn BoxLayout BoxRow
Button ButtonGroup CheckBox CheckBoxMenuItem
CloseWindow ColorDialog ComboBox ConfirmDialog
DropDownBox Evaluate FileDialog Font
GridCell GridCell2 GridLayout GridRow

HorizontalGlue Image InputDialog Item
Label ListBox Maplet MathMLEditor
MathMLViewer Menu MenuBar MenuItem
MenuSeparator MessageDialog PasswordField Plotter
PopupMenu QuestionDialog RadioButton RadioButtonMenuItem
Return ReturnItem RunDialog RunWindow
SetOption Shutdown Slider Table
TableHeader TableItem TableRow TextBox
TextField ToggleButton ToolBar ToolBarButton
ToolBarSeparator VerticalGlue Window
Gói lệnh Tools
Gói này gồm có
AddAttribute AddContent Get ListBoxSplit
Print Set SetTimeout StartEngine
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 14
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
StopEngine
Gói lệnh Utilities
Gói này gồm có
ErrorDialog GetFile HelpBrowser
Gói Examples
Bao gồm những mẫu maplet viết sẵn, có thể dùng để nhúng vào các
maple worksheet
Cú pháp chung
>with(Maplets[Examples]):
>Command();
Không cần dùng lệnh Display để chạy các maplet mẫu từ gói này
Gói này gồm có
Alert Confirm GetColor GetEquation
GetExpression GetFile GetInput Integration

KernelOpts Message Question Selection
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 15
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
CHƯƠNG II: MỘT SỐ PHÉP TOÁN RỜI RẠC BIỂU DIỄN BẰNG
MAPLE
I. Một số phép biến đổi trên ma trận.
1.1. Phép biến đổi trên dòng
- Nhân hàng i của ma trận A với số x.
RowOperation(A,i,x);
- Hoán vị 2 hàng i và j.
RowOperation(A,[i,j]);
- Bổ sung vào hàng i, hàng j sau khi nhận hàng j với x.
RowOperation(A,[i,j],x);
- Chú ý : để nhớ thay đổi cho ma trân A sau khi tiến hành thay
đổi, ta bổ sung thâm tham số inplace = true.
RowOperation(A,i,x,inplace=true);
RowOperation(A,[i,j],inplace=true);
RowOperation(A,[i,j],x,inplace=true);
1.2. Phép biến đổi trên cột.
- Nhân cột i của ma trân A với số x.
ColumnOperation(A,i,x);
- Hoán vị 2 cột i và j.
ColumnOperation(A,[i,j]);
- Bổ sung vào cột i cột j sau khi nhân cột j với x.
ColumnOperation(A,[i,j],x);
- Tương tự như trên ta cũng có:
ColumnOperation(A,i,x,inplace=true);
ColumnOperation(A,[i,j],inplace=true);
ColumnOperation(A,[i,j],x,inplace=true);
1.3. Ví dụ.

> A:=RandomMatrix(4,generator=-5 5);
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 16
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
> RowOperation(A,1,2);
> RowOperation(A,[2,3]);
> RowOperation(A,[1,4],a);
> ColumnOperation(A,1,2);
> ColumnOperation(A,[2,3]);
> ColumnOperation(A,[1,4],a);
> A:=RandomMatrix(4,generator=-5 5);
> RowOperation(A,[1,4]);
> A;
> RowOperation(A,[1,4],inplace=true);
> A;
1.4. Kiểm tra ma trận.
> with(LinearAlgebra);
> A:=Matrix(3,3,[[1,2,3],[1,1,1],[5,7,9]]);
- kiểm tra ma trận vuông
> type(A,’Matrix’(square));
> A:=DiagonalMatrix([2,3,4,5]);
- kiểm tra ma trận đối xứng
> type(A,’Matrix’(symmetric));
> A:=DiagonalMatrix([2,3,4,5]);
B:=RandomMatrix(4);
- kiểm tra ma trận xác định dương
> IsDefinite(A);
> IsDefinite(A,query = ‘positive_definite’);
> IsDefinite(B);
- kiểm tra ma trận trực giao
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 17

Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
> G := Matrix([[cos(theta),sin(theta),0],[-sin(theta),cos(theta),0],
[0,0,1]]);
> IsOrthogonal(G);
- kiểm tra ma trận Unitary
> Q := <<sqrt(10)*3/10, -sqrt(10)/10>|<sqrt(10)*I/10,
3*sqrt(10)*I/10>>;
> IsUnitary(Q);
> A:=<<2,0>|<I,-2>>;
B:=<<1,I>|<0,-1>>;
- kiểm tra tính đồng dạng của hai ma trận
> IsSimilar(A ,B );
> A := DiagonalMatrix([5,12,13]);
> B := <<5,0,0>|<3,12,0>|<4,-4,13>>;
> IsSimilar(A ,B );
- lấy ra ma trận của phép biến đổi trong trường hợp hai ma trận đồng
dạng
> (q, P) := IsSimilar(A, B, output=['query', 'C']);
> A = P^(-1) . B . P;
1.5. Phép toán trên ma trận.
with(LinearAlgebra);
> A:=RandomMatrix(4);
- sử dụng phép khử Gausse (đưa về dạng tam giác)
> GaussianElimination(A);
- đưa về dạng tam giác rút gọn
> ReducedRowEchelonForm(A);
- ứng dụng để giải hệ Ax=b.
> A:=RandomMatrix(4);
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 18
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn

b:=RandomVector(4);
> GaussianElimination(<A|b>);
> ReducedRowEchelonForm(<A|b>);
chú ý: ma trận mở rộng có thể viết <A|b>.
-phân tích ma trận A=B.C với rank(A)=rank(B)=rank(C)=r, A(mxn),
B(mxr), C(rxn)
> A := <<2,3,1>|<4,6,-1>|<-1,-3/2,-2>>;
Rank(A);
> (Q1,R1) := QRDecomposition(A);
-kiểm tra lại kết quả
> Q1.R1;
- tạo hệ nhanh chóng với ma trận hệ số A và cột vector tự do b, các biến
x1,x2,…
> A:=RandomMatrix(4);
b:=RandomVector(4);
sys:=GenerateEquations(<A|b>,[x1,x2,x3,x4]);
for i from 1 to 4 do print(sys[i]); od;
1.6. Tìm hàm đặc trưng.
Giả sử A là ma trận vuông, P(x)- đa thức bậc n. Ta cần tính P(A).
Phương pháp làm cơ bản là tìm đa thức đặc trưng f(x). Sau đó nhờ
kết quả f(A)=0, ta thực hiện chia P(x) cho f(x) được đa thức dư r(x).
Kết quả sẽ là r(A).
Phương pháp này sẽ được minh họa qua thủ tục sau:
> ValueP:=proc(P::polynom,var::name,A::Matrix)
local r,f,lambda,dt,temp;
uses LinearAlgebra;
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 19
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
printf(”Da thuc dac trung :”);
f:=unapply(CharacteristicPolynomial(A,lambda),lamb da);

print(det(CharacteristicMatrix(A,lambda))=f(lambda ));
printf(”Thuc hien phep chia da thuc :”);
r:=rem(P,f(var),var);
print(P=quo(P,f(var),var)*’f'(var)+r );
printf(”So du :”);
print(’r(x)’=r);
printf(”Gia tri can tinh :”);
dt:=r-coeff(r,var,0);
temp:=map2(subs,var=A,dt)+coeff(r,var,0)*Matrix(Ro
wDimension(A),shape=identity);
print(temp=eval(temp));
end proc;
> A:=<<1,0,2>|<0,3,0>|<2,0,1>>;
P1:=x^4-5*x^3+7*x^2+19*x+3;
P2:=4*x^4-5*x^3+2*x^2+19*x+5;
> ValueP(P1,x,A);
> ValueP(P2,x,A);
Tất nhiên ta có thể sử dụng hàm ma trận để tính
> LinearAlgebra[MatrixFunction](A,P1,x);
> LinearAlgebra[MatrixFunction](A,P2,x);
1.7. Lược đồ trực giao Gram – Schmidt.
Phương pháp trực giao Gram-Schmidt là phương pháp trực giao hệ vecto
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 20
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
thường được sử dụng trong các bài toán đại số tuyến tính. Một thủ tục có thể
giúp chúng ta thấy rõ từng bước thực hiện:
> GramSchmidt:=proc(X::list(Vector))
local ds,i,n,e,beta;
n:=nops(X);
printf(“1. Vecto dau tien: “);

ds[1]:=X[1];
print(e[1]=ds[1]);
for i from 2 to n do
printf(cat(i,” Vecto thu “,i,” duoc tinh theo he thuc:”));
print(e[i]=`X[i]`+Sum(beta[k]*e[k],k=1 i-1));
printf(cat(“Cac he so duoc tinh tu tinh truc giao: (e[",i,"],e[j])=0,j=1 ”,i-
1,”.\nSuy ra:”));
print(beta[k]=-`(X[i],e[k])`/`(e[k],e[k])`);
print(seq(beta[k]=-(X[i].ds[k])/(ds[k].ds[k]),k=1 i-1));
ds[i]:=simplify(X[i]+add(-(X[i].ds[k])/(ds[k].ds[k])*ds[k],k=1 i-1));
print(e[i]=ds[i]);
end do;
printf(“KET QUA:”);
print(seq(ds[k],k=1 n));
end proc:
Ví dụ:
> GramSchmidt([<2,3,4>,<1,1,2>,<1,0,1>]);
Các bạn có thể kiểm tra lại kết quả với hàm của Maple:
> LinearAlgebra[GramSchmidt]([<2,3,4>,<1,1,2>,<1,0,1>]);
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 21
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
CHƯƠNG III: GIAI BÀI TOÁN RỜI RẠC NÂNG CAO BẰNG
MAPLE
1. Cây
1.1.Định nghĩa
Cây là một đồ thị liên thông không có chu trình.
1.2.Cây khung ngắn nhất
1.2.1. Thuật toán Kruskal
Trong Maple chúng ta có thể tìm cây khung có trọng số nhỏ nhất bằng thuật
toán Kruskal, sử dụng hàm sau đây:

• KruskalsAlgorithm(G,w,animate)
Trong đó : G là đồ thị cần tìm cây khung có trọng số nhỏ nhất
w là trọng lượng của cây khung tìm được.
animate dùng để xem hàm KruskalsAlgorithm chạy từng bước.
Ví dụ :
> with(GraphTheory):
> with(RandomGraphs):
>A:=Matrix([[0,1,0,4,0,0],[1,0,1,0,3,0],[0,1,0,3,0,1],[4,0,3,0,1,0],[0,3,0,1,0,4],
[0,0,1,0,4,0]])
>G:=Graph(A)
>T:=MinimalSpanningTree(G)
>Edges(T,weights)
{[{1,2},1],[{2,3},1],[{3,4},3],[{3,6},1],[{4,5}],1]}
>add(GetEdgeWeight(G,e),e = Edges(T))
7
>S:=SpanningTree(G)
>add(GetEdgeWeight(G,e),e = Edges(S))
10
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 22
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
>PrimsAlgorithm(G,'w',animate)
>w 7
1.2.2. Thuật toán Prim
Trong Maple chúng ta có thể tìm cây khung có trọng số nhỏ nhất bằng thuật
toán Kruskal, sử dụng hàm sau đây:
• PrimsAlgorithm(G,w,animate)
Trong đó, các đối số được dùng tương tự như trong hàm KruskalsAlgorithm.
2. Biểu diễn bằng ma trận
a. Ma trận liên kết
Trong Maple chúng ta có thể biểu diễn 1 đồ thị theo dạng ma trận liên kết bằng

các hàm sau đây:
- IncidenceMatrix(G)
- IncidenceMatrix(G, reverse)
Trong đó : G là đồ thị cần biểu diễn bằng ma trận liên kết.
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 23
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
reverse là tham số sử dụng cho đồ thị có hướng
IncidenceMatrix(G) trả về ma trận liên kết của đồ thị G, index của dòng của ma
trận là các đỉnh đồ thị G, và index của các cột là các cạnh của đồ thị G. Bậc của
các cạnh của đồ thị G được xác định bằng hàm Edges(G).
Nếu G là đồ thị vô hướng, thì phần tử (i, j) của ma trận liên kết bằng 1 khi đỉnh i
được nối với cạnh j .
Nếu G là đồ thị có hướng thì phần tử (i, j) của ma trận liên kết bằng 1 khi đỉnh i
là điểm đầu của cạnh j, và bằng -1 khi đỉnh i là điểm cuối của cạnh j .
Nếu G là đồ thị có hướng và ta truyền thêm tham số reverse, thì phần tử (i, j)
của ma trận liên kết bằng 1 khi đỉnh i là điểm cuối của cạnh j, và bằng -1 khi
đỉnh i là điểm đầu của cạnh j .
Ví dụ :
> with(GraphTheory):
>G=CompleteGraph(4)
G :=Graph 1 : an undirected unweighted graph with 4 vertices and 6 edge(s)
>Edges(G)
{{1,2},{1,3},{1,4},{2,3},{2,4},{3,4}}
>IncidenceMatix(G)
1 1 1 0 0 0
1 0 0 1 1 0
0 1 0 1 0 1
0 0 1 0 1 1
 
 

 
 
 
 
>DG:=Digraph(Trail(1,2,3,4,5,3), Trail(1,5,2,4,1))
DG:=Graph 2: a directed unweighted graph eith 5 vertices and 9
arc(s)
>Edges(DG)
{[1,2],[1,5],[2,3],[2,4,[3,4],[4,1],[4,5],[5,2],[5,3]}
>IncidenceMatrix(DG)
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 24
Báo cáo chuyên đề: Lập trình Symbolic và ứng dụng. GVHD: PGS. TS. Đỗ Văn Nhơn
1 1 0 0 0 1 0 0 0
1 0 1 1 0 0 0 1 0
0 0 1 0 1 0 0 0 1
0 0 0 1 1 1 1 0 0
0 1 0 0 0 0 1 1 1

 
 
− −
 
 
− −
 
− −
 
 
− −
 

>IncidenceMatrix(DG,reverse)
1 1 0 0 0 1 0 0 0
1 0 1 1 0 0 0 1 0
0 0 1 0 1 0 0 0 1
0 0 0 1 1 1 1 0 0
0 1 0 0 0 0 1 1 1
− −
 
 
− −
 
 

 
− −
 
 
− −
 
b. Ma trận kề
Trong Maple chúng ta có thể biểu diễn 1 đồ thị theo dạng ma trận kề bằng các
hàm sau đây:
c. AdjacencyMatrix(G)
Trong đó : G là đồ thị cần biểu diễn bằng ma trận kề.
Lệnh AdjacencyMatrix(G) trả về ma trận kề cho đồ thị G, chỉ mục của các dòng
và cột của ma trận kề là các đỉnh của đồ thị.
Ví dụ :
>with(GraphTheory):
>G:=Graph([1,2,3,4],Trail(1,2,3,4,1))
G:=Graph 1: an undirected unweighted graph eith 4 vertices

and 4 edge(s)
>AdjacencyMatrix(G)
0 1 0 1
1 0 1 0
0 1 0 1
1 0 1 0
 
 
 
 
 
 
>Neighbors(G)
>H:=Digraph([1,2,3,4],Trail(1,2,3,4,1))
H:=Graph 2: a directed unweighted graph with 4 vertices and
HVTH: BÙI HỮU TIẾN - MHV: CH1102010 Page 25

×