Báo cáo thực hành với maple
-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 : NGUYỄN PHƯỢNG HOÀNG 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 Các tính Maple Có thể nêu vắn tắt chức Maple sau: • hệ thống toán biểu thức đại số; • thực hiệc hầu hết phép toán chương trình toán đại học sau đại học; • cung cấp công cụ minh họa hình học thuận tiện gồm: vẽ đồ thị tĩnh động đường mặt cho hàm tùy ý nhiều hệ tọa độ khác nhau; • ngôn ngữ lập trình đơn giản mạnh mẽ, có khả tương tác với ngôn ngữ lập trình khác; • cho phép trích xuất định dạng khác LaTex, Word, HTML, • Một công cụ biên soạn giáo án giảng điện tử, thích hợp với lớp học tương tác trực tiếp; • trợ giáo hữu ích cho học sinh sinh viên việc tự học Hệ đại số tuyến tính phép biến đổi ma trận Việc giải hệ phương trình cần thiết toán thực tế Thường giải ta đưa hệ dạng ma trận AX=B thiết lập lập ma trận mở rộng Ã=[A:B] Bằng phép biến đổi ma trận ta biến đổi ma trận à dạng tương ứng:Crame, Gauss, Gass-Jordan,… Việc cài đặt chương trình hữu ích.Có nhiều cách thực cài đặt với ngôn ngữ lập trình pascal, C, C++, Maple, Maplab…Trong tính toán thực hành với Maple có nhiều thao tác cung cấp gói lênh linalg : Thực khử Gause A với lệnh gausselim(A); Khử hàng theo dạng Gause-Jordan A với câu lệnh rref(A) gausjord(A); Tìm dạng Jordan A với câu lệnh jordan(A)… -3- Tuy ta hoàn toàn thực thao tác mà không cần dùng đến câu lệnh có sẵn Để làm quen với cách sử dụng Maple, sau thử thực đặt thuật toán Gauss-Jordan giải hệ đại tuyến m phương trình n ẩn II/ Tổng quan Maplets Package - Gói lệnh linalg – Thủ tục – Ngôn ngữ lập trình Maple 1.Tổng quan Maples Package Cấu trúc maplet >with(Maplets[]): # khai báo subpakage MyMaplet:=Maplet( [ [], [], … [] ]): #Ứng dụng có tên MyMaplet bao gồm tập hợp > #các lệnh (tổ hợp lệnh) ,,…, gói subpagake khai báo >Maplets[Display](MyMaplet); # Chạy chương trình có tên MyMaplet có nội dung 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ị button) , enabled( =true false : cho phép hay không cho phép click), font(font caption), foreground (màu caption), valign, halign(vị trí caption so với button), height, image, onclick (sự kiện click chuột), reference(đặt tên, ý: dùng khai báo sử dụng -4- reference, khai báo 2: refID reference), tooltip(hiển thị dòng chữ thích đư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 tắt cửa sổ ‘w1′ 2> TextField: cấu trúc -TextField(opts) - TextField[refID](opts) opts bao gồm: background, cursor ( vị trí đặt trỏ), editable, enabled, focus( chọn =true muốn trỏ nằm 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 liệu thông qua tên (reference) 3> Evaluate: cấu trúc - Evaluate(opts, args) : option=value với option function, `option`, target, hay waitforresult( chờ đợi kết thực nhấn button) - chức Evaluate thực hàm thủ tục, trả lại giá trị cho đối tượng khác Ví dụ: -Evaluate(‘textfieldresult’='int(textfieldinput,x)’) : tính tích phân biểu thức textfieldinput theo biến x trả lại kết cho textfieldresult -Evaluate((‘function’='myfunction”): thực myfunction định nghĩa -5- Cụ thể, ta xét tập nhỏ sau: Bài 1: Tạo giao diện 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 nhập biểu thức vào TF1, click nút “Diff” giá trị trả cho TF1 Bài 2: Tạo giao diện 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); Gói lệnh linalg Gói thủ tục chứa đựng hàm thực mảng (chính vector ma trận Maple) Câu lệnh with(linalg) cho phép bạn gọi trực tiếp hàm gói thủ tục linalg Ví dụ sau bạn thực câu lệnh with(linalg) bạn gọi hilbert thay linalg(hilbert) Nạp gói thủ tục đại số tuyến tính Khi bạn nạp with, bạn thấy tất hàm 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 ngược lại Mô tả: Hàm geneqns sinh họ phương trình từ hệ số ma trận Nếu có biến thứ ba biểu thị véc tơ vế phải b đưa vào phương trình Ngược lại vế phải coi Hàm genematrix sinh ma trận từ hệ số hệ phương trình tuyến tính Nếu có biến thứ ba"flag" véc tơ"vế phải" đưa vào cột cuối 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, , 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- Thủ tục Tạo lập thủ tục đơn giản Maple Cú pháp Sự thực :=proc() (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 hai số 27 (cho x) 46 (cho y) > f(27, 46); 73 C.Kết hàm với x = w y = z + > f(w, z+1); w+z+1 D Xây dựng thủ tục tìm số lớn ba số > max3 := proc(a, b, c) > print(So lon nhat 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); > max3(13, 24, 18); 24 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 -9- if then else fi; Maple xác định giá trị biểu thức : Nếu giá trị TRUE Maple thực hiện: Sau kết thúc câu lệnh điều kiện Nếu giá trị FALSE Maple thực : Sau kết thúc câu lệnh điều kiện Sử dụng câu lệnh if mẫu A Gán giá trị cho hai biến a b Sử dụng câu lệnh if mẫu để xác địnhsố lớn hai số a 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 nhiều lựa chọn Cú pháp Sự thực if then Maple xác định giá trị (i = n) elif then theo thứ tự Nếu giá trị TRUE, Maple thực : elif then Sau kết thúc câu lệnh điều kiện Nếu giá trị FALSE Maple thực : else fi; Sử dụng câu lệnh if mẫu Gán giá trị cho hai biến c d Sử dụng câu lệnh if mẫu để xác định số lớn hai số c 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 chu trình lặp có số lần lặp xác định: Mẫu 1: Cú pháp Thực for i from by to biểu thức Bước 2: Maple kiểm tra điều kiện: + i = + i >= trường hợp A := array(1 4, 4): > for i to > for j to > if i > j then A[i, j] := j >elif i < j then A[i, j] := i >else A[i, j] := >fi > od; > od: > print (A); Kết đưa hình - 11 - [1 1 1] [1 2] [1 3] [1 1] B Sử dụng for tính đồng thời tổng , > for i from by to > printf(“Tong j^%d, j = n la:”,i); > print(expand(sum(j^i,j = n))); > od; Tong j**2 j=1 n la: 1/3 n3+1/2 n2+1/6 n Tong j**4 j = n la : 1/5 n5+1/2 n4+1/3 n3-1/30 n Tong j**6 j = n la : 1/42 n-1/6 n3+1/2 n5+1/2 n6 + 1/7 n7 Trong mẫu câu lệnh FOR có sử dụng hai hàm quan trọng: + op(i, ) cho thành phần thứ i thành phần toán tử Ví dụ; op(1,2*x*y) Còn op(2,2*x*y) x + nops() số lượng thành phần toán tử Ví dụ: nops(2*x*y) 3, nops([3,4]) Mẫu For : Sử dụng giá trị biến đếm vào biểu thức Cú pháp for i to nops() câu lệnh có (i,) od; Sự thực hiên Bước 1: Biến điều khiển i nhận giá trị đầu qua hàm nops() Bước 2: Maple thực câu lệnh có (i, ) Bước 3: Kiểm tra điều kiện biến i: a Nếu i phần tử cuối Maple khỏi chu trình b Nếu điều kiện sai, i nhận giá trị mới, giá trị c Trở lại bước - 12 - Sử dụng for mẫu Ví dụ sử dụng câu lệnh for dạng để tính tổng bình phương số chẵn danh sách aList > aList := [1,2,3,4,5]; > s := 0; > for i to nops (aList) > if irem(op(i, aList), 2) = then > s := s + op(i, aList)^2 >fi > od: > s; 20 Mẫu 3- For: Lặp lại lệnh theo giá trị biến biểu thức Cú pháp Sự thực for x in Lặp lại theo dẫy giá trị x lấy od; Sử dụng for mẫu Ví dụ sử dụng câu lệnh for mẫu để tính tổng bình phương số lẻ danh sách aList > aList := [1,2,3,4,5]: s := 0: > for n in aList > if irem(n, 2) = 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 phương pháp Gauss-Jordan - 13 - Nôi dung phương pháp loại trừ ẩn,song loại trừ ẩn nảo trước tùy thuộc cách chọn phần tử trội hệ số aij Quá trình thực mô tả sau: Bước 1: xét ma trận mở rộng A(0)=[A:B] Ta nói phần apq phần tử trội ma trận A │apq│= max│aij│ ; 1≤i,j≤n apq gọi hàng giải,cột q gọi cột giải Để loại trừ ẩn xq khỏi 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 với mi lấy hàng i=1,2 tương ứng trừ (trừ 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 apj(1)=apj j=1 n+1 Khi j=q từ ( )٭ta có aiq(1)=0 (i≠p) Tóm lại: qua bước ta thu ma trận A(1) có phần tử aij(1) tính sau: Các phần tử thuộc hàng giải thứ p apj(1)=apj, j=1 n+1 giữ nguyên Các phần tử thuộc cột giải thứ q “=0” trừ phần tử giải apq Các phần tử khác (kể cột thứ n+1) 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 trình bước ma trận A(1) để có A(2) Trong ma trận (7) ta chọn phần tử giải phần tử ars(1) với điều kiện r≠p, s≠q Các phần tử ma trận A(2) tính theo công thức (1); tiếp tục, sau n bước ta thu ma trận A(n) mà hàng gồm phần tử ứng với ẩn xk cột vế phải Từ ta suy nghiệm hệ - Trong công thức (1) có phép cho phần tử apq, phần tử không thiết phải phần tử trội mà ma trận hệ số A có phần tử số “1” nên chọn phần tử giải tránh phép chia (hoặc chọn số nguyên đó) - Phương pháp áp dụng hệ phương trình m ≠n, 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] -2 -3 -3 2 -1 -6 16 0 -3 -5 -3 -3 -4 -12 16 -6 0 [1] -5 -3 -1 -4 16 -6 0 0 0 -2 -1 1 2 12 14 0 0 0 -2 -1 [1] 1 1 14 0 0 0 0 0 -2 14 10 -4 14 10 - 15 - A(3) A(4) 0 0 1 [1] 0 0 0 0 0 0 Từ A(4) => x1=8; x2=6; x3 =4; x4=2 nghiệm hệ cho II/ Cài đặt thuật toán Ý tưởng Từ thuật toán lý thuyết để dễ dàng cài đặt ta thực hiên sau Rõ ràng ma trận hệ số A có phần tử “1” nên chọn làm phần tử giải đơn giản Vậy thay tìm phần tử trội ma trận A ta tìm phần tử trội theo hàng - Nếu hang có phần tử “1” ta chọn làm phần tử giải - Nếu hàng chưa có phần tử ta chọn phần tử trội hàng Sau làm xuất phần tử “1” cách chia tất phần tử hàng cho phần tử trội Như làm xuất phần tử “1” đồng thời với cách xác định ta tránh sai số lơn chia số nhỏ Cấu trúc giải thuật # tìm phần tử giải for i=1 to m begin indexmax :=1; for j to n 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 aij:= aij/t; end; - 16 - # đưa dạng Gauss-Jordan for k=1 to m if k≠ i then t:=ai,indexmax; for p=1 to n+1 akp:=akp-aip*t; 3.Chương trình chạy - 17 - • Lưu ý sử dụng chương trình: cho chạy lần đầu chương trình không tính 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 - 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 GIÁO TRÌNH GIẢI TÍCH SỐ CỦA LÊ TRỌNG VINH http://maplevn2008.wordpress.com [...]... 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() số lượng các thành phần giữa các toán tử trong 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() do câu lệnh có (i,) od; Sự thực hiên Bước 1: Biến... thức>) do câu lệnh có (i,) od; Sự thực hiên Bước 1: Biến điều khiển i nhận giá trị đầu trong qua hàm nops() Bước 2: Maple thực hiện câu lệnh có (i, ) 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ì 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 c Trở lại bước 2 - 12 - Sử... 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)... 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... 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 http://maplevn2008.wordpress.com ... 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... 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 -... 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;... [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 do Lặp lại theo dẫy giá trị x lấy trong 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