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áykhông làm được việc đó... Sơ lược về lậ
Trang 1LỜI CẢM ƠN
Em xin gửi lời cảm ơn chân thành đến PGS.TS Đỗ Văn Nhơn, người đã truyềnđạt những kiến thức quý báu không chỉ là lý thuyết mà Thầy còn hướng dẫn cách thứctìm hiểu, phân tích và vận dụng lý thuyết về phương thức lập trình hình thức, công cụ lậptrình Maple, biểu diễn tri thức để xây dựng các mô hình và tạo các ứng dụng hữu ích dựatrên các miền tri thức cụ thể Em xin chân thành cảm ơn Thầy vì sự hướng dẫn của Thầytrong quá trình thực hiện báo cáo này
Em xin chân thành cảm ơn Phòng Đào tạo sau Đại học đã tạo mọi điều kiện để emhoàn thành báo cáo này
Xin chân thành cảm ơn sự giúp đỡ của các anh chị, bạn bè và những người đãthường xuyên trao đổi, thảo luận và đóng góp ý kiến cho tôi về các vấn đề liên quan trongthời gian qua
Học viên thực hiện
Lê Thanh Trọng
Trang 2MỤC LỤC
Trang 3CHƯƠNG 1: CƠ SỞ LẬP TRÌNH TÍNH TOÁN HÌNH THỨC TRONG MAPLE
1.1. 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àycà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ưngtrong 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ộtcá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ệcgiả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àichí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 đổimớ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
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ềmkhác như MATLAB, MATHEMATICA, MAPLE… trong việc dạy và học môn Toán caocấ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ántrê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ảiphần mềm tính toán nào cũng có thể cộng 2X với 3X cho kết quả 5X, hay lấy đạo hàmmộ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áykhông làm được việc đó
Trang 4Trong 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 2009, trên thị trường nước ta
đã có phiên bản MAPLE 13 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
Kết hợp với công cụ toán giải MAPLE là mô hình mạng tính toán, một mô hình
“thông minh” cho phép giải một số bài toán một cách tự động trong toán học, hóa học,vật lý,… dựa trên tập các sự kiện và các luật dẫn Một số giải thuật hình thức sẽ đượcMAPLE hiện thực và đóng gói để tạo thành các thư viện hỗ trợ cho ứng dụng trong báocáo này Gói này là thành phần cốt lõi của chương trình và được MapleEngine nằm trongthành phần giao diện (C#) triệu gọi các phương thức cần thiết để giải toán
1.2. Sơ lược về lập trình Maple
Maple là một hệ thống tính toán trên các biểu thức đại số và minh hoạ
toán học mạnh mẽ của công tyWarterloo Maple Inc (maplesoft.com) Maple ra đời
năm 1991 đến nay đã phát triển đến phiên bản 16 Maple có cách cài đặt đơngiản, chạy được trên nhiều hệ điều hành, có cấu trúc linh ho ạt để sử dụng tối
ưu cấu hình máy và có trình trợ giúp (help) rất dễ sử dụng Từ phiên bản 7,Maple cung cấp ngày càng nhiều các công cụ trực quan, các gói lệnh tự học gắnliền với toán học phổ thông và đại học Ưu điểm đó làm cho nhi ều người trênthế giới lựa chọn sử dụng Maple cùng các phần mềm toán học khác áp dụng trongdạy học toánvà các công việc tính toán đòi hỏi của thực tiễn và sự phát triển củagiáo dục
C ó thể nhận thấy rằng ngoài các tính năng tính toán và minh hoạ rất mạnh
mẽ bằng các câu lệnh riêng biệt (thường chỉ cho ta kết quả cuối cùng), Maple còn
là một ngôn ngữ lập trình hướng thủ tục (procedure) Thủ tục là một dãy cáclệnh của Maple theo th ứ tự mà người lập trình định sẵn để xử lí một công việcnào đó, khi thực hiện thủ tục này Maple sẽ tự động thực hiện các lệnh có trongthủ tục đó một cách tuần tự và sau đó trả lại kết quả cuối cùng
Trang 5Mapple có các chức năng cơ bản sau:
• Là một hệ thống tính toán trên các biểu thức đại số
• Có thể thực hiện được hầu hết các phép toán cơ bản trong chương trình toán đại học vàsau đại học
• Cung cấp các công cụ minh họa hình học thuận tiện gồm: vẽ đồ thị động và tĩnh của cácđường và mặt được cho bởi các hàm tùy ý và trong các hệ tọa độ khác nhau
• Là một ngôn ngữ lập trình đơn giản và mạnh mẽ, có khả năng tương tác với các ngôn ngữlập trình khác
• Cho phép trích xuất ra các định dạng khác nhau như word, HTML…
• Một công cụ biên soạn giáo án và bài giảng điện tử, thích hợp với các lớp học tương táctrực tiếp
• Một trợ giáo hữu ích cho học sinh sinh viên trong việc tự học
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ểuthứ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.
Trang 6Chú ý 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
(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
Trang 7và 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.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
Trang 8đế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
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).
1.2.1.5. Lệnh next
a Cú pháp
Next.
Trang 9b 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 Sử dụng các hàm RETURN, ERROR.
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ệcnhậ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
Trang 10Maple 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ínhtoá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 đổidù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êngcủ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, ).
1.2.2.2. Khai báo chu trình
Lời gọi khai báo một chu trình:
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
Trang 11local_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.
1.2.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áctham 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.
1.2.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ộ:
Trang 12 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ử
1.2.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ệcthự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
Trang 13- 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àochu 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ậptrì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ằngcá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ã
Trang 14nguồ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 trongMaple, 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à ghigiá 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 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
Trang 15CHƯƠNG 2: LẬP TRÌNH TÍNH TOÁN HÌNH THỨC CHO MỘT SỐ GIẢI THUẬT TRONG MẠNG TÍNH TOÁN
2.1. Giới thiệu mạng tính toán
2.1.1. Giới thiệu
Nhận thấy có nhiều vấn đề trong các lĩnh vực khác nhau đặt ra dưới dạng một
“mạng” của các yếu tố, trong đó giữa các yếu tố có những mối liên hệ (hay quan hệ) chophép ta suy ra được một số yếu tố này từ một số yếu tố khác
Mô hình mạng suy diễn – tính toán là một sự khái quát dạng tri thức trên có thểdùng để biểu diễn tri thức và thiết kế các chương trình giải toán tự động
2.1.2. Các định nghĩa
2.1.2.1. Quan hệ suy diễn
Cho M = {x1,x2, ,xm} là một tập hợp các biến có thể lấy giá trị trong các miền xácđịnh D1, D2, ,Dm Mỗi quan hệ suy diễn R trên M được xác định bởi một (hay một số)ánh xạ có dạng:
fR,u,v : Du→ Dv,trong đó u,v là các bộ biến được phân chia từ bộ biến x = <x1,x2, ,xm>; Du và Dv
là tích của các miền xác định tương ứng của các biến trong u và trong v
Quan hệ suy diễn R(x) có thể được biểu diễn bởi một (hay một số) ánh xạ fR,u,v và
Mạng suy diễn, viết tắt là MSD, là một cấu trúc (M,F) gồm 2 tập hợp:
M = {x1,x2, ,xn}, là tập hợp các thuộc tính hay các biến lấy giá trị trong các miềnxác định nào đó
F = {f1,f2, ,fm}, là tập hợp các luật suy diễn có dạng: