ỨNG DỤNG GIẢI PHƯƠNG TRÌNH VÀ BẤT PHƯƠNG TRÌNH TRONG MAPLE

19 1.1K 4
ỨNG DỤNG GIẢI PHƯƠNG TRÌNH VÀ BẤT PHƯƠNG TRÌNH TRONG MAPLE

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Đại Học Quốc Gia TP.HCM Trường Đại Học Công Nghệ Thông Tin BÁO CÁO CHUYÊN ĐỀ: LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO ĐỀ TÀI: ỨNG DỤNG GIẢI PHƯƠNG TRÌNH VÀ BẤT PHƯƠNG TRÌNH TRONG MAPLE GVHD: PGS.TS. ĐỖ VĂN NHƠN Người thực hiện: Nguyễn Siêu Đẳng MSSV: CH1101008 Lớp: Cao học khóa 6 TP.HCM – 2013 Báo cáo TH: Lập trình Symbolic cho TTNT GVHD: PGS.TS. Đỗ Văn Nhơn MỤC LỤC HVTH: Nguyễn Siêu Đẳng Trang 2 Báo cáo TH: Lập trình Symbolic cho TTNT GVHD: PGS.TS. Đỗ Văn Nhơn LỜI NÓI ĐẦU  Maple là phần mềm của hãng Waterloo, là một công cụ tuyệt vời hỗ trợ cho việc học tập và nghiên cứu tóan học. Với Maple chúng ta có thể thực hiện giải được các bài toán từ những phép tóan đơn giản nhất, sơ cấp nhất cho đến những tính toán phức tạp nhất. Không chỉ dừng lại ở việc hỗ trợ tính tóan, Maple từ phiên bản 10.0 trở về sau này còn có khả năng lập trình. Ở phương diện này, có thể xem Maple như là một ngôn ngữ lập trình trong đó chúng ta có thể tạo ra những chương trình và những gói (package) để tái sử dụng. Một tính năng rất hay và cũng rất nổi bật là Maple có thể hợp tác với một ngôn ngữ chủ (host language) như VB6.0, VB.Net, Java Khả năng đặc biệt này của Maple giúp chúng ta thực hiện được những phần mềm (tính toán, hỗ trợ giải toán ) đuợc viết mã bằng ngôn ngữ chủ và liên kết với Maple để thực hiện các tác vụ toán học phức tạp mà đòi hỏi rất nhiều kĩ năng lập trình. Bài thu hoạch này không đi quá sâu vì không có nhiều thời gian để hoàn thiện cũng như giới hạn của sự thấu hiểu của học viên thực hiện nên chủ yếu giới thiệu về các ứng dụng cơ bản của Maple trong giải toán và lập ứng dụng giải phương trình, bất phương trình, mặt hạn chế chưa chú trọng nghiên cứu ứng dụng Maple để giải các bài toán về hình học hay lập trình kết nối với các ngôn ngữ lập trình chủ khác như C#. Tuy nhiên, với thời lượng lên lớp hạn chế nhưng thầy Đỗ Văn Nhơn đã tận tình truyền tải một khối lượng lớn kiến thức, chia sẻ và định hướng phát triển hướng nghiên cứu cũng như những ứng dụng của biểu diễn tri thức và xử lý tri thức vào các bài toán trong thực tiễn. Cảm ơn thầy đã tận tình giảng dạy và hướng dẫn hoàn tất bài thu hoạch này. Chúc thầy được nhiều sức khoẻ. Trân trọng. Học viên thực hiện Nguyễn Siêu Đẳng. HVTH: Nguyễn Siêu Đẳng Trang 3 Báo cáo TH: Lập trình Symbolic cho TTNT GVHD: PGS.TS. Đỗ Văn Nhơn PHẦN I: SỬ DỤNG CÁC LỆNH TRỰC TIẾP VỚI MAPLE Báo cáo tiểu luận này giới thiệu ứng dụng Maple trong chế độ tương tác trực tiếp giữa người sử dụng và Maple. Cuộc đối thoại giữa người sử dụng với Maple thông qua lệnh gõ từ bàn phím vào dấu nhắc >_ và kết thúc lệnh bằng dấu ; cuối cùng nhấn phím [Enter]. Maple sẽ thực hiện lệnh và trả lời ngay trên dòng tiếp theo. Sau đó Maple cho hiện dấu nhắc >_ để chờ lệnh mới. Dưới đây xin giới thiệu cơ bản về ứng dụng của Maple: 1.1 Thực hiện phép toán số học trong Maple Trước hết, ta có thể sử dụng Maple để làm các phép tính số học thông thường (cộng, trừ, nhân, chia ) đối với các số nguyên, phân số, đa thức hoặc các hàm hữu tỷ, kiểu dữ liệu trong biểu thức ta muốn tính toán. Ta chỉ việc đánh lệnh tính toán dưới dạng một biểu thức toán học . Ví dụ 1.1.1 Gõ biểu thức, đánh dấu ; ở cuối biểu thức và ấn phím Enter > 32 + 12; 44 Ví dụ 1.1.2: Tính toán một vài biểu thức toán học đơn giản. A. Sử dụng kết quả của phép tính trước đó. Chú ý dấu " trong biểu thức > 2 + abs(-2); 4 > (4 + ("+ 6) / 999999-32516); 28/967483 B. Nhập một biểu thức kéo dài nhiều dòng. Chúng ta sử dụng dấu : để tránh việc in ra số quá lớn. >2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20*21*22**23*24: C. Chúng ta lại sử dụng nó trong việc tính toán tiếp theo dùng dấu ". > " - 24!; 0 1.2 Biến số Chúng ta có thể gán kết quả đã tính toán vào một ký hiệu để sử dụng lại chúng sau này, như S := (i^3, I=1 100); đó chính là việc ấn định giá trị này cho một biến số S HVTH: Nguyễn Siêu Đẳng Trang 4 Báo cáo TH: Lập trình Symbolic cho TTNT GVHD: PGS.TS. Đỗ Văn Nhơn của Maple. Nhưng không giống như các ngôn ngữ lập trình khác Maple có thể sử dụng những biến này theo nghĩa ẩn số của toán học. Lệnh gán giá trị vào biến <Tên biến> := <Biểu thức>; Chúng ta dùng ký hiệu < > viết nghiêng là trong công thức có thể thay đổi được trong lệnh đối với Maple. Biến trong Maple thông thường được bắt đầu bằng một chữ cái, có thể dài tới 498 ký tự gồm chữ cái, chữ số hoặc dấu ngạch dưới. Tất nhiên không nên tạo ra các biến có độ dài tối đa, chúng ta nên được tạo lập sao cho thuận lợi để gõ vào và dễ nhớ. Những tên biến của Maple có thể được tạo lập bởi một dãy các ký tự nằm trong dấu nháy đơn. Những tên trong dấu nháy đơn có thể bao gồm bất kỳ ký tự bàn phím nào (kể cả dấu trắng). Sau đây là một vài ví dụ về tên biến trong Maple : expr1 x T Formula_47 d2DYDX 'a funny name?' 'The answer is=' 'SessionLog.m' Nhưng '1' khác 1. Ký tự số không là tên biến và nó không thể gán giá trị được. Đừng nhầm bao quanh dẫy ký tự bằng dấu nháy kép ", Maple không sử dụng đấu này vào mục đích này, vì trước đây ta thấy nó đã sử dụng vào việc chứa các kết quả vừa tính để ta sử dụng lại.Việc gán các biến không chứa giá trị nào ta phải luôn thực hiện lại lệnh > restart;. Ví dụ 1.2.1 Gán giá trị. A. Biến Tong là nhãn của công thức cộng hai biến bien1và bien2 > Tong := bien1 + bien2; Tong := bien1 + bien2 B. Chúng ta thiết lập giá trị cho hai biến bien1, bien2 >bien1:=3000;bien2:= 26400; bien1 :=3000 bien2 := 26400 C. Giá trị của Tong bây giờ là tổng giá trị của bien1 và bien2 > Tong := bien1 + bien2; 29400 D. Nếu chúng ta thay đổi giá trị của một trong hai biến bien1 hoặc bien2 > bien1 := 3500; HVTH: Nguyễn Siêu Đẳng Trang 5 Báo cáo TH: Lập trình Symbolic cho TTNT GVHD: PGS.TS. Đỗ Văn Nhơn bien1 := 3500 E. Giá trị của Tong cũng sẽ thay đổi theo. > Tong := bien1 + bien2; 29900 F. Tạo ra một tên biến chứa cả dấu trắng >'Total energy':= tong * 40; Total energy:=1196000 Maple có một số biến toàn cục cài sẵn để điều khiển các phép toán và kết quả tính toán như order, digit, chúng ta có thể thay đổi mặc định các biến này và sẽ kiểm nghiệm các biến này ở phần sau. 1.3 Các hằng số toán học của Maple Maple xây dựng sẵn một vài hằng toán học chuẩn ( ví dụ e, , ), ta chỉ việc dùng thông qua tên của hằng số. 1.4 Các hàm toán học của Maple Maple có sẵn các hàm toán học chuẩn, chúng ta chỉ việc sử dụng khi ta có biến đối số. Ví dụ 1.4.1 A. Tự động giảm ước biểu thức 2|sin(-/2)| > 2*abs(sin(-Pi/2)); 2 B. Tính Γ(7) - 6! > GAMMA(7) - 6!; 0 C. Tính i 2 e 2 π√−1 > I^2*exp(2*Pi*sqrt(-1)); -1 D. Tính e 2lnx > exp(2*ln(x)); HVTH: Nguyễn Siêu Đẳng Trang 6 Báo cáo TH: Lập trình Symbolic cho TTNT GVHD: PGS.TS. Đỗ Văn Nhơn x 2 Trong ví dụ trên ta thấy rằng x chưa có giá trị. Maple coi đó là một ký hiệu toán học. Những câu lệnh trong Maple được mở rộng để thực hiện việc ước lượng hoặc xấp xỉ số, phép tính đạo hàm, phép lấy vi phân, tích phân, giải các phương trình và tìm giới hạn của các biểu thức toán học. Chúng ta chỉ cần đánh các câu lệnh đó vào Maple để thực hiện yêu cầu của mình như : diff để tính đạo hàm, solve để giải các phương trình , Thực ra đây là các hàm thủ tục trong Maple, nó bao gồm các thuật toán giúp ta giải toán. Ví dụ 1.4.2 Maple tính toán cùng với các ẩn số toán học A. Những biểu thức của Maple có thể chứa các ẩn số cũng như các số, và có thể được gán cho một nhãn. Maple tự động đơn giản biểu thức bằng phép ước lượng biểu thức đó. > expr1 :=(x+y+ x+ x*x*x + x)/2; expr1 :=3/2 x +1/2 y +1/2 x 3 > expr2 := ((4*expr1) - 2*y)/x; expr2 :=(6x+2x^3)/x B. Biểu thức ký hiệu có thể chứa bất kỳ một hàm nào của Maple . >bigexpr:=sin(expr1)/ln(expr2^2); sin(3/2 x+1/2 y+1/2x^3) / ln((6x+2x^3)^2/x^2) 1.5 Dấu ngoặc đơn và độ ưu tiên các phép toán Khi nhập một biểt thức như >5 + 4 * 6; vào trong Maple. Chúng ta hiểu là 5 + 24 (thực hiện phép nhân trước) hoặc 9*6 (thực hiện phép cộng trước). Maple đưa ra quy định áp dụng trong biểu thức ưu tiên các phép toán như chúng ta đã được học trong số học. Ví dụ trên kết quả là 29 chứ không phải 54 điều đó có nghĩa là Maple thực hiện phép nhân trước phép cộng. Những người sử dụng cho rằng dấu ngoặc đơn là không cần thiết đôi khi sẽ gặp phải những vấn đề rắc rối bởi Maple không thực hiện được công việc như mong muốn của họ. Những toán tử luỹ thừa của Maple thường đòi hỏi dấu ngoặc đơn để đảm bảo việc thực hiện công việc chính xác. a (b^c) và (a b )^c nên được viết tách riêng ra như sau a^(b^c) và (a^b)^c. Viết a^b^c không phù hợp với cú pháp trong ngôn ngữ Maple. Ví dụ 1.5.1: Những vấn đề phát sinh khi không sử dụng dấu ngoặc. HVTH: Nguyễn Siêu Đẳng Trang 7 Báo cáo TH: Lập trình Symbolic cho TTNT GVHD: PGS.TS. Đỗ Văn Nhơn A. Chúng ta muốn thực hiện (-5)^2 và nhập vào dòng lệnh dưới dạng-5^2;, nhưng Maple sẽ phủ nhận điều đó và thực hiện câu lệnh này theo dạng : -(5^2) và đưa ra kết quả bằng -25. > -5^2; -25 B. Chúng ta phải thiết lập dấu ngoặc đơn để biểu thức đúng với quy định của Maple > -5*-5; Syntaxerror, `-` unexpected >-5*(-2); 10 C. Chúng ta phải thiết lập dấu ngoặc đơn cho biểu thức mũ. > 2 ^ 3 ^ 4; Syntax error, `^` unexpected > 2 ^ (3 ^ 4); 2417851639229258349412352 1.6 Những thành phần của biểu thức. Thông qua phép tính và thành phần số hạng của biểu thức bằng cách gõ trực tiếp vào Maple, chúng ta có thể tính toán được ý đồ của ta. Chúng ta xem xét xem Maple quan niệm Biểu thức như thế nào. Mỗi biểu thức của Maple có thể được định dạng như một hoặc nhiều loại. ví dụ x+y+z là loại cộng (+). còn 2*3*x là loại nhân (*). Mỗi biểu thức của Maple được giữ trong cấu trúc giữ liệu. Nếu cấu trúc dữ liệu bao gồm một số thành phần thông tin , thì cấu trúc có nhiều phần. Những phần của cấu trúc trải dài theo thứ tự tuyến tính. Nghĩa là có phần thứ nhất, phần thứ hai , Nhưng mỗi phần có cùng cấu trúc loại hoàn chỉnh. Ví dụ x+y+z biểu diễn một cấu trúc dữ liệu. Cấu trúc này có thể chia làm ba phần, mỗi phần chứa thông tin về thành phần của tổng đó là x,y và z. Biểu thức 2*(x+y)*z cũng có cấu trúc gồm ba phần , nhưng phần hai lại có cấu trúc tổng mà trong nó lại có hai phần. Maple có một số hàm cho phép ta nhận thông tin về phần và loại của biểu thức. op(i,<biểu thức>) đưa ra phần thứ i của <biểu thức>. Ví dụ op(1,2*x*y) là 2. nops(<biểu thức>) đưa ra số số hạng của biểu thức. Ví dụ nops(2*x*y) là 3, nops([4,3]) là 2. whatype(<Biểu thức>) đưa ra loại biểu thức. Ví dụ whattype(2*x*y) là '*'. type(<Biểu thức, <tên loại>) đưa ra giá trị true (đúng) hoặc false (sai) phụ thuộc vào biểu thức có cùng tên loại hoặc không. Có thể có biểu thức thuộc loại mà nó là tổ hợp HVTH: Nguyễn Siêu Đẳng Trang 8 Báo cáo TH: Lập trình Symbolic cho TTNT GVHD: PGS.TS. Đỗ Văn Nhơn của các tiêu chuẩn khác nhau. Ví dụ type(2*x*y,'*'); là đúng, type(2*x*y,polynom) cũng là đúng. Ví dụ 1.6.1: Loại và số hạng của biểu thức tính theo whattype và op A. whattype đưa ra loại của biểu thức đối số. Loại của biến ẩn là chuỗi. >s:=x+2*y+sin(3*z^2); s:=x+2 y+sin(3z2); >whattype(s); + >whattype(t); string B. nops đưa ra số số hạng của biểu thức. Có ba số hạng trong tổng s. >nops(s) 3 C. op(i,<biểu thức>) đưa ra số hạng thứ i của biểu thức >op(1,s); x D. Gía trị 0 ở đầu của op là tên hàm >nops(op(3,s)); 1 >op(0,op(3,s)); sin E. sin(3*z^2) ccó một số hạng, đó là đối số 3*z^2 >op(1,op(3,s)); 3z2 F. Lỗi xảy ra khi hỏi đối số thứ hai của sin(3*z^2), vì chỉ có một. >op(2,op(3,s)); error, improper op or subscript selector H. Phép chia như là phép nhân. tích luôn coi hàng hữu tỷ như số hạng đầu tiên. >q:=x/(6*y) q:=1/6 x/y >type(q,'*'); HVTH: Nguyễn Siêu Đẳng Trang 9 Báo cáo TH: Lập trình Symbolic cho TTNT GVHD: PGS.TS. Đỗ Văn Nhơn true >op(1,q); 1/6 >op(2,q); x >r:=op(3,q); r:=1/y >type(r,'^'); true >op(1,r); y >op(2,r); -1 1.7 Dãy biểu thức Dãy biểu thức là việc sắp xếp đối tượng của Maple theo thứ tự và tách nhau bởi dấu phẩy, như a,b,c. Dãy có thể được gán vào một biến như một giá trị giống như bất kỳ một kết quả nào của Maple. Trong Maple có nhiều hàm và cấu trúc dữ liệu liên quan tới dãy như cấu trúc tập hợp, cấu trúc danh sách và các hàm giải phương trình, Ví dụ hàm solve nhiều khi đưa ra dãy các nghiệm, hàm op được cho một đối số, thì nó đưa ra dãy tất cả số hạng của thông số. Ký hiệu NULL dùng cho dãy rỗng không có phần tử nào. Nhiều khi ta cần phải xây dựng dãy, ví dụ như nếu seq1 được gán vào dãy các biến a,b,c thì seq1,d sẽ ra dẫy a,b,c,d còn seq1,NULL,seq1,NULL sẽ ra a,b,c,a,b,c. Vì dãy thường xuất hiện trong thực tế nên Maple có một số hàm sẵn để xây dựng dãy. Xây dựng dãy biến đổi theo giới hạn số nguyên seq(f(i),i=<cận dưới> <cận trên>) Xây dựng dẫy biến đổi theo phần của biểu thức seq(f(x),x=<biểu thức>) Dạng một của seq sinh ra dẫy biểu thức bằng cách thay i vào f(i) từ giá trị cận dưới tới giá trị cận trên. Biểu thức f(i) có thể là biểu thức bất kỳ chứa i, nhưng không ở dạng hàm ẩn. f(i) cũng có thể không có i khi đó mọi phần tử của dẫy là như nhau và đẫy được thay bằng chính phần tử này. HVTH: Nguyễn Siêu Đẳng Trang 10 [...]... Báo cáo TH: Lập trình Symbolic cho TTNT GVHD: PGS.TS Đỗ Văn Nhơn PHẦN II: ỨNG DỤNG GIẢI PHƯƠNG TRÌNH BẬC VÀ BẤT PHƯƠNG TRÌNH VỚI MAPLE 1 Giải phương trình nghiệm nguyên Cú pháp: isolve(eqns,vars); eqns: phương trình hay tập các phương trình cần giải vars: tập các biến tự do Trong trường hợp người dùng không cung cấp biến tự do, Maple sẽ tự cung cấp biến tự do Ví dụ: > isolve(3*x+4*y=13); { x = 3 − 4... luận phương trình với tham số Các bước giải và biện luận cơ bản 1) a = 0: Phương trình trở thành bx + c = 0 + b = 0 = c : mọi x là nghiệm; +b=0 c : vô nghiệm; +b 0 : phương trình trở thành phương trình bậc nhất, có nghiệm duy nhất: x = - ; 2) a 0: Phương trình đã cho là phương trình bậc hai Delta = - 4ac; Delta' = - ac; * Delta < 0 (Delta' < 0) : phương trình vô nghiệm; * Delta = 0 (Delta' = 0): phương. .. những nơi mà nó xuất hiện Trong kiểu làm việc tương tác, tại bất kỳ vị trí nào của dòng thông tin nhập vào, nếu Maple thấy một bí danh nó sẽ trực tiếp thay thế biểu thức vào đó Bí danh không thực hiện khi trong lòng nó có chính bí danh này Những thông số và các biến cục bộ bên trong những thủ tục Maple không được thiết lập bí danh HVTH: Nguyễn Siêu Đẳng Trang 16 Báo cáo TH: Lập trình Symbolic cho TTNT... hàm thông thường để sử dụng trong toán học, khoa học và công việc kỹ sư Cùng với Maple chúng ta có thể tính kết quả chúng, tính đạo hàm chúng, giải những phương trình hoặc đơn giản biểu thức có chứa chúng Chúng ta có thể định nghĩa nhũng hàm riêng cho mình bằng việc sử dụng dấu -> của Maple Để làm được điều đó chúng ta phải cần biết hàm tính toán thế nào khi nó xuất hiện bên trong các biểu thức Toán... unapply(expr3, s, t); g := (s, t) -> 1 + tan(s t)2 Để tạo được các hàm thực thụ cho ta sử dụng phải biết cách sử dụng các bước thực hiện của Maple Trong phần lập trình với Maple chúng ta sẽ miêu tả phương pháp tạo ra các hàm bằng cách định nghĩa trong proc / end sau 1.11 Sử dụng alias để thay đổi tên của các hàm và những ký hiệu toán học Gán cho biểu thức một bí danh alias( = ) Chúng... Trâu ứng ăn năm Trâu nằm ăn ba Trâu già ba ăn một > isolve({a+b+c=100,5*a+3*b+c/3=100},{m,n}); {a = -100 + 4 n, b = 200 - 7 n, c = 3 n} > solve({-100+4*n>0,-100+4*n0,3*n 0): phương trình có hai nghiệm phân biệt: hay (Biện luận và giải trên Maple được đính kèm theo bài tiểu luận này) HVTH: Nguyễn Siêu Đẳng Trang 18 Báo cáo TH: Lập trình Symbolic cho TTNT GVHD: PGS.TS Đỗ Văn Nhơn TÀI LIỆU THAM KHẢO  [1] PGS.TS Đỗ Văn Nhơn, Tài liệu giảng dạy chuyên đề Lập trình Symbolic cho Trí Tuệ... và trừ Danh sách của Maple tạo ra bởi dẫy nằm trong dấu [ và ] Phân biệt dẫy và danh sách: khi viết [a,b],[b,c] thì Maple hiểu là hai danh sách , còn khi viết (a,b),(b,c) thì chỉ là một dẫy mà thôi a,b,b,c Hàm op (xem lại phần trước) tác dụng lên tập hợp và danh sách đối với các số hạng và các phép toán tương ứng của chúng Maple dùng lệnh subsop tạo ra phiên bản khác nhau của tập hợp, danh sách hoặc . về các ứng dụng cơ bản của Maple trong giải toán và lập ứng dụng giải phương trình, bất phương trình, mặt hạn chế chưa chú trọng nghiên cứu ứng dụng Maple để giải các bài toán về hình học hay lập trình. Nhơn PHẦN II: ỨNG DỤNG GIẢI PHƯƠNG TRÌNH BẬC VÀ BẤT PHƯƠNG TRÌNH VỚI MAPLE 1. Giải phương trình nghiệm nguyên Cú pháp: isolve(eqns,vars); eqns: phương trình hay tập các phương trình cần giải. vars:. Học Công Nghệ Thông Tin BÁO CÁO CHUYÊN ĐỀ: LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO ĐỀ TÀI: ỨNG DỤNG GIẢI PHƯƠNG TRÌNH VÀ BẤT PHƯƠNG TRÌNH TRONG MAPLE GVHD: PGS.TS. ĐỖ VĂN NHƠN Người thực hiện:

Ngày đăng: 10/04/2015, 00:50

Từ khóa liên quan

Mục lục

  • LỜI NÓI ĐẦU

  • PHẦN I: SỬ DỤNG CÁC LỆNH TRỰC TIẾP VỚI MAPLE

    • 1.1 Thực hiện phép toán số học trong Maple  

    • 1.3 Các hằng số toán học của Maple  

    • 1.5 Dấu ngoặc đơn và độ ưu tiên các phép toán  

    • 1.6 Những thành phần của biểu thức.

    • 1.7 Dãy biểu thức

    • 1.8 Cấu trúc tập hợp và danh sách trong Maple

    • 1.9 Tính toán số với độ chính xác bất kỳ

    • 1.10 Định nghĩa những hàm đơn giản trong Maple  

    • PHẦN II: ỨNG DỤNG GIẢI PHƯƠNG TRÌNH BẬC VÀ BẤT PHƯƠNG TRÌNH VỚI MAPLE

      • 1. Giải phương trình nghiệm nguyên

      • 2. Giải phương trình bậc hai:

      • TÀI LIỆU THAM KHẢO

Tài liệu cùng người dùng

Tài liệu liên quan