-1-
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
KHOA TOÁN TIN ỨNG DỤNG
----- -----
TIỂU LUẬN
Đề tài: BÁO CÁO THỰC THÀNH VỚI MAPLE
Giáo viên hướng dẫn: Nguyễn Hữu Điển
Sinh viên thực hiện
: 1. NGUYỄN PHƯỢNG HOÀNG
2. NGỤY ĐÌNH HẬU
Lớp: TOÁN TIN 1-K51toán 2-K51.
Hà Nội, tháng 11 năm 2009
-2-
PHẦN 1: CƠ SỞ THỰC HÀNH
I/ Giới thiệu
1. Các tính năng cơ bản của Maple
Có thể nêu vắn tắt các chức năng cơ bản của Maple như sau:
• là một hệ thống các toán trên các biểu thức đại số;
• có thể thực hiệc đượ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ị
tĩnh và động của các đường và mặt được cho bởi các hàm tùy ý
trong nhiều hệ tọa độ khác nhau;
• 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ư LaTex, 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ác trực tiếp;
• một trợ giáo hữu ích cho học sinh và sinh viên trong việc tự học
2. Hệ đại số tuyến tính và phép biến đổi ma trận
Việc giải những hệ phương trình là hết sức cần thiết trong các bài toán
thực tế. Thường khi giải ta đưa hệ về dạng ma trận AX=B và thiết lập lập ma
trận mở rộng Ã=[A:B]. Bằng các phép biến đổi về ma trận ta có thể biến đổi
ma trận à về dạng tương ứng:Crame, Gauss, Gass-Jordan,…
Việc cài đặt được những chương trình thực hiện như vậy là rất hữu
ích.Có rất nhiều cách thực hiện cài đặt với những ngôn ngữ lập trình như
pascal, C, C++, Maple, Maplab…Trong tính toán thực hành với Maple có
rất nhiều thao tác đã được cung cấp trong gói lênh linalg như : Thực hiện
khử Gause trên A với lệnh gausselim(A); Khử hàng theo dạng Gause-Jordan
ở A với câu lệnh rref(A) hoặc gausjord(A); Tìm dạng Jordan của A với câu
lệnh jordan(A)…
-3-
Tuy vậy ta hoàn toàn cũng có thể thực hiện được những thao tác như vậy
mà không cần dùng đến các câu lệnh có sẵn. Để làm quen với cách sử dụng
Maple, sau đây chúng ta thử thực hiện cái đặt thuật toán Gauss-Jordan giải
hệ đại tuyến m phương trình n ẩn.
II/ Tổng quan về Maplets Package - Gói lệnh linalg – Thủ tục – Ngôn
ngữ lập trình Maple
1.Tổng quan về Maples Package
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
1.1 Button: Cấu trúc thường dùng
- Button(opts)
- Button[refID](opts)
Trong đó : opts bao gồm: background (màu button), caption (text hiển thị
trên button) , enabled( =true hoặc false : cho phép hay không cho phép
click), font(font của caption), foreground (màu của caption), valign,
halign(vị trí của caption so với button), height, image, onclick (sự kiện khi
click chuột), reference(đặt tên, chú ý: nếu dùng khai báo 1 thì sử dụng
-4-
reference, ở khai báo 2: refID cũng chính là reference), tooltip(hiển thị dòng
chữ chú thích khi đưa chuột vào), visible, or width
Ví dụ:
-Button(“OK”,Shutdown()) : tắt maplet, không đặt tên
-Button ['out'](“Quit”,CloseWindow(‘w1′)) : button có tên ‘out’,
caption=”Quit”, chức năng là tắt cửa sổ ‘w1′
2> TextField: cấu trúc
-TextField(opts)
- TextField[refID](opts)
trong đó opts bao gồm:
background, cursor ( vị trí đặt con trỏ), editable, enabled, focus( chọn =true
nếu muốn con trỏ nằm trong TextField), font, foreground, halign, onchange,
popupmenu, reference, tooltip, value, visible, or width
Chú ý: Đối với TextField việc truy cập sửa đổi dữ liệu đều thông qua tên
(reference)
3> Evaluate: cấu trúc
- Evaluate(opts, args)
trong đó : option=value với option là một function, `option`, target, hay
waitforresult( chờ đợi kết quả thực hiện khi nhấn button)
- chức năng chính của Evaluate là thực hiện các hàm và thủ tục, có thể trả lại
giá trị cho một đối tượng khác
Ví dụ:
-Evaluate(‘textfieldresult’='int(textfieldinput,x)’) : tính tích phân của biểu
thức ở textfieldinput theo biến x và trả lại kết quả cho textfieldresult
-Evaluate((‘function’='myfunction”): thực hiện một myfunction do mình
định nghĩa
-5-
Cụ thể, ta xét các bài tập nhỏ sau:
Bài 1: Tạo giao diện như hình vẽ đê tính đạo hàm
Code:
> restart;
> with(Maplets[Elements]);
> viphan := Maplet([
["Nhap ham theo x", TextField['TF1'](‘width’ = 30)],
[
"Dao ham theo bien x :",
Button("Diff", Evaluate('TF1' = 'diff(TF1, x)')),
Button("OK", Shutdown(['TF1']))
]
]):
Maplets[Display](viphan);
Ở đây, sau khi nhập biểu thức vào TF1, click nút “Diff” và giá trị được trả
về ngay cho TF1
Bài 2: Tạo giao diện như hình vẽ đê tính nguyên hàm
-6-
Code
> restart;
> with(Maplets[Elements]);
> nguyenham := Maplet([
["Nhap ham theo x", TextField['TF1'](‘width’ = 30)],
["Ket qua
", TextField['TF2'](‘width’ = 30)],
[
"Nguyen ham theo bien x :",
Button("Integrate", Evaluate('TF2' = 'int(TF1, x)')),
Button("OK", Shutdown(['TF2']))
]
]):
Maplets[Display](nguyenham);
2. Gói lệnh linalg
Gói thủ tục này chứa đựng các hàm thực hiện trên mảng (chính là những
vector và ma trận trong Maple). Câu lệnh with(linalg) cho phép bạn gọi trực
tiếp các hàm trong gói thủ tục linalg. Ví dụ như sau khi bạn thực hiện câu
lệnh with(linalg) bạn có thể gọi hilbert thay vì linalg(hilbert).
Nạp gói thủ tục đại số tuyến tính. Khi bạn nạp bằng with, bạn sẽ thấy tất
cả các hàm trong bộ chương trình đó
>with(linalg);
Warning : new definition for norm
Warning : new definition for trace
[BlockDiagonal, GramSchmidt, JordanBlock, add, addcol, addrow, adj,
adjoint, angle, augument, backsub, band, basis, bezout, charmat,
chharpoly, col, coldim, colspace, colspan, companion, concat, cond,
copyinto, crossprod, curl, definite, delcols, delrows, det, diag, diverge,
dotprod, eigenvals, eigenvects, equal, exponential, extent, ffgausselim,
fibonacci, frobenius,gausselim, gaussjord, genmatrix, grad,
hadamard,hermite,hessian, hilbert, htranspose, ihermite,
indexfunc,innerprod,inbassis, inverse, ismith, iszero, jacobian, jordan,
kernel, laplacian, leastsqrs, linsolve, matrix, minor, minpoly, mulcol,
mulrow, multiply, norm, mullspace, orthog, rowdim, rowspace, rowspan,
rref, scalarmul, singularvals, smith, stack, submatrix, subvector,
-7-
sumbasis, swapcol, swprow, sylvester, toeplitz, trace, transpose,
vandermonde, vecpotent, vectdim, vector]
2.1 Lập ma trận từ phương trình và ngược lại
Mô tả: Hàm geneqns sinh ra một họ các phương trình từ hệ số của ma
trận. Nếu có biến thứ ba biểu thị véc tơ vế phải b thì nó sẽ được đưa vào
phương trình. Ngược lại thì vế phải được coi bằng 0.
Hàm genematrix sinh ma trận từ các hệ số của hệ phương trình tuyến
tính. Nếu có biến thứ ba"flag" thì véc tơ"vế phải" được đưa vào cột cuối
cùng của ma trận.
Thí dụ
> eqns := {x+2*y=0,3*x-5*y=0};
> A := genmatrix(eqns, [x,y]);
> geneqns(A,[x,y]);
> geneqns(A,x);
> eqns := {x+2*z=a,3*x-5*y=6-z};
> A := genmatrix(eqns, [x,y,z], flag);
> A := genmatrix(eqns, [x,y,z], 'b');
> print(b);
> geneqns(A,[x,y,z],b);
Giải phương trình đại số tuyến tính
Giải phương trình đại số tuyến tính Ax=u, trong đó ,
Nhập A
> A:=array([[3,-2,-5,1],[2,-3,1,5],[1,2,0,-4],[1,-1,-4,9]]);
Nhập u
> u:=vector([3,-3,-3,22]);
2.2 Giải phương trình Ax=u
> linsolve(A,u);
-8-
3. Thủ tục
Tạo lập thủ tục đơn giản trong Maple
Cú pháp
Sự thực hiện
<Tên thủ tục>:=proc(
Sau khi định nghĩa thủ tục chúng ta
hình thức>)
có thể gọi như các hàm của Maple:
thông số>
<Tên thủ tục>(biểu thức1, biểu thức
end;
2)
A.Định nghĩa hàm f với hai tham số x, y.
> f := proc(x, y)
>x + y;
> end;
f := proc(x, y) x + y end
B. Sử dụng hàm f để tính tổng của hai số 27 (cho x) và 46 (cho y).
> f(27, 46);
73
C.Kết quả của hàm với x = w và y = z + 1.
> f(w, z+1);
w+z+1
D. Xây dựng thủ tục tìm số lớn nhất trong ba số bất kỳ.
> max3 := proc(a, b, c)
> print(So lon nhat trong ba so , a, b, c);
> if a < b then
> if b < c then c else b fi
> elif a < c then c else a
> fi; end;
E. Sử dụng thủ tục max3.
> max3(3, 2, 1);
3
> max3(13, 24, 18);
24
4. Ngôn ngữ lập trình Maple
4.1 Câu lệnh điều kiện if - then - else – fi
Mẫu 1: Lựa chọn câu lệnh.
Cú pháp
Sự thực hiện
-9-
if <điều kiện> then
<Dãy câu lệnh 1>
else
<Dãy câu lệnh 2>
fi;
Maple xác định giá trị biểu thức <điều kiện>:
1. Nếu giá trị của <điều kiện> bằng TRUE Maple
thực hiện:
<Dãy câu lệnh 1>
Sau đó kết thúc câu lệnh điều kiện.
2. Nếu giá trị của <điều kiện> bằng FALSE Maple
thực hiện :
<Dãy câu lệnh 2>
Sau đó kết thúc câu lệnh điều kiện.
Sử dụng câu lệnh if mẫu 1
A. Gán giá trị cho hai biến a và b. Sử dụng câu lệnh if mẫu 1 để xác địnhsố
lớn nhất trong hai số a và b.
> a:= 12: b:= 37:
> if a>= b then
> print(`so lon nhat co gia tri :`, a);
> else
> print(`so lon nhat co gia tri :`, b);
> fi;
so lon nhat co gia tri :37
Mẫu 2: Một trong nhiều lựa chọn
Cú pháp
Sự thực hiện
if <điều kiện(1)> then Maple xác định giá trị của <điều kiện (i)> (i = 1..n)
<Dẫy câu lệnh 1>
elif <điều kiện (2)> then theo thứ tự lần lượt.
1. Nếu giá trị của <điều kiện (i)> bằng TRUE,
<Dẫy câu lệnh 2>
Maple thực hiện :
.
<Dãy câu lệnh i>
.
elif <điều kiện (n)> then Sau đó kết thúc câu lệnh điều kiện.
2. Nếu giá trị của <điều kiện (i)> đều FALSE
<Dẫy câu lệnh n>
Maple thực hiện :
else
<Dẫy câu lệnh mặc định>
Sau đó kết thúc câu lệnh điều kiện.
định>
fi;
Sử dụng câu lệnh if mẫu 2
Gán giá trị cho hai biến c và d. Sử dụng câu lệnh if mẫu 2 để xác định số lớn
nhất trong hai số c và d.
- 10 -
> c:= 2: d:= 137:
> if c> d then print(' c lon hon d');
> elif c = d then print('c bang d');
> else print(' c nho hon d');
> fi;
c nho hon d
4.2 Câu lệnh lặp FOR:
Dùng để xây dựng một chu trình lặp có số lần lặp xác định:
Mẫu 1:
Cú pháp
Thực hiện
for i from <giá trị đầu> by
đổi i> to <giá trị cuối>
biểu thức <Giá trị đầu>.
do
Bước 2: Maple kiểm tra điều kiện:
<Dãy dòng lệnh>
+ i <= <giá trị cuối> trường hợp
od;
i> >= 0
+ i >= <giá trị cuối>trường hợp
i> <= 0
Bước 3:- Nếu điều kiện trên là sai thì
Maple ra khỏi chu trình
- Nếu điều kiện trên là đúng thì:
a. Thực hiện <Dẫy dòng lệnh>.
b. Biến điều kiện i nhận giá trị mới:
i := i + <thay đổi i>
c. Trở lại bước 2.
Sử dụng for và if mẫu 2 để khởi tạo một ma trận.
A. Khai báo một ma trận.Thiết lập giá trị cho các phần tử ma trận A.
> A := array(1..4, 1..4):
> for i to 4 do
> for j to 4 do
> if i > j then A[i, j] := j
>elif i < j then A[i, j] := i
>else A[i, j] := 1
>fi
> od;
> od:
> print (A); Kết quả đưa ra màn hình.
- 11 -
[1 1 1 1]
[1 1 2 2]
[1 2 1 3]
[1 2 3 1]
B. Sử dụng for tính đồng thời các tổng , và .
> for i from 2 by 2 to 6 do
> printf(“Tong j^%d, j = 1..n la:”,i);
> print(expand(sum(j^i,j = 1..n)));
> od;
Tong j**2 j=1..n la:
1/3 n3+1/2 n2+1/6 n
Tong j**4 j = 1..n la :
1/5 n5+1/2 n4+1/3 n3-1/30 n
Tong j**6 j = 1..n la :
1/42 n-1/6 n3+1/2 n5+1/2 n6 + 1/7 n7
Trong mẫu 2 của câu lệnh FOR có sử dụng hai hàm rất quan trọng:
+ op(i, <biểu thức toán học>) cho thành phần thứ i giữa các thành phần toán
tử. Ví dụ; op(1,2*x*y) là 2. Còn op(2,2*x*y) là x.
+ nops(<biểu thức toán học>) số lượng các thành phần giữa các toán tử
trong <biểu thức toán học>. Ví dụ: nops(2*x*y) là 3, nops([3,4]) là 2.
Mẫu 2 của For : Sử dụng giá trị của biến đếm vào biểu thức
Cú pháp
for i to nops(<biểu thức>)
do
câu lệnh có (i,<biểu thức>)
od;
Sự thực hiên
Bước 1: Biến điều khiển i nhận giá trị đầu
trong <biểu thức>qua hàm nops().
Bước 2: Maple thực hiện câu lệnh có (i,
<biểu thức>)
Bước 3: Kiểm tra điều kiện biến i:
a. Nếu i là phần tử cuối cùng của
thức> thì Maple ra khỏi chu trình.
b. Nếu điều kiện trên sai, i nhận giá trị mới,
là giá trị tiếp theo trong <biểu thức>.
c. Trở lại bước 2.
- 12 -
Sử dụng for mẫu 2.
Ví dụ này sử dụng câu lệnh for dạng 2 để tính tổng bình phương các số chẵn
trong danh sách aList.
> aList := [1,2,3,4,5];
> s := 0;
> for i to nops (aList) do
> if irem(op(i, aList), 2) = 0 then
> s := s + op(i, aList)^2
>fi
> od:
> s;
20
Mẫu 3- For: Lặp lại lệnh theo giá trị của một biến trong biểu thức
Cú pháp
Sự thực hiện
for x in <biểu thức> do
Lặp lại theo dẫy giá trị x lấy trong
<Câu lệnh dùng x>
<biểu thức>
od;
Sử dụng for mẫu 3.
Ví dụ này sử dụng câu lệnh for mẫu 3 để tính tổng bình phương các số lẻ
trong danh sách aList.
> aList := [1,2,3,4,5]: s := 0:
> for n in aList do
> if irem(n, 2) = 1 then
> s := s + n^2
> fi
> od:
> s;
35
PHẦN 2: CƠ SỞ LÝ THUYẾT CỦA THUẬT TOÁN VÀ CÀI
ĐẶT
I/ Cơ sở lý thuyết của phương pháp Gauss-Jordan
- 13 -
Nôi dung phương pháp là loại trừ ẩn,song loại trừ ẩn nảo trước là tùy thuộc
cách chọn phần tử trội của hệ số aij. Quá trình thực hiện được mô tả như sau:
Bước 1: xét ma trận mở rộng A(0)=[A:B]
Ta nói phần apq là phần tử trội của ma trận A nếu │apq│= max│aij│ ;
1≤i,j≤n và khi đó apq được gọi là hàng giải,cột q gọi là cột giải.
Để loại trừ ẩn xq khỏi các phương trình thứ i ≠ p ta biến đổi :
Đặt mi= aiq/apq; (i=1..n,i≠p). Lấy hàng p nhân tất cả với mi rồi lần lượt
lấy hàng i=1,2... tương ứng trừ đi nó (trừ đi hàng p) ta được: A(1)
Đặt
aij(1)= aij – apj×mi=aij- apj ×aiq/apq ( )٭trong đó i,j=1..n+1;
i≠p; j≠q.
Khi i=p thì apj(1)=apj j=1..n+1
Khi j=q thì từ ( )٭ta có aiq(1)=0 (i≠p)
Tóm lại: qua bước này ta thu được ma trận A(1) có các phần tử là aij(1)
được tính như sau:
Các phần tử thuộc hàng giải thứ p thì apj(1)=apj, j=1..n+1 được giữ
nguyên
Các phần tử thuộc cột giải thứ q thì đều “=0” trừ phần tử giải apq.
Các phần tử khác (kể cả cột thứ n+1) đều tính theo công thức:
aij(1)= aij – apj×mi=aij- apj ×aiq/apq (1) i≠p; j≠q.
Bước 2: lặp lại quá trình như bước 1 đối với ma trận A(1) để có A(2). Trong
ma trận (7) ta chọn phần tử giải là phần tử ars(1) với điều kiện r≠p, s≠q. Các
phần tử của ma trận A(2) tính theo công thức (1); và cứ thế tiếp tục, sau n
bước ta thu được ma trận A(n) mà mỗi hàng chỉ gồm 1 phần tử ứng với ẩn
xk và cột vế phải. Từ đó ta suy ra nghiệm của hệ.
- Trong công thức (1) có phép cho phần tử apq, phần tử đó không nhất
thiết phải là phần tử trội mà trong ma trận hệ số A có phần tử là số “1”
thì nên chọn nó là phần tử giải sẽ tránh được phép chia (hoặc chọn là số
nguyên nào đó)
- Phương pháp trên áp dụng được đối với hệ phương trình m ≠n, và vô
đinh hay vô nghiệm
Thí dụ Giải hệ phương trình sau:
- 14 -
A(0)
Ã(1)
A(1)
Ã(2)
A(2)
Ã(3)
[1]
1
0
2
1
-2
1
-3
-3
0
1
2
2
-1
3
0
6
-6
16
6
1
0
0
0
1
-3
1
-5
-3
3
1
8
2
-3
3
-4
6
-12
16
-6
1
0
0
0
1
[1]
1
-5
-3
-1
1
8
2
1
3
-4
6
4
16
-6
1
0
0
0
0
1
0
0
-2
-1
2
3
1
1
2
1
2
4
12
14
1
0
0
0
0
1
0
0
-2
-1
[1]
3
1
1
1
1
2
4
6
14
1
0
0
0
1
0
0
1
0
0
0
1
0
0
1
0
0
0
3
2
1
-2
3
2
14
10
6
-4
14
10
- 15 -
A(3)
A(4)
0
0
0
0
1
0
1
[1]
6
2
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
8
6
4
2
Từ A(4) => x1=8; x2=6; x3 =4; x4=2 là nghiệm của hệ đã cho.
II/ Cài đặt thuật toán
1. Ý tưởng
Từ thuật toán lý thuyết để dễ dàng cài đặt ta thực hiên như sau. Rõ ràng
nếu trong ma trận hệ số A nếu có phần tử là “1” thì nên chọn nó làm phần tử
giải thì sẽ đơn giản hơn. Vậy thay vì tìm phần tử trội của ma trận A ta tìm
phần tử trội theo hàng.
- Nếu trong hang có phần tử “1” thì ta chọn nó làm phần tử giải
- Nếu trong hàng chưa có phần tử 1 thì ta chọn phần tử trội của hàng. Sau đó
làm xuất hiện phần tử “1” bằng cách chia tất cả các phần tử của hàng đó cho
phần tử trội. Như vậy đã làm xuất hiện phần tử “1” đồng thời với cách xác
định như trên ta cũng tránh được sai số lơn khi chia một số rất nhỏ.
2. Cấu trúc giải thuật
# tìm phần tử giải
for i=1 to m do
begin
indexmax :=1;
for j to n do
begin
if aij =1 then indexmax:=j;
else
if abs(aij)> abs(ai,indexmax) then indexmax:=j;
end
t:=ai,indexmax;
for j=1 to n+1 do aij:= aij/t;
end;
- 16 -
# đưa về dạng Gauss-Jordan
for k=1 to m do
if k≠ i then t:=ai,indexmax;
for p=1 to n+1 do akp:=akp-aip*t;
3.Chương trình chạy
- 17 -
• Lưu ý khi sử dụng chương trình: nếu khi cho chạy lần đầu chương
trình không tính được thì nhấn thoát sau đó gõ lại để tính
4.Một số ví dụ
Ví dụ 1: Lấy lại phương trình ở trên
- 18 -
Ví dụ 2: Giải hệ phương trình
- 19 -
TÀI LIỆU THAM KHẢO:
1.HƯỚNG DẪN SỬ DỤNG MAPLE V CỦA NGUYỄN HỮU ĐIỂN
2. GIÁO TRÌNH GIẢI TÍCH SỐ CỦA LÊ TRỌNG VINH
3.