Tải bản đầy đủ (.docx) (25 trang)

TÌM HIỂU VỀ MAPLE VÀ GIẢI BÀI TOÁN VỚI 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 (1.48 MB, 25 trang )

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
CHƯƠNG TRÌNH ĐẠO TẠO THẠC SĨ CNTT QUA MẠNG
________________
BÀI THU HOẠCH MÔN HỌC
LẬP TRÌNH SYMBOLIC
Đề tài: TÌM HIỂU VỀ MAPLE VÀ GIẢI BÀI TOÁN VỚI
MAPLE
Giảng viên phụ trách: PGS.TS.Đỗ Phúc
Sinh viên thực hiện: Nguyễn Thị Phúc Triêm
Mã số: CH1101051
Lớp: Cao học CNTT khóa 6
TP. HCM, năm 2013
Mục lục
Khóa luận môn học: Triết học
Lời mở đầu
Dạy học tương tác là xu hướng mới của giáo dục hiện nay. Hình thức dạy học này mang
đến cho người học một môi trường lý tưởng để kiến tạo và tự chiếm lĩnh kiến thức thông qua các
họat động được thiết kế bởi người dạy. Người học có điều kiện phát triển mạnh mẽ tính chủ
động, tư duy sáng tạo và các kỹ năng sử dụng những công cụ hiện đại của khoa học công nghệ,
đáp ứng nhu cầu của thực tiễn đối với sản phẩm đào tạo.
Trong dạy toán, việc sử dụng các phầm mền Mathematieca, Maple, Cabri Geometry,
Geometer's Sketchpad,Mathcad vào hỗ trợ tự học, tự nghiên cứu của sinh viên là vấn đề rất cần
thiết. Từ đó, định hướng được cách dạy của người dạy cho người học và cách học của người học
trên sự hỗ trợ của các phần mềm toán học.
Trong phạm vi bài tiểu luận này em xin trình bày sơ lược về Maple đồng thời giải một bài
toán đơn giản với Maple
Chúng em xin được gửi lời cám ơn chân thành đến PGS.TS.Đỗ Phúc, người đã tận tâm
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”.
Xin cảm ơn ban cố vấn học tập và ban quản trị Chương trình đào tạo thạc sỹ Công nghệ thông tin
qua mạng của Đại Học Quốc Gia Thành phố Hồ Chí Minh đã tạo điều kiện cho chúng em hoàn
thành tốt môn học.


2
Khóa luận môn học: Triết học
Chương 1: Giới thiệu về Maple
Maple là một gói phần mềm toán học thương mại phục vụ cho nhiều mục đích. Nó phát triển lần
đầu tiên vào năm 1980 bởi Nhóm Tính toán Hình thức tại Đại học Waterloo ở Waterloo, Ontario,
Canada.
Từ năm 1988, nó đã được phát triển và thương mại hóa bởi Waterloo Maple Inc. (còn được biết
đến với tên gọi Maplesoft), một công ty Canada cũng có trụ sở tại Waterloo, Ontario. Phiên bản
hiện tại là Maple 13 được phát hành vào tháng 5 năm 2009. Đối thủ cạnh tranh chính của nó là
Mathematica
1.1 Lịch sử phát triển
Khái niệm đầu tiên về Maple xuất phát từ một cuộc họp vào tháng 11 năm 1980 tại Đại học
Waterloo. Những nhà nghiên cứu tại đại học muốn mua một máy tính đủ mạnh để chạy
Macsyma. Thay vào đó, người ta quyết định họ sẽ phát triển hệ thống đại số máy tính riêng để có
thể chạy được những máy tính có giá thành hợp lý hơn. Do đó, dự án bắt đầu với mục tiêu là tạo
ra một hệ thống đại số hình thức mà các nhà nghiên cứu và sinh viên có thể truy cập được.
Sự phát triển đầu tiên của Maple được tiến hành rất nhanh, với phiên bản hạn chế đầu tiên
xuất hiện vào tháng 12 năm 1980. Những nhà nghiên cứu đã thử nghiệm và loại bỏ nhiều ý
tưởng khác nhau để tạo ra một hệ thống liên tục cải tiến. Maple được trình diễn đầu tiên tại
những hội nghị bắt đầu vào năm 1982.
Đến cuối năm 1983, trên 50 trường đại học đã cài Maple trên máy của họ. Do số lượng hỗ
trợ và yêu cầu giấy phép lớn, vào năm 1984, nhóm nghiên cứu đã sắp xếp với WATCOM
Products Inc để cấp phép và phân phối Maple.
3
Khóa luận môn học: Triết học
Vào năm 1988, do số lượng hỗ trợ ngày càng tăng, Waterloo Maple Inc. được thành lập. Mục
tiêu đầu tiên của công ty là quản lý những bản phân phối phần mềm. Cuối cùng, công ty cũng
phải mở ra phòng R&D ở đó khá nhiều sự phát triển cho Maple được thực hiện đến ngày nay. Sự
phát triển đáng kể của Maple tiếp tục diễn rại những phòng thí nghiệm trường đại học, bao gồm:
Phòng thí nghiệm Tính toán hình thức tại Đại học Waterloo, Trung tâm nghiên cứu Tính toán

hình thức Ontario tại Đại học Tây Ontario, và những phòng thí nghiệm khắp nơi trên thế giới.
Vào năm 1989, giao diện đồ họa người dùng đầu tiên của Maple được phát triển và bao gồm
trong bản 4.3 dành cho Macintosh. Những phiên bản trước của Maple chỉ gồm giao diện dòng
lệnh với ngõ ra hai chiều. Bản X11 và Windows với giao diện mới tiếp bước vào năm 1980 với
Maple V.
Vào năm 1999, với việc phát hành Maple 6, Maple đã đưa vào một số Thư viện Số học
NAG, được mở rộng độ chính xác ngẫu nhiên.
Vào năm 2003, giao diện "chuẩn" hiện nay được giới thiệu trong Maple 9. Giao diện này
được viết chủ yếu bằng Java (mặc dù có nhiều phần, nhưng luật cho việc gõ công thức toán học,
được viết bằng ngôn ngữ Maple). Giao diện Java bị phê phán là chậm, những sự phát triển được
thực hiện trong các bản sau, mặc dù tài liệu Maple 11 documentation khuyến cáo giao diện (“cổ
điển”) trước đây dành cho người với bộ nhớ vật lý ít hơn 500 MB. Giao diện cổ điển này không
còn được bảo trì.
Giữa 1995 và 2005 Maple đã mất khá nhiều thị phần vào tay đối thủ do có giao diện người
dùng yếu hơn. Nhưng vào năm 2005, Maple 10 giới thiệu một “chế độ văn bản” mới, như một
phần của giao diện chuẩn. Tính năng chính của chế độ này là phép toán được đưa vào bằng ngõ
nhập hai chiều, do đó nó xuất hiện tương tự như công thức trong sách. Vào năm 2008, Maple 12
đã thêm những tính năn giao diện người dùng giống như Mathematica, gồm có những kiểu trình
bày theo mục đích đặc biệt, quản lý phần đầu và cuối trang, so trùng mở đóng ngoặc, vùng thực
hiện tự động, mẫu hoàn thành lệnh, kiểm tra cú pháp và vùng tự động khởi tạo. Những tính năng
khác được thêm để làm cho Maple dễ dùng hơn như một hộp công cụ Maple
4
Khóa luận môn học: Triết học
1.2 Các lệnh lập trình cơ bản Maple
1.2.1 Vòng lặp While
Cấu trúc cú pháp:
While <điều kiện> do <dãy lệnh> od;
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.
1.2.2 Vòng lặp For
Cấu trúc cú pháp:
for name from start by change to finish
5
Khóa luận môn học: Triết học
do
statement sequence
od;
Hoặc dạng phát biểu khác:
for name in expression
do
statement sequence
od;
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.
1.2.3 Lện điều kiện if
Cấu trúc cú pháp:
if condition then
statement sequence
6
Khóa luận môn học: Triết học
| 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.
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.2.4 Lệnh Break
Cấu trúc cú pháp:
break
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
7
Khóa luận môn học: Triết học
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.5 Lệnh Next
Cấu trúc cú pháp:
next
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.2.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.
8
Khóa luận môn học: Triết học
1.3 Cách viết một thủ tục (PROCEDURE)
1.3.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 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, ).
1.3.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]
9
Khóa luận môn học: Triết học
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.
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.
1.3.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.
Phạm vi các biến (biến toàn cục, biến cục bộ và tham biến)
Biến toàn cục
10
Khóa luận môn học: Triết họ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ì.
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ử.
Định giá trên 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.
11
Khóa luận môn học: Triết học
1.3.4 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)
showstat(procName, statRange)
Tham số:
• procName: Tên của chu trình cần hiển thị mã nguồn.
12
Khóa luận môn học: Triết học
• 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 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.
13
Exing API
C API Java API
VB 6 API
Khóa luận môn học: Triết học
1.4 Thư viện OpenMaple
1.4.1 OpenMaple là gì
OpenMaple là một bộ các chức năng mà cho phép truy cập vào các thuật toán Maple và cấu
trúc dữ liệu trong biên dịch chương trình C, Java, hoặc Visual Basic. Đây là sự đảo ngược của
ExternalCalling, cho phép truy cập vào mã biên dịch C và Java từ Maple.
Để chạy ứng dụng này phải cài đặt phên bản Maple 9 trở về sau.
OpenMaple là các API (application program interface) được xây dựng dựa trên các API có
sẵn để viết các gói ExternalCalling tùy chỉnh. Cung cấp các hàm để bắt đầu/ kết thúc một phiên
Maple, đánh giá lệnh, thao tác trên cấu trúc dữ liệu của Maple, các lệnh điều khiển kết quả đầu
ra.

OpenMaple được viết hỗ trợ ba ngôn ngữ là C, Java và VB 6: C OpenMaple, Java
OpenMaple, VB 6 OpenMaple. Trong đó VB 6 OpenMaple được xây dựng dựa trên C API.
Toàn bộ các API này được lưu trong file maplec.dll
1.4.2 Giao tiếp với OpenMaple
Việc giao tiếp với OpenMaple là việc gọi các hàm trong thư viện maplec.dll và tuân thủ các
thao tác mà thư viện này qui định
Đóng mở phiên làm việc với Maple: Gọi hàm StartMaple để mở phên làm việc với Maple
và thiết lập các thông số ban đầu. Gọi hàm StopMaple để kết thúc phiên làm việc với Maple
14
Khóa luận môn học: Triết học
StartMaple(argcr, argv(),cb ,data , info ,err())
Trong đó :
argc: Số tham số (Là số tham số ở argv() )
argv(): Mảng các tham số truyền vào
cb: Tham trị truyền vào theo cấu trúc MapleCallbacks
data, info: 2 tham số con trỏ chứa thông tin
err(): Thông tin lỗi truyền ra
Gía trị trả về là một con trỏ của thư viện OpenMaple đã khởi tạo.
StopMaple(kv)
kv: Là biến con trỏ trả về từ hàm StartMaple
MapleCallbacks
MapleCallbacks bao gồm các hàm trả ra kết quả từ Maple (Maple output)
public delegate void TextCallBack(IntPtr data, int tag, IntPtr output);
public delegate void ErrorCallBack(IntPtr data, IntPtr offset, IntPtr msg);
public delegate void StatusCallBack(IntPtr data, IntPtr used, IntPtr alloc, double time);
public delegate IntPtr ReadLineCallBack(IntPtr data, IntPtr debug);
public delegate long RedirectCallBack(IntPtr data, IntPtr name, IntPtr mode);
public delegate IntPtr StreamCallBack(IntPtr data, IntPtr stream, int nargs, IntPtr args);
public delegate long QueryInterrupt(IntPtr data);
public delegate IntPtr CallBackCallBack(IntPtr data, IntPtr output);

public struct MapleCallbacks
{
public TextCallBack textCallBack;
public ErrorCallBack errorCallBack;
15
Khóa luận môn học: Triết học
public StatusCallBack statusCallBack;
public ReadLineCallBack readlineCallBack;
public RedirectCallBack redirectCallBack;
public StreamCallBack streamCallBack;
public QueryInterrupt queryInterrupt;
public CallBackCallBack callbackCallBack;
}
EvalMapleStatemen
Là hàm truyền các lệnh vào cho thư viện maple xử lý
EvalMapleStatement(kv, statement())
kv : Con trỏ nhận được từ hàm StartMaple
statement() : Lệnh truyền vào
Dữ liệu ra sẽ là file, hoặc gọi các hàm tại :
MapleCallbacks.textCallBack
MapleCallbacks.errorCallBack
MapleCallbacks.statusCallBack

1.4.3 Ví dụ kết nối Maple với C#
using System;
using System.Text;
using System.Runtime.InteropServices;
static class MapleEngine
{
public delegate void TextCallBack(IntPtr data, int tag, IntPtr output);

public delegate void ErrorCallBack(IntPtr data, IntPtr offset, IntPtr msg);
public delegate void StatusCallBack(IntPtr data, IntPtr used, IntPtr alloc, double time);
public delegate IntPtr ReadLineCallBack(IntPtr data, IntPtr debug);
public delegate long RedirectCallBack(IntPtr data, IntPtr name, IntPtr mode);
public delegate IntPtr StreamCallBack(IntPtr data, IntPtr stream, int nargs, IntPtr args);
public delegate long QueryInterrupt(IntPtr data);
public delegate IntPtr CallBackCallBack(IntPtr data, IntPtr output);
public struct MapleCallbacks
{
16
Khóa luận môn học: Triết học
public TextCallBack textCallBack;
public ErrorCallBack errorCallBack;
public StatusCallBack statusCallBack;
public ReadLineCallBack readlineCallBack;
public RedirectCallBack redirectCallBack;
public StreamCallBack streamCallBack;
public QueryInterrupt queryInterrupt;
public CallBackCallBack callbackCallBack;
}
[DllImport(@"maplec.dll")]
public static extern IntPtr StartMaple(int argc, String[] argv, ref MapleCallbacks cb, IntPtr
data, IntPtr info, byte[] err);
[DllImport(@"maplec.dll")]
public static extern IntPtr EvalMapleStatement(IntPtr kv, byte[] statement);
[DllImport(@"maplec.dll")]
public static extern IntPtr IsMapleStop(IntPtr kv, IntPtr obj);
[DllImport(@"maplec.dll")]
public static extern void StopMaple(IntPtr kv);
}

class MainApp
{
public static void cbText(IntPtr data, int tag, IntPtr output)
{
string s = Marshal.PtrToStringAnsi(output);
Console.WriteLine(s);
}
public static void cbError(IntPtr data, IntPtr offset, IntPtr msg)
{
string s = Marshal.PtrToStringAnsi(msg);
Console.WriteLine(s);
}
public static void cbStatus(IntPtr data, IntPtr used, IntPtr alloc, double time)
{
Console.WriteLine("cputime=" + time
+ "; memory used=" + used.ToInt64() + "kB"
+ " alloc=" + alloc.ToInt64() + "kB"
);
}
public static void Main(string[] args)
{
17
Khóa luận môn học: Triết học
MapleEngine.MapleCallbacks cb;
byte[] err = new byte[2048];
IntPtr kv;
String[] argv = new String[2];
argv[0] = "maple";
argv[1] = "-A2";
cb.textCallBack = cbText;

cb.errorCallBack = cbError;
cb.statusCallBack = cbStatus;
cb.readlineCallBack = null;
cb.redirectCallBack = null;
cb.streamCallBack = null;
cb.queryInterrupt = null;
cb.callbackCallBack = null;
try
{
kv = MapleEngine.StartMaple(2, argv, ref cb, IntPtr.Zero, IntPtr.Zero, err);
}
catch (DllNotFoundException e)
{
Console.WriteLine(e.ToString());
return;
}
catch (EntryPointNotFoundException e)
{
Console.WriteLine(e.ToString());
return;
}
if (kv.ToInt64() == 0)
{
Console.WriteLine("Fatal Error, could not start Maple: "
+ System.Text.Encoding.ASCII.GetString(err, 0, Array.IndexOf(err, (byte)0))
);
return;
}
for (; ; )
{

//Dấu nhắc lệnh để gọi lệnh trong Maple
Console.Write("> ");
18
Khóa luận môn học: Triết học
string expr = Console.ReadLine();
IntPtr val = MapleEngine.EvalMapleStatement(kv, Encoding.ASCII.GetBytes(expr +
";"));
// Nhấn quit/done/stop
if (MapleEngine.IsMapleStop(kv, val).ToInt32() != 0)
break;
}
MapleEngine.StopMaple(kv);
}
}
Chương 2: Giải bài toán khảo sát hàm số bậc 3
Các bước khảo sát hàm số y = f(x)
1) Tìm tập xác định của hàm số
2) Xét sự biến thiên của hàm số
Chiều biến thiên: Tính đạo hàm y’, xét dấu y’ để suy ra chiều biến thiên đồ thị hàm số
Cực trị: Dựa vào chiều biến thiên tìm các điểm cực trị (nếu có) của đồ thị hàm số
Tính lồi, lõm và điểm uốn: Tính đạo hàm y’’ và xét dấu y’’ để tìm điểm uốn của đồ thị
hàm số (nếu có)
Giới hạn: Tính các giới hạn của hàm số. Tìm các tiệm cận của đồ thị hàm số nếu có
3) Vẽ đồ thị hàm số
Sau đây là đoạn chương trình trong Maple thể hiện thủ tục khảo sát hàm số bậc 3
y =
>
19
Khóa luận môn học: Triết học
20

Khóa luận môn học: Triết học
21
Khóa luận môn học: Triết học
22
Khóa luận môn học: Triết học
>
Tap xac dinh: R
Xet su bien thien cua ham so
Chieu bien thien y'=-3*x^2-6*x
Dao ham y' = 0 tai x' = -2., 0.
Ham so nghich bien trong cac khoang (-infinity , -2.) va
(0. , infinity)
Ham so dong bien trong khoang (-2. , 0.)
Cuc tri ham so
Ham so co 1 diem cuc dai, 1 diem cuc tieu
Diem cuc dai (0. , 4.)
Diem cuc tieu (-2. , 0.)
Gioi han ham so
Limit(-x^3-3*x^2+4,x = -infinity) = Limit(-x^3-3*x^2+4,x
= -infinity)
Limit(-x^3-3*x^2+4,x = infinity) = Limit(-x^3-3*x^2+4,x =
infinity)
Tinh loi, lom va diem uon ham so
y'' = -6*x-6
Diem uon: U (-1 , 2)
Ham so loi trong khoang: (-1 , infinity)
Ham so lom trong khoang: (-infinity , -1)
Do thi ham so co tam doi xung la diem uon
Do thi cat truc Ox tai cac diem co hoanh do: -2., -2., 1.
Do thi cat truc Oy tai diem (0 , 4)

23
Khóa luận môn học: Triết học
Tài liệu tham khảo
/>hp://www.mapleso".com
hp://my.opera.com
24
Khóa luận môn học: Triết học

25

×