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

Áp dụng thiết kế chương trình bằng maple để giải quyết bài toán

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 (880.93 KB, 20 trang )

LẬP TRÌNH SYMBOLIC
Phụ lục
Phụ lục 1
PHẦN I 3
TỔNG QUAN 3
PHẦN II MỘT SỐ LỆNH THÔNG THƯỜNG 4
2.Giải phương trình bậc <5 4
4. Tính giới hạn 4
5. Trục căn thức ở mẫu 5
7. Lệnh vẽ đồ thị 5
8. Đồ thị hàm phần nguyên 7
10. Ma trận kề 8
12. Vòng lập for 9
13. Vòng lập while 9
15. Đơn giản biểu thức 10
PHẦN III 12
ỨNG DỤNG MAPLE VÀO BÀI TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT BẰNG DIJKSTRA 12
I.Mô tả giải thuật dijkstra 12
II.Ví dụ minh họa: 12
III.Áp dụng thiết kế chương trình bằng maple để giải quyết bài toán 14
PHẦN IV 19
KẾT LUẬN 19
PHAN KHÁNH NGUYÊN Trang 1
LẬP TRÌNH SYMBOLIC
LỜI MỞ ĐẦU
Để tiếp cận vào lĩnh vực khám phá các vấn đề tri thức, trí tuệ nhân tạo… thì lập
trình Symbolic (dại biểu là maple ) không thể không được tìm hiểu. Bởi maple cung cấp
những tính năng, tool đang dạng trong các lĩnh vực tính toán, dễ dàng cài đặt và thao tác.
Cám ơn GS.TS. Nguyễn Văn Nhơn đã giúp tôi tiếp cận và tìm hiểu một ngôn ngữ
lập trình lý thú, làm tiền đề cho việc nghiên cứu, phát triển các lĩnh vực khoa học máy
tình sau này.


Xin cảm ơn!
PHAN KHÁNH NGUYÊN Trang 2
LẬP TRÌNH SYMBOLIC
PHẦN I
TỔNG QUAN
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 16. Đối thủ cạnh tranh chính của nó là Mathematica
Nó là một phần mềm toán học cao cấp, có thể giải quyết một số vấn đề của Toán học.
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 rất dễ dùng. 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ắn liền với toán học phổ thông và đại học. mỗi phiên bản đều có những cái
mới của nó và nhà sản xuất không ngừng phát triển khả năng tính toán của nó.
Các tính năng
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ụ vẽ đồ thị tĩnh và động .
Lập trình đơn giản và có khả năng tương tác với ngôn ngữ lập trình khác.
Có khả năng export ra các file dạng html, pdf.
PHAN KHÁNH NGUYÊN Trang 3
LẬP TRÌNH SYMBOLIC
PHẦN II
MỘT SỐ LỆNH THÔNG THƯỜNG
1. Lệnh solve
Dùng để giải phương trình lượng giác
>
2. Giải phương trình bậc <5

Th1:
> restart;
> solve( x^4 – 2*x^3 + 2=0, x );
> allvalues({%});
3. Lệnh tính tổng Sum
>
# cộng dồn giá trị của I với i=0,1,2,3=6
4. Tính giới hạn
>
PHAN KHÁNH NGUYÊN Trang 4
LẬP TRÌNH SYMBOLIC
5. Trục căn thức ở mẫu
>
6. Vẽ hình tròn
>
7. Lệnh vẽ đồ thị
>
PHAN KHÁNH NGUYÊN Trang 5
LẬP TRÌNH SYMBOLIC
PHAN KHÁNH NGUYÊN Trang 6
LẬP TRÌNH SYMBOLIC
8. Đồ thị hàm phần nguyên
>
9. Lệnh vẽ đồ thị
> with(GraphTheory):
> W := Matrix([[0,4,2,0,0,0],[4,0,1,5,0,0],[2,1,0,8,10,0],[0,5,8,0,0,6],[0,0,10,0,0,3],
[0,0,0,6,3,0]]);
> G1 := Graph(directed,weighted,W):
> DrawGraph(G1);
PHAN KHÁNH NGUYÊN Trang 7

LẬP TRÌNH SYMBOLIC
10. 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:
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 nội dung
và cột của ma trận kề là đỉnh của đồ thị
>
>
PHAN KHÁNH NGUYÊN Trang 8
LẬP TRÌNH SYMBOLIC
11. Cấu trúc điều kiện if:
if < điều kiện > then
…….thực hiện…….
end if
Nếu điều kiện đúng sẽ thực hiện, nếu ngược lại sẽ dừng
if < điều kiện 1 > then
…….thực hiện………
Else
…….thực hiện……
End if
12. Vòng lập for
i:=0
for i to 10 do;
thực thi 1;
thực thi 2;
thực thi 3;
end;
13. Vòng lập while

while (<điều kiện>) do;
thực thi 1
thực thi 2
end;
PHAN KHÁNH NGUYÊN Trang 9
LẬP TRÌNH SYMBOLIC
14. Dùng đệ qui với option remember
Lưu ý : Nếu không sử dụng option remember trong thủ tục này thì ta cũng sẽ gặp khó
khăn khi tính các số hạng lớn.
15. Đơn giản biểu thức
>
Kiểm tra sự tương đương của hai biểu thức logic
Equivalent(bt1,bt2, p);
>
PHAN KHÁNH NGUYÊN Trang 10
LẬP TRÌNH SYMBOLIC
PHAN KHÁNH NGUYÊN Trang 11
LẬP TRÌNH SYMBOLIC
PHẦN III
ỨNG DỤNG MAPLE VÀO BÀI TOÁN TÌM ĐƯỜNG ĐI NGẮN
NHẤT BẰNG DIJKSTRA
I. Mô tả giải thuật dijkstra
Giải thuật Dijkstra được giới thiệu vào năm 1959 cung cấp một giải thuật hiệu quả
nhất cho việc giải quyết bài toán đường đi ngắn nhất.Nó tìm đường đi ngắn nhất từ
một đỉnh s đến các đỉnh còn lại của đồ thị và chiều dài (trọng số ) tương ứng. Phương
pháp của thuật toán là xác định tuần tự đỉnh có chiều dài đến s theo thứ tự tăng dần.
Thuật toán được xây dựng trên cơ sở gán cho mỗi đỉnh các nhãn tạm thời. Nhãn tạm thời
của các đỉnh cho biết cận trên của chiều dài đường đi ngắn nhất từ s đến đỉnh đó. Nhãn
của các đỉnh sẽ biến đổi trong các bước lặp, mà ở mỗi bước lặp sẽ có một nhãn tạm thời
trở thành chính thức. Nếu nhãn của một đỉnh nào đó trở thành chính thức thì đó cũng

chính là chiều dài ngắn nhất của đường đi từ s đến đỉnh đó.
Giải thuật
Khởi tạo tập S chỉ chứa đỉnh ban đầu s;
for (mỗi đỉnh v thuộc G) {
D[v] = C(s, v); // C(s, v)=vô cùng nếu s và v không nối với nhau
}
D[s] = 0;
while ( (V-S) != Φ ) {
Chọn đỉnh u thuộc (V-S) sao cho D[u] ngắn nhất;
S = S U {u};
for ( mỗi v thuộc (V-S) ) {
if (D[u] + C(u, v) < D[v]) {
D[v] = D[u] + C(u, v);
}
}
}
II. Ví dụ minh họa:
Cho đồ thị sau:
PHAN KHÁNH NGUYÊN Trang 12
LẬP TRÌNH SYMBOLIC
Tìm đường đi ngắn nhấn từ đỉnh 1 đến các đỉnh bất kỳ trong đồ thị
Ta có kết quả sau
Bước Tập N D(2) D(3) D(4) D(5) D(6)
0 {1} (4,1) (2,1)*
(∞,1) (∞,1) (∞,1)
1->3
1 {1,3} (1+2,3)* (10,3) (12,3)
(∞,1)
3->2
2 1,3,2 (8,2)* (12,3)

(∞,1)
2->4
3 1,3,2,4 (12,3)* (14,4) 3->5
4 1,3,2,4,5 (14,4)* 4->6
5 1,3,2,4,5,6
Kết quả của đồ thị sau khi tìm đường đi ngắn nhất ta có
PHAN KHÁNH NGUYÊN Trang 13
LẬP TRÌNH SYMBOLIC
III. Áp dụng thiết kế chương trình bằng maple để giải quyết bài toán
PHAN KHÁNH NGUYÊN Trang 14
>………………………………
i := SourceNode; #diem khoi tao
dist[i] := 0; #chieu dai
pred[i] := 0; #diem khoi tao
in_S := 0; #vi tri node khoi tao
s := { };
while (in_S < NodeCount) do
#### TÌM DUONG DI NGAN NHAT#####
found_one := false;
for j to NodeCount do;
if ((dist[j] <> infinity) and (not (j in s))) then
if (not found_one) then
found_one := true;
i := j;
testval := dist[j];
elif (dist[j] < testval) then
i := j;
testval := dist[j];
end if;
end if;

end;

LẬP TRÌNH SYMBOLIC
Kiểm tra xem có tìm được điểm kế tiếp không
Proc đọc và kiểm tra danh sách input
PHAN KHÁNH NGUYÊN Trang 15
> # Neu khong tim thay diem ke tiep
if (not found_one) then
printf("Khong xac dinh diem ke tiep.\n");
return false;
end if;
# Neu tim duoc diem ke tiep thi add vao danh sach
s := s union { i };
in_S := in_S + 1;
sink := i;
# tong chieu dai bac dau tu diem khoi tao
for arc_num from FS_point[i] to
(FS_point[i+1] - 1) do;
j := FS_head[arc_num];
if (not (j in s)) then
testval := dist[i] + FS_cost[arc_num];
if (testval < dist[j]) then
dist[j] := testval;
pred[j] := i;
end if;
end if;
end;
end; # while (in_S < NodeCount)
LẬP TRÌNH SYMBOLIC
> #################DOC VA KIEM TRA DANH SACH##############

loadNetwork := proc (Network_def::list)
local n, s, src, all_done, result, first_seq,
seq_data, arc_number,
raw_tail, raw_head, raw_cost,
node_num, arc_num;
global NodeCount, ArcCount, SourceNode,
FS_point, FS_tail, FS_head, FS_cost,
FS_trace, FS_rpoint;
# initialize
n := nops(Network_def);#tong so danh sach con
if (n < 1) then
printf("Do thi rong\n");
return false;
end if;
result := true;
all_done := false;
first_seq := true;
arc_number := 0;
while (not all_done) do;
# read next sequence
if (first_seq) then
# gán danh sach dau tien cua tap danh sach vao seq_data
seq_data := Network_def[1];
# neu so phan tu trong ds khong thoa cau truc la 3 - [dinh,canh,dinh khoi tao]
if (nops(seq_data) <> 3) then
all_done := true;
elif ((seq_data[1] < 1) or (seq_data[2] < 1) or
(seq_data[3] < 1) or (seq_data[3] > seq_data[1])) then
all_done := true;
end if;

if (all_done) then
result := false;
printf("Kiem tra lai du lieu nhap: %s\n", src);

else
NodeCount := seq_data[1]; # So node cua do thi
ArcCount := seq_data[2]; # So canh cua do thi
SourceNode := seq_data[3]; # Dinh khoi tao
PHAN KHÁNH NGUYÊN Trang 16
LẬP TRÌNH SYMBOLIC
raw_tail := array(1 ArcCount);
raw_head := array(1 ArcCount);
raw_cost := array(1 ArcCount);
FS_point := array(1 NodeCount+1);
FS_tail := array(1 ArcCount);
FS_head := array(1 ArcCount);
FS_cost := array(1 ArcCount);
FS_trace := array(1 ArcCount);
FS_rpoint := array(1 NodeCount+1);
first_seq := false;
end if;
else #
if ((arc_number + 2) > n) then
all_done := true; # EOF, da duyet xong danh sach
break;
end if;
arc_number := arc_number + 1;
if (arc_number > ArcCount) then
printf("Nhieu canh xuat phat tu cap dinh, so canh %d > so cap dinh %d\n",
arc_number, ArcCount);

all_done := true;
result := false;
else
seq_data := Network_def[arc_number+1]; # add 1 because 1st is node count
if (nops(seq_data) <> 3) then
all_done := true;
#kiem tra xem so dinh, so canh va dinh khoi tao da dung chua
#seq_data[1] la so dinh
#seq_data[1] la so canh
#seq_data[1] la dinh khoi tao
elif ((seq_data[1] < 1) or (seq_data[1] > NodeCount) or
(seq_data[2] < 1) or (seq_data[2] > NodeCount) or
(seq_data[3] < 0)) then
all_done := true;
end if;
if (all_done) then
result := false;
printf("Kiem tra lai so dinh, so canh va diem khoi tao: %s\n", s);
else
raw_tail[arc_number] := seq_data[1];
raw_head[arc_number] := seq_data[2];
raw_cost[arc_number] := seq_data[3];
end if;
end if;
end if;
PHAN KHÁNH NGUYÊN Trang 17
LẬP TRÌNH SYMBOLIC
end;
# validation of data
if (result = true) then

if (arc_number <> ArcCount) then
printf("Du lieu nhap khong dung: kiem tra lai so canh cua do thi, %d <> %d\n",
arc_number, ArcCount);
result := FALSE;
end if;
end if;
# Nếu thỏa đk thì load dữ liệu
if (result = true) then
# forward-direction, arcs emanating from node i
arc_number := 0;
for node_num to NodeCount do;
FS_point[node_num] := arc_number + 1;
for arc_num to ArcCount do;
if (raw_tail[arc_num] = node_num) then
arc_number := arc_number + 1;
FS_tail[arc_number] := raw_tail[arc_num];
FS_head[arc_number] := raw_head[arc_num];
FS_cost[arc_number] := raw_cost[arc_num];
end if;
end;
end;
FS_point[NodeCount+1] := ArcCount + 1;
# Lưu các cạnh đến đỉnh i
arc_number := 0;
for node_num to NodeCount do;
FS_rpoint[node_num] := arc_number + 1;
for arc_num to ArcCount do;
if (FS_head[arc_num] = node_num) then
arc_number := arc_number + 1;
FS_trace[arc_number] := arc_num;

end if;
end;
end;
FS_rpoint[NodeCount+1] := ArcCount + 1;
end if;
# all done
return result;
end proc: # loadNetwork
PHAN KHÁNH NGUYÊN Trang 18
LẬP TRÌNH SYMBOLIC
PHẦN IV
KẾT LUẬN
Maple đã mang lại một công cụ rất hiệu quả trong dạy học, nghiên cứu khoa học
và trong nhiều lĩnh vực khác:
1. Dùng maple để soạn các hệ thống bài tập.
2. Kiểm tra các kết quả của các bài toán chứng minh.
3. Soạn giáo án, vẽ các hình, biểu đồ, phục vụ cho bài giảng và các hoạt động chuyên
môn khác
4. Nghiên cứu các hệ thống tính toán thông minh – trí tuệ nhân tạo
PHAN KHÁNH NGUYÊN Trang 19
LẬP TRÌNH SYMBOLIC
Tài liệu tham khảo
/>615346.htm
/> />PHAN KHÁNH NGUYÊN Trang 20

×