1. Trang chủ
  2. » Công Nghệ Thông Tin

HỌC MATLAB BẰNG THÍ DỤ

50 8 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 50
Dung lượng 365,54 KB

Nội dung

Tài liệu này được viết với mục đích hướng dẫn các sinh viên học nhanh về Matlab. Phần đầu tài liệu là nội dung bài giảng của tác giả về Matlab trong học phần Giải phương trình bằng máy tính. Một số thí dụ, chương trình tính toán số được lấy từ bài giảng Giải tích số 1 cho lớp cử nhân tài năng, Cơ học chất lỏng cũng của tác giả. Matlab là phần mềm trợ giúp tính toán số và ký hiệu, do đó tài liệu gồm hai phần: (1) tính toán ký hiệu, và (2) tính toán số. Sau khi đọc xong...

HỌC MATLAB BẰNG THÍ DỤ Trịnh Anh Ngọc 8/5/2009 Học MATLAB thí dụ Tài liệu viết với mục đích hướng dẫn sinh viên học nhanh Matlab Phần đầu tài liệu nội dung giảng tác giả Matlab học phần "Giải phương trình máy tính" Một số thí dụ, chương trình tính toán số lấy từ giảng "Giải tích số 1" cho lớp cử nhân tài năng, "Cơ học chất lỏng" tác giả Matlab phần mềm trợ giúp tính toán số ký hiệu, tài liệu gồm hai phần: (1) tính toán ký hiệu, (2) tính toán số Sau đọc xong tài liệu này, sinh viên có thể: - Dùng Matlab giải toán giải tích, đại số đại số tuyến tính; - Dùng Matlab để viết chương trình tính toán cho môn Phương pháp phần tử hữu hạn, Giải tích số, Cơ học vật rắn biến dạng, Cơ học chất lỏng Vai trò máy tính nghiên cứu ứng dụng toán học • Công cụ trợ giúp tính toán số ký hiệu Về tính toán số: giúp mô toán thuộc lãnh vực khoa học kỹ thuật, phân tích liệu Về tính toán ký hiệu: cho phép thực hiện, kiểm tra phép biến đổi toán học; dự đoán, thử nghiệm dự đoán toán học; đánh giá thực hành kết lý thuyết • Hiển thị kết đồ họa Matlab - phần mềm toán học Matlab ngôn ngữ thực dành cho tính toán, đặc biệt tính toán kỹ thuật Với Matlab ta tính toán, hình dung, lập trình cho đối tượng toán học Matlab hệ thống tương tác mà phần tử liệu mảng (array) Điều này, thể tên gọi (Matlab viết tắt Matrix laboratory), cho phép ta thực dễ dàng tính toán ma trận vectơ thường gặp toán kỹ thuật Hệ thống Matlab gồm năm phần chính: 1) Ngôn ngữ Matlab 2) Môi trường làm việc Matlab 3) Quản lý đồ họa 4) Thư viện hàm toán học Matlab 5) Giao diện chương trình ứng dụng Matlab Trong tài liệu ta làm quen với phần 1) - 4) Bạn đọc nên tìm Trịnh Anh Ngọc tài liệu: Getting Started with MATLAB, MathWorks, Inc., 1998 Symbolic Math Toolbox User's Guide, MathWorks, Inc., 1998 tuû sách MathWorks để đọc thêm Matlab cần Lướt qua Matlab - nhìn đầu Trong mục ta lướt qua vòng Matlab để có nhìn khái quát tính đặc điểm đáng lưu ý Để học nhanh Matlab bạn phải đọc tài liệu với máy tính trước mặt Hãy thử thực thí dụ đưa tài liệu Quan sát "phản ứng" Matlab xử lý lệnh đưa vào Tự đặt thí dụ để thử nghiệm, đọc kỹ dòng cảnh báo, thông báo lỗi có Hình 1: Cửa sổ Matlab ◦ Để khởi động Matlab ta cần nhắp kép (double click) vào biểu tượng Học MATLAB thí dụ nó, vào menu start\All programs\Matlab 7.1 chọn Matlab 7.11 Một cửa sổ có tên Matlab (hay Matlab command) xuất với dấu nhắc lệnh >>(hình 1) Các lệnh Matlab nhập vào từ ◦ Để thoát (quit) cần nhắp chuột vào dấu X góc bên phải cửa sổ Matlab ◦ Tất đối tượng đưa vào Matlab phải "khai báo" cách xác định "nội dung" Vectơ ◦ Để tạo vectơ, thí dụ a, cửa sổ Matlab command ta nhập vào >> a = [1 5] sau nhấn enter Matlab trả veà: a = Chú ý: thành phần vectơ nằm hai dấu ngoặc vuông, cách khoảng trắng Diễn ngữ "Matlab trả về" hiểu ngầm thí dụ sau Tạo vectơ b với thành phần lấy giá trị nguyên từ đến 10 >> b = 0:10 b = 10 Nếu muốn thành phần liên tiếp cách nhập vaøo >> c = 0:2:10 c = 10 Kích thước (chiều dài) vectơ cho nhờ hàm length, >> dai=length(c) dai= ◦ Tính toán vectơ đơn giản Cộng thành phần vectơ a với >> a + ans = 12 11 10 Chú ý: lệnh, biến đưa vào Matlab lưu giữ workspace (vùng làm việc) Có thể hình dung workspace tờ giấy nháp ta dùng làm tính, phép tính viết từ xuống dưới, ta xem lại kết thực hiện, xóa biến biểu thức đưa vào (dùng lệnh clear tenbien clear all - xóa tất cả) Nội dung workspace hiển thị cửa sổ Matlab ta dùng trượt bên phải cửa sổ Matlab để xem nội dung cũ(hình 2) Trong tính toán trên, ta không định phép gán, Matlab lưu trữ kết Tên Matlab 7.1 khác tùy thuộc phiên Matlab mà bạn dùng Trịnh Anh Ngọc Hình 2: Nội dung workspace hiển thị cửa sổ Matlab tính toán biến tạm thời gọi "ans" Về mặt toán học ta cộng vectơ với số! Trong thí dụ Matlab mở rộng thành ma trận [3 3 3 3 3] có độ dài vectơ a thực phép cộng ◦ Nếu cần thực lại lệnh đưa vào trước ta tái lại lệnh cách nhấn phím ↑ số lần thích hợp mà không cần phải gõ lại lệnh Tính vectơ d tổng hai vectơ a b >> d = a + b d = 11 15 15 15 15 15 Chú ý: muốn cộng hai vectơ chúng phải có độ dài Phép trừ vectơ thực tương tự Ma trận ◦ Nhập ma trận vào Matlab giống nhập vectơ, ngoại trừ dòng cách dấu chấm phẩy enter (return): Học MATLAB thí duï >> B = [1 4; 8; 10 11 12] hay >> B = [1 B 10 11 12] = 10 11 12 Kích thước ma trận cho hàm size, >> size(B) ans= ◦ Matlab thực hiệu nhiều phép tính ma trận, số phép tính thường dùng (bạn đọc tự đưa thí dụ để thử nghiệm), danh sách lệnh hiển thị dùng lệnh help Từ danh sách ta tra cứu cú pháp lệnh thông tin liên quan Phép cộng (trừ) hai ma trận tương tự trường hợp vectơ Đặc biệt, nhân ma trận với số viết theo thứ tự Thí dụ, A ma trận s số hai lệnh s*A A*s cho kết Chuyển vị: >> C = B ’ Nếu B ma trận phức B ’ cho chuyển vị liên hợp phức B Trong trường hợp muốn lấy chuyển vị B ta phải dùng ".'" >> D = B ’ Nhân hai ma trận: >> D = A * B Nếu muốn nhân phần tử tương ứng hai ma trận có kích thước ta dùng ".*" >> G = E * F Nếu E ma trận vuông phép nhân ma trận E với n lần thực phép lấy lũy thừa Thí dụ: >> E∧ Nếu muốn lũy thừa phần tử ma trận ta dùng ".∧" Thí dụ: >> E ∧3 Nghịch đảo ma trận vuông: >> inv(E) Các giá trị riêng: >> eig(E) Đa thức đặc trưng: >> poly(E) Trịnh Anh Ngọc Hàm số ◦ Matlab có thư viện hàm toán học phong phú √ : sin, cos, −1 định nghóa sẵn Matlab >> sin(pi/4) log, exp, sqrt, Các số thường dùng : π, i (hay j) = ans = 0.7071 trả ◦ Đối số hàm ma trận Thí dụ, x=[1 2; 4], lệnh exp(x) ans = 2.7183 7.3891 20.0855 54.5982 ma trận exp(1) exp(2) exp(3) exp(4) ◦ Để tìm hiểu cách dùng hàm Matlab cần gõ >> help [ten ham] ◦ Matlab cho phép người sử dụng tạo hàm riêng cho lệnh function (sẽ giới thiệu đây) Đồ thị Trong Matlab để vẽ đồ thị hàm số ta dùng hàm plot Thí dụ để vẽ đồ thị hàm sin(t), trước hết ta tạo vectơ thời gian t tính giá trị hàm sin thời điểm >> t = 0:0.25:7; y =sin(t); >> plot(t,y) Chú ý: tên hàm (plot) viết chữ thường, dấu chấm phẩy cuối câu lệnh thị Matlab kết tính toán hình M-file M-file file văn (text) chứa mã Matlab Tên M-file có phần mở rộng ".m" Có hai loại M-file: ◦ Script, đối số nhập/xuất, giống "kịch bản" ghi lệnh tính toán mà người sử dụng yêu cầu Khi gõ tên file dấu nhắc lệnh nhấn phím enter, Matlab thực lệnh ghi file, liệu hành vùng làm việc (workspace) Trong thực hành, để kiểm soát liệu tính toán, script file thường bắt đầu lệnh clear all xóa tất biến lưu trữ workspace, khởi tạo lại biến mà script file cần dùng ◦ Function, có đối số nhập/xuất Loại file thường dùng để định nghóa hàm (giống chương trình con) Thí dụ M-file rank.m Học MATLAB thí dụ Hình 3: Đồ thị hàm y = sin(t) với ≤ t ≤ function r = rank(A,tol) % RANK Matrix rank % RANK(A) provides an estimate of the number of linearly % independent rows or columns of a matrix A % RANK(A,tol) is the number of singular values of A % that are larger than tol % RANK(A) uses the default tol = max(size(A)) * norm(A) * eps s = svd(A); if nargin = =1 tol = max(size(A)) * max(s) * eps; end r = sum(s > tol); Chú ý: function dòng thứ từ khóa Dòng cho tên function thứ tự đối số Tiếp theo dòng đầu dòng bình luận, bắt đầu %, dòng chúng Matlab hiển thị ta gõ lệnh help rank Phần lại file dòng khả thi Giới thiệu Symbolic Math Toolbox Mục giới thiệu nét Symbolic Math Toolbox, thành phần Matlab đảm trách việc tính toán ký hiệu 4.1 Trịnh Anh Ngọc Đối tượng ký hiệu Đối tượng ký hiệu (symbolic object) hay sym cấu trúc liệu lưu trữ chuỗi (string) biểu diễn ký hiệu Đối tượng ký hiệu dùng để biểu diễn biến, biểu thức ma trận ký hiệu Để tạo biến biểu thức ký hiệu ta dùng hàm sym Thí dụ, >> x = sym(’x’) tạo biến ký hiệu x lưu trữ ký tự x >> a = sym(’alpha’) tạo biến ký hiệu a lưu trữ chuỗi ký tự alpha Thí dụ khác, >> rho = sym(’(1 + sqrt(5))/2’) tạo biến ký hiệu biểu diễn tỉ lệ vàng (golden ratio) 4.2 Các phép tính ký hiệu thường dùng Ta thực nhiều phép tính biến ký hiệu Dưới vài phép tính thường dùng SUBS - thay ký hiệu ◦ subs(s) thay tất biến biểu thức ký hiệu s giá trị nhận từ hàm gọi, hay vùng làm việc Thí dụ, giả sử a=980, C1=3 tồn vùng làm việc >> y=exp(-a*t)*C1; >> subs(y) trả ans=3*exp(-980*t) ◦ subs(s,new) thay biến ký hiệu tự s new Thí dụ, s biểu thức f=x∧2 >> subs(s,2) trả ans=4 (x thay biểu thức s) ◦ subs(s,old,new) thay old new biểu thức s Ở old biến ký hiệu, chuỗi biểu diễn tên biến hay chuỗi diễn tả biểu thức; new biến ký hiệu biến số biểu thức Thí dụ, subs(a+b,a,4) trả 4+b (a thay 4) Lệnh subs cho phép thay nhiều biến lúc Thí dụ, subs(cos(a)+sin(b),{a,b},{sym(’alpha’),2}) trả cos(alpha)+sin(2) (a thay chuỗi alpha, b thay 2) Nếu old new vectơ hay mảng có kích thước, phần tử old thay phần tử tương ứng new Nếu s old vô hướng new mảng hay mảng ma trận (cell array), vô hướng mở rộng kết mảng Thí dụ, subs(exp(a*t),’a’,-[1 3; 2]) trả [ exp(-t), exp(-3*t)] Học MATLAB thí dụ [ exp(-4*t), exp(-2*t)] Trong thí dụ a mở rộng thành mảng thay phần tử tương ứng phần tử tương ứng mảng -[1 3; 2] Về mặt toán học, phép tính thực sau exp −1 −3 −4 −2 ∗t = exp −t −3 ∗ t −4 ∗ t −2 ∗ t = exp(−t) exp(−3 ∗ t) exp(−4 ∗ t) exp(−2 ∗ t) Nếu new ma trận mảng hay ma trận số, thay thực phần tử; nghóa subs(x*y,{x,y},{A,B}) trả A.*B A, B ma trận số) Thí dụ, subs(x*y,{x,y},{[0 1;-1 0],[1 -1;-2 1]}) trả [ 0, -1] [ 2, 0] EXPAND - khai trieån bieåu thức ký hiệu expand(s) viết phần tử biểu thức ký hiệu s tích thừa số expand hay dùng với đa thức, dùng để khai triển biểu thức lượng giác, hàm mũ hàm logarit Thí dụ: 1) ((x-2)*(x-4)) trả x∧2-6*x+8 2) expand(cos(x+y)) trả cos(x)*cos(y)-sin(x)*sin(y) 3) expand(exp((a+b)∧2)) trả exp(a∧2)*exp(a*b)∧2*exp(b∧2) 1] 4) expand([sin(2*t), cos(2*t)]) trả [2*sin(t)*cos(t), 2*cos(t)∧2SIMPLIFY - đơn giản biểu thức ký hiệu simplify(s) đơn giản phần tử ma trận ký hiệu s Thí dụ: 1) simplify(sin(x)∧2 + cos(x)∧2) trả 2) Với rho biến biểu diễn tỉ lệ vàng (thí dụ trên) >> f = rho∧2-rho-1 f = (1/2+1/2*5∧(1/2))∧2-3/2-1/2*5∧(1/2) >> simplify(f) f = 3) simplify(exp(c*log(sqrt(alpha+beta)))) traû (alpha+beta)∧(1/2*c) Chú ý, lệnh gán biểu thức >> f = sym(’a*x∧2 + b*x + c’) không tạo biến tương ứng với từ a, b, c, x biểu thức Để thiết lập phép toán ký hiệu (e.g., tích phân, vi phân, thay thế, etc.) f, ta cần phải tạo 35 Học MATLAB thí dụ if biểu thức elseif else lệnh biểu thức lệnh lệnh end Các lệnh thực phần thực biểu thức khác không Các phần else elseif tùy chọn 'biểu thức' lệnh if thường có dạng: biểu thức R biểu thức R ==, , =, hay ∼= FOR - lặp lại lệnh số lần định Dạng chung lệnh for for biến = giá trị đầu : bước gia tăng : giá trị cuối lệnh end 'biến' lấy giá trị 'giá trị đầu', sau lần thực lệnh tăng thêm lượng 'bước gia tăng', 'biến' "nhỏ hơn" lệnh thực WHILE - lặp lại số lần không xác định Dạng chung lệnh while while biểu thức lệnh end Các lệnh thực phần thực 'biểu thức' khác không 'biểu thức' lệnh while thường có dạng: biểu thức R biểu thức R ==, , =, hay ∼= Lệnh break dùng để dừng vòng lặp SWITCH - chuyển đổi nhiều trường hợp sở biểu thức Dạng chung lệnh switch 36 Trịnh Anh Ngọc switch biểu thức case trường hợp 1, lệnh case trường hợp lệnh otherwise lệnh end Các lệnh theo sau case thứ i thực 'biểu thức' có giá trị 'trường hợp i' Ngoài trường hợp liệt kê lệnh theo sau otherwise thực 5.2 Một số chương trình thí dụ Mục chứa đựng số chương trình đơn giản viết ngôn ngữ Matlab Mỗi thí dụ bắt đầu sở thuật toán cuối chương trình tính Bạn đọc nên đọc kỹ phần thuật toán để hiểu mục đích nội dung chương trình Hãy chạy thử tìm cách sửa đổi Thí dụ 11 Giải phương trình đại số tuyến tính AX = B - Phép khử Gauss Nhắc lại, hệ phương trình đại số tuyến tính có dạng a11 x1 + a12 x2 + + a1n xn = b1 a21 x1 + a22 x2 + + a2n xn = b2 an1 x1 + an2 x2 + + ann xn = bn , vế phải bi , i = 1, , n, hệ số aij , i, j = 1, , n liệu cho trước; x1 , , xn ẩn Ý tưởng đằng sau phương pháp khử Gauss dùng phép biến đổi sơ cấp để khử ẩn hệ Hệ phương trình tương đương, sau biến đổi, có dạng tam giác trên, giải phép ngược Nếu a11 = 0, bước ta khử x1 khỏi (n − 1) phương trình cuối cách trừ phương trình thứ i với nhân tử mi1 = ai1/a11, i = 2, , n lần phương trình đầu Điều sinh hệ rút gọn gồm (n − 1) phương trình với ẩn x2 , , xn , hệ số cho (2) aij = aij − mi1a1j , (2) bi = bi − mi1 b1, i = 2, , n 37 Học MATLAB thí dụ Nếu a22 = 0, cách tương tự ta khử x2 từ (n − 2) phương trình cuối hệ phương trình Sau k − bước, k ≤ n, phép khử Gauss ma trận A trở thành ma trận có dạng (2)  A(k) (1) a11      =     (1) (1) (1) a12 a1k a1n (2) (2) (2) a22 a2k a2n (k) (k) akk akn (k) (k) ank ann   (1) b1 (2) b2           (k) , b =   (k)   b   k     (k) bn       ,     ta đặt A(1) = A, b(1) = b Các phần tử chéo a11 , a22 , , xuất trình khử gọi phần tử trụ Ký hiệu Ak ma trận A, (1)    Ak =   a11 a12 a1k a21 a22 a2k ak1 ak2 akk (2)      Vì định thức ma trận không thay đổi phép biến đổi sơ cấp thứ ba nên (1) (2) (k) det(Ak ) = a11 a22 · · · akk , k = 1, , n Các phần tử truï aii , i = 1, , n, phép khử Gauss khác không det(Ak ) = 0, k = 1, , n Trong trường hợp ta khử sau bước thứ (n − 1), lại phương trình (i) (n) a(n) nn xn = bn (n) (ann = 0) Các ẩn phương trình tính công thức truy hồi n xn = bn(n)/a(n) nn , xi = (i) bi (i) − aik xk k=i+1 Quá trình gọi ngược (i) /aii , i = n − 1, , 38 Trịnh Anh Ngọc Giả sử bước thứ k phép khử Gauss ta có (k) akk = Nếu A không suy biến, k cột đầu ma trận A độc lập tuyến tính Điều với ma trận biến đổi Nghóa tồn apk = (k < p ≤ n) Bằng cách hoán vị dòng k dòng p phần tử lấy làm phần tử trụ phép khử tiếp tục Tóm lại, ma trận không suy biến dẫn dạng tam giác phép khử Gauss phép hoán vị dòng dùng cần Nếu rank(A) < n xảy bước thứ k − (k) aik = 0, i = k, , n Nếu toàn phần tử aij = 0, i, j = k, , n rank(A) = k − ta dừng lại Ngược lại, có phần tử khác không, chẳng hạn (k) a(k) pq , ta mang đến vị trí trụ cách hoán vị dòng k với p, cột k với q (khi cột ma trận A bị hoán vị ta phải hoán vị phần tử tương ứng vectơ x Tiến hành theo cách ma trận A đưa dạng hình thang  A(r)      =     (1) a11 a1r arr ar,r+1 0 (1) (r) (1) a1,r+1 (r) (1)  a1n    (r)  arn  ,      b(r) (1) b1     (r)  br =  (r)  br+1    (r) bn       ,     bước r = rank(A) Các phần tử trụ nhỏ dẫn đến kết không xác Có cách để tránh phần tử trụ nhỏ gọi phép xoay cục Theo cách này, khử xk , ta chọn hệ số lớn (về giá trị tuyệt đối) xk n−k +1 phương trình cuối phần tử trụ Nghóa là, |alk | lớn |ajk | với j = k, k + 1, , n (k) (k) ta hoán vị dòng k l Bằng cách đánh số lại ta giả sử phần tử trụ akk có độ lớn lớn (k) Học MATLAB thí dụ 39 Áp dụng giải hệ phương trình x1 + x2 + x3 = 3x1 + x2 − 3x3 = x1 − 2x2 − 5x3 = 10 Để lưu giữ ma trận hệ số a vế phải b, chương trình ta đưa vào ma trận hệ số nới rộng ad Lệnh [v,index]=max(ad(k:n,k)) trả hai giá trị: v phần tử lớn vectơ ad(k:n,k) index vị trí phần tử % chuong trinh - giai he phuong dstt clear all a=[1 1; -3; -2 -5]; b=[1;5;10]; n=size(a,1); % ma tran noi rong ad=a; ad(:,n+1)=b; for k=1:n-1 % tim phan tu tru [v,index]=max(ad(k:n,k)); if v==0 disp(’he phuong trinh suy bien’) return end % dong chua phan tu tru index=index+k-1; % hoan vi dong k va dong index tam=ad(index,:); ad(index,:)=ad(k,:); ad(k,:)=tam; % dung dong k khu cac dong duoi for i=k+1:n for j=k:n+1 ad(i,k:n+1)=ad(i,k:n+1)-(ad(i,k)/ad(k,k))*ad(k,k:n+1); end end end % phep the nguoc if ad(n,n)==0 disp(’he phuong trinh suy bien’) return 40 Trònh Anh Ngoïc end x(n)=ad(n,n+1)/ad(n,n); for i=n-1:-1:1 x(i)=ad(i,n+1); for j=i+1:n x(i)=x(i)-ad(i,j)*x(j); end x(i)=x(i)/ad(i,i); end disp(’nghiem cua he:’) x Kết tính toán nghiem cua he: x = 6.0000 -7.0000 2.0000 Thí dụ 12 Giải phương trình f (x) = - Thuật toán chia đôi khoảng Hình 8: Đồ thị hàm số f (x) = x3 − 3x2 + x + Nếu hàm liên tục f (x) có dấu đối điểm x = B x = C, có không điểm khoảng B C Phương pháp chia đôi (hay tìm kiếm nhị phân) đặt kiện Nếu f (B)f (C) < 0, hàm f (x) đánh giá điểm M = (B + C)/2 khoảng Nếu f (M ) = 0, không điểm tìm thấy Nếu khác, f (B)f (M ) < f (M )f (C) < Trong trường hợp đầu có không điểm M B, trường hợp thứ hai có nghiệm C M Theo cách khoảng chứa nghiệm tìm thấy mà có chiều dài nửa chiều dài khoảng ban đầu Thủ tục lặp lại định vị nghiệm với độ xác mong muốn Học MATLAB thí dụ 41 Áp dụng giả√i phương trình x3 − 3x2 + x + = (phương trình có nghiệm xác: 1, ± 2) Để có nhìn sơ phương trình cho ta dùng Matlab vẽ đồ thị hàm f (x) = x3 − 3x2 + x + Từ đồ thị (hình 8) ta thấy phương trình có ba nghiệm đơn, nằm khoảng [−0.5, 0], [0.5, 1.5], [2, 3] Như thí dụ áp dụng ta viết chương trình tìm nghiệm xấp xỉ phương trình khoảng [−0.5, 0] % chuong trinh - giai phuong trinh bang phuong phap chia % doi khoang % chuong trinh goi function f1 clear all b=-0.5; c=0; epsilon=10^(-4); m=b; % m duoc khoi tao bang b while (abs(c-b)>=epsilon)&(f1(m)~=0) m=(b+c)/2; if f1(b)*f1(m)

Ngày đăng: 11/05/2021, 04:04

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w