ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
BÀI THU HOẠCH
BÀI THU HOẠCH
Môn học:
Môn học:
LẬP TRÌNH SYMBONIC
LẬP TRÌNH SYMBONIC
Đề tài:
Đề tài:
GIẢI BÀI TẬP ĐẠI SỐ TUYẾN TÍNH BẰNG MAPLE
Giảng viên : PGS.TS. Đỗ Văn Nhơn.
Học viên : Phạm Hùng Phương.
Mã số HV : CH1102006.
Lớp : CAO HỌC CNTT QM KHOÁ 6.
Hà Nội, tháng 01/2013
Hà Nội, tháng 01/2013
Bài thu hoạch môn học: Lập trình Symbonic.
LỜI CẢM ƠN
Em xin chân thành cảm ơn khoa sau đại học trường Đại học Công nghệ
thông tin – Đại học Quốc gia TP.HCM đã tạo điều kiện giúp em hoàn thành môn
học.
Em xin cám ơn sâu sắc đến TS Đỗ Văn Nhơn. Thầy đã tận tình giảng dạy
chuyển tải thông tin đến cho lớp chúng em trong suốt thời gian học tập và nghiên
cứu môn Lập trình Symbonic.
Bằng lượng kiến thức đã học tập và nghiên cứu được em cố gắng hoàn
thành bài thu hoạch trong phạm vi cho phép, nhưng do thời gian và kiến thức còn
hạn chế nên bài thu hoạch vẫn còn nhiều thiếu sót. Kính mong thầy quan tâm giúp
đỡ và chỉ bảo để em hoàn thiện bài thu hoạch tốt hơn nữa.
Một lần nữa em xin được tỏ lòng biết ơn thày đã giảng dạy và chỉ bảo tận
tình, cám ơn các thày cô khoa sau đại học và nhà trường đã tạo điều kiện để chúng
em hoàn thành môn học.
Hà Nội, ngày 30 tháng 01 năm 2013
Người làm bài thu hoạch
Phạm Hùng Phương
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 2
Bài thu hoạch môn học: Lập trình Symbonic.
MỤC LỤC
M C L CỤ Ụ 3
I.GI I THI U.Ớ Ệ 3
II.S L C V L P TRÌNH TRÊN MAPLE.Ơ ƯỢ Ề Ậ 4
1.Các lệnh lập trình cơ bản. 4
2.Cách thiết lập chu trình. 7
3.Giới thiệu lập trình Maplet trong Maple. 12
III.GÓI TH VI N H TR CHO VI C GI I B I T P I S TUY N T NH.Ư Ệ Ỗ Ợ Ệ Ả À Ậ ĐẠ Ố Ế Í 14
IV.GI I B I T P I S TUY N T NH B NG MAPLE.Ả À Ậ ĐẠ Ố Ế Í Ằ 15
1.Một số phép biến đổi trên ma trận. 15
2. Kiểm tra ma trận. 16
3. Giải hệ phương trình tuyến tính. 17
4. Phép toán trên ma trận. 20
5. Tìm hàm đặc trưng. 21
6. Lược đồ trực giao Gram – Schmidt. 22
7. Dùng Maplet giải bài tập đại số tuyến tính. 23
V.T NG K T.Ổ Ế 27
1.Kết quả đạt được. 27
2.Hướng phát triển. 27
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,
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 thày cô 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.
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 3
Bài thu hoạch môn học: Lập trình Symbonic.
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. \
Cho đến cuối năm 2012, trên thị trường nước ta đã có phiên bản MAPLE 16.
Theo em, MAPLE đủ đáp ứng cho các tính toán trên số và trên các ký hiệu.
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.
1. Các lệnh lập trình cơ bản.
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à od khi mà điều
kiện vẫn còn đúng.
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 4
Bài thu hoạch môn học: Lập trình Symbonic.
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.
1.3. Lệnh điều kiện if.
a. Cú pháp.
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 5
Bài thu hoạch môn học: Lập trình Symbonic.
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.
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 (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
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 6
Bài thu hoạch môn học: Lập trình Symbonic.
để 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).
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
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 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. Cách thiết lập chu trình.
2.1. 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
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 7
Bài thu hoạch môn học: Lập trình Symbonic.
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, ).
2.2. 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;
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.
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 8
Bài thu hoạch môn học: Lập trình Symbonic.
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.
2.3. 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.
2.4. 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.
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:
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 9
Bài thu hoạch môn học: Lập trình Symbonic.
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ử.
2.5. Đị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), 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.
2.6. 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.
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 10
Bài thu hoạch môn học: Lập trình Symbonic.
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)
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,
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 11
Bài thu hoạch môn học: Lập trình Symbonic.
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 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.
3. Giới thiệu lập trình Maplet trong Maple.
3.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].
3.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.
3.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).
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 12
Bài thu hoạch môn học: Lập trình Symbonic.
3.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
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 PasswordFiel
d
Plotter
PopupMenu QuestionDialog RadioButton RadioButtonMenuItem
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 13
Bài thu hoạch môn học: Lập trình Symbonic.
Return ReturnItem RunDialog RunWindow
SetOption Shutdown Slider Table
TableHeader TableItem TableRow TextBox
TextField ToggleButton ToolBar ToolBarButton
ToolBarSeparato
r
VerticalGlue Window
Gói lệnh Tools
Gói này gồm có
AddAttribute AddContent Get ListBoxSplit
Print Set SetTimeout StartEngine
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
ShowTable SignQuery
III. GÓI THƯ VIỆN HỖ TRỢ CHO VIỆC GIẢI BÀI TẬP ĐẠI SỐ TUYẾN TÍNH.
Maple có rất nhiều thư viện chuyên biệt cho các lĩnh vực trong toán học (được gọi
là các Package), trong phần này chúng ta sẽ tìm hiểu rõ hơn về thư viện của
Maple dùng để giải bài tập đại số tuyến tính (package “linalg”); thư viên các tính
toán trong đại số tuyến tính (linear algebra). Và sau đây là một số hàm dùng
trong gói “linalg”:
Hàm lệnh with sẽ nạp thư viên linalg, và kể từ đây ta có thể sử dụng các hàm đã
được liệt kê ở trên, chẳng hạn với các ví dụ dưới.
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 14
Bài thu hoạch môn học: Lập trình Symbonic.
>
Chú ý:
Các hàm của Package linalg có thể sử dùng mà không càn phải kêu cả thư viện
linalg vào (bằng lệnh with như trên) : trước mỗi hàm lệnh ta chỉ cần chỉ rõ tên
Package, ví dụ : linalg[det] (A), linalg[angle](u,v),…
Hoặc cũng có thể chỉ kêu một hàm lệnh duy nhất để dùng, bằng cách dùng, chẳng
hạn with(linalg,det), và kể từ đó có thể dùng lệnh det mà không phải chỉ định
thêm gì nữa.
IV. GIẢI BÀI TẬP ĐẠI SỐ TUYẾN TÍNH BẰNG MAPLE.
1. 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);
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 15
Bài thu hoạch môn học: Lập trình Symbonic.
- 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);
> 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;
2. Kiểm tra ma trận.
> with(LinearAlgebra);
> A:=Matrix(3,3,[[1,2,3],[1,1,1],[5,7,9]]);
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 16
Bài thu hoạch môn học: Lập trình Symbonic.
- 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
> 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;
3. Giải hệ phương trình tuyến tính.
Hệ phương trình tuyến tính là loại phương trình thường gặp, ta xét ví dụ sau:
2*x1-x2+x3-3*x4=23,
x2-8*x4+x5=46,
3*x1-x2+x4=-34,
6*x2-x5=54,
-x1+2*x4-7*x5=-20.
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 17
Bài thu hoạch môn học: Lập trình Symbonic.
Chúng ta có thể nhanh chóng dùng lệnh solve để giải:
>eqs:={2*x1-x2+x3-3*x4=23,x2-8*x4+x5=46,3*x1-x2+x4=-34,6*x2-
x5=54,-x1+2*x4-7*x5=-20};
>vars:={x1,x2,x3,x4,x5};
>solve(eqs,vars);
Để có thể nhanh chóng tách ma trận hệ số A và cột vector tự do b trong hệ tuyến
tính, bạn có thể dùng lệnh
>A,b:=LinearAlgebra[GenerateMatrix](eqs,vars):
>print(‘A’=A); # ma trận hệ số
>print(‘b’=b); # cột vector tự do
Lúc này, ngoài lệnh solve, bạn còn có thể dùng lệnh LinearAlgebra [LinearSolve]
để tìm nghiệm cũng được:
>LinearAlgebra[LinearSolve](A,b);
Chú ý: kết quả là một vector nghiệm theo thứ tự x1,x2,…
Rõ ràng các phép gán eqs, vars thực hiện rất thủ công. Đối với các hệ phương
trình có số lượng pt và số lượng biến khá lớn, ta phải làm thế nào ?
Xét ví dụ: Giải hệ phương trình trong đó các phương trình lấy từ file dữ liệu
hephuongtrinh.txt.
Các bạn có thể tải nó ở đây: hephuongtrinh.doc . Sau khi tải về, các bạn tạo file
hephuongtrinh.txt trong ổ C:\ và copy dữ liệu qua file này (thông cảm nha, vì
WordPress không cho phép upload file text lên).
Công việc đầu tiên là lấy dữ liệu từ file này:
>data:=ImportVector(“C:\\hephuongtrinh.txt”);
>eqs:=convert(data,set);
Tiếp theo, ta viết 1 thủ tục tìm các ẩn chưa biết
> timan:=proc(s)
local vars;
vars:=convert(lhs(s),list); # tách các số hạng vế trái thành list
vars:=map(`convert/list`,vars); # tách hệ số và biến
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 18
Bài thu hoạch môn học: Lập trình Symbonic.
vars:=ListTools[Flatten](vars); # tạo ra một list chung cho biến và hệ số
convert(remove(t->type(t,complex),vars),set); # chuyển về kiểu tập hợp
end proc;
Thủ tục trên cho phép tìm các ẩn bên vế trái của một phương trình.
>vars:=map(timan,eqs); # tìm ẩn của mỗi phương trình
>vars:=map(op,vars); # tìm ẩn của hệ
Đến đây, ta làm như trên
>solve(eqs,vars);
>A,b:=LinearAlgebra[GenerateMatrix](eqs,vars):
>print(‘A’=A); # ma trận hệ số
>print(‘b’=b); # cột vector tự do
>LinearAlgebra[LinearSolve](A,b);
Tất nhiên khi sử dụng một phần mềm tính toán thì ta phải tin tưởng vào kết quả
mà nó giải ra. Tuy nhiên ta cũng có thể sử dụng các hàm đã được định nghĩa sẵn
để kiểm tra. Sau đây là một số phương pháp có thể áp dụng:
- P1: dùng lệnh subs
cấu trúc: subs(x=a,expr);
subs({x=a,y=b,….},expr);
chức năng: thay x bởi a, y bởi b, trong biểu thức expr.
> eqs:={2*x-3*y=3,12*x+5*y=13};
> sols:=solve(eqs,{x,y});
> subs(sols,eqs);
Nếu ta thu được 2 đẳng thức đúng thì lời giải đúng.
- P2: dùng lệnh simplify, eval
cách dung như trên, cấu trúc
simplify(expr,{x=a,y=b, });
eval(expr,{x=a,y=b, });
>eq:=x^3-x+2=0;
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 19
Bài thu hoạch môn học: Lập trình Symbonic.
>sols:=solve(eq,{x});
Rõ ràng phương trình có 3 nghiệm, nên ta phải kiểm tra từng nghiệm
>simplify(simplify(eq,sols[1]));
simplify(simplify(eq,sols[2]));
simplify(simplify(eq,sols[3]));
hoặc
>simplify(eval(eq,sols[1]));
simplify(eval(eq,sols[2]));
simplify(eval(eq,sols[3]));
-P3: lệnh assign
cấu trúc: assign(A=B);
chức năng: gán A bằng B
> eqs:={2*x-3*y=3,12*x+5*y=13};
> sols:=solve(eqs,{x,y});
>assign(sols);
>eqs;
chú ý: Phương pháp này thường sử dụng khi nghiệm là duy nhất (hay gặp khi
kiểm tra nghiệm hệ tuyến tính), điểm đặc biệt quan trọng là sau khi dùng lệnh
assign, các biến đều mang giá trị, nên không thể tiếp tục sử dụng các biến này để
giải các phương trình tiếp.Do đó, thông thường sau kiểm tra, ta xóa giá trị các biến
này bằng phép gán:
>x:=’x':
>y:=’y':
4. 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
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 20
Bài thu hoạch môn học: Lập trình Symbonic.
> ReducedRowEchelonForm(A);
- ứng dụng để giải hệ Ax=b.
> A:=RandomMatrix(4);
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;
5. 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;
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 :”);
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 21
Bài thu hoạch môn học: Lập trình Symbonic.
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);
6. 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 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));
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 22
Bài thu hoạch môn học: Lập trình Symbonic.
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>]);
7. Dùng Maplet giải bài tập đại số tuyến tính.
Chúng ta dùng Maplet để giải các bài tập đại số tuyến tính thì chẳng qua do
Maplet hỗ trợ cho ta dùng giao diện nên giúp ta dễ nhìn và sự dụng để giải bài tập
đại số tuyến tính một cách dễ dàng.
7.1. Giải hệ phương trình tuyến tính bằng phương pháp Gauss.
Trong đại số tuyến tính thì việc giải hệ phương trình tuyến tính là một trong
những bài toán thường hay gặp nhất. Và ở đây chúng tôi chỉ giới thiệu phương
pháp Gauss trong việc giải hệ phương trình tuyến tính trên. Sau đây là source để
giải hệ phương trình tuyến tính bằng phương pháp Gauss:
> restart;
with(Maplets[Elements]);
with(LinearAlgebra);
A := Student[LinearAlgebra][MatrixBuilder]();
m := RowDimension(A);
b := LinearAlgebra[RandomVector](m, generator = 0 100);
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 23
Bài thu hoạch môn học: Lập trình Symbonic.
PPGausse := proc (A::Matrix, b::Vector)
local maplet;
try maplet := Maplet([[
BoxColumn(border = true, "Ma tran A ban dau", MathMLViewer(value = `<|
>`(A))),
BoxColumn(border = true, "Vertor b", MathMLViewer(value = `<|>`(b))),
BoxColumn(border = true, "Ma tran suy rong", MathMLViewer(value = `<|
>`(A, b))),
BoxColumn(border = true, "Ket qua tinh toan", MathMLViewer['kq'](height
= 200))],
BoxRow(border = true, Button("PPGausse", Evaluate(kq =
GaussianElimination(`<|>`(A, b)))),
Button("Nghiem", Evaluate(kq = LinearSolve(A, b))),
Button("Thoat", Shutdown()))
]);
Maplets[Display](maplet)
catch:
error "Loi nhap du lieu hoac khong the ap dung phuong phap giai Gausse."
end try
end proc;
PPGausse(A, b);
7.2. Một số phép tính trên ma trận vuông.
Đối với ma tra vuông thì ta sẽ có một số phép tính thông dụng hay dùng trên ma
trân vuông như : tính hạng của ma trận, định thức, đa thức đặc trưng, ma trận
nghịch đảo, tính đẳng thức Gauss – Jordan, đa thức tối tiểu, vertor riêng, giá trị
riêng, luỹ thừa (tích các ma trận),… Và sau đây là source để giải và thực hiện các
phép tính trên ma trận vuông như sau:
> restart;
with(Maplets[Elements]);
with(LinearAlgebra);
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 24
Bài thu hoạch môn học: Lập trình Symbonic.
Nhap := proc ()
global A;
try
do
A := Student[LinearAlgebra][MatrixBuilder]();
if RowDimension(A) <> ColumnDimension(A)
then
Maplets[Examples][Message]("Can phai nhap ma tran vuong.\n Moi ban
nhap lai.")
Else
break
end if
end do
catch: A := Matrix(3) end try;
Maplets[Tools][Set](('nh')(value) = A)
end proc;
LThua := proc ()
local n;
try
n := Maplets[Examples][GetExpression](caption = "Nhap bac luy thua ");
Maplets[Tools][Set](('kq')(value) = A^n)
catch:
end try
end proc;
MTNghich := proc ()
local temp;
try
temp := MatrixInverse(A); Maplets[Tools][Set](('kq')(value) = temp)
Phạm Hùng Phương: Lớp Cao học CNTT QM Khoá 06. Trang 25