Giáo trình Matlab - Chương 8: Phương trình vi phân đạo hàm riêng (Phần 1)
1. Khái niệm chung: Partial Differential Equation (PDE) Toolbox cung cấp
một môi trường mạnh và mềm mại để nghiên và giải các phương trình vi phân
đạo hàm riêng trong mặt phẳng. Dạng phương trình cơ bản của PDE Toolbox
là:
‐∇.(c∇u) + au = f trong miền Ω
Các phương trình được rời rạc hoá bằng phương pháp phần tử hữu hạn(FEM).
Các đối tượng trong PDE cung cấp công cụ để:
• xác định bài toán PDE, nghĩa là xác định vùng 2D, các điều kiện biên và
các hệ số PDE.
• giải bằng phương pháp số các bài toán, nghĩa là tạo ra lưới không có
cấu trúc, rời rạc hoá phương trình và tìm nghiệm xấp xỉ.
• hiển thị kết quả
ành: 0ucu2 =∆−ω− 160 hay phương trình Helmholz: 0uku 2 =−∆− Trong đó k là số sóng, liên quan đến tần số góc ω, tần số f và độ dài sóng λ bằng: λ π=π=ω= 2 c f2 c k Bây giờ ta phải mô tả điều kiện biên. Coi sóng tới là một sóng phẳng theo hướng: ))asin(),a(cos(a =r : ti)tx.ak(i e)y,x(ve)t,y,x(v ω−ω− == rr Trong đó : )y,x(ve x.aik =rr u là tổng của v và sóng phản xạ r: u = v + r Điều kiện biên đối với biên đối tượng là u = 0, nghĩa là r = ‐ v(x,y)(với sóng âm, v là nhiễu loạn áp suất do đó điều kiện biên thích hợp phải là ∂u/∂n=0). Sóng phản xạ đi ra khỏi đối tượng. Điều kiện biên bên ngoài phải chọn sao sóng không bị phản xạ. Điều kiện như vậy thường gọi là không phản xạ và ta dùng điều kiện bức xạ Sommerfeld. Khi đạt đến vô cùng, r thoả mãn xấp xỉ phương trình sóng một chiều: 0rc t r =∇ξ+∂ ∂ r cho phép sóng chỉ chuyển động theo hướng x(x là khoảng cách bức xạ từ vật thể). Với nghiệm điều hoà theo t,đ iều này trở thành điều kiện biên Neumann tổng quát hoá: ikrr =∇ξr Vì lí do đơn giản hoá, coi pháp tuyến bên ngoài của vùng khảo sát xấp xỉ hướng bên ngoài ξ. Bây giờ ta dùng pdetool để giải bài toán. Sử dụng mode Generic Scalar bằng cách vào menu Option|Application và đánh dấu vào Generic Scalar , bắt đầu bằng cách vẽ vùng 2‐D của bài toán. Đối tượng bị chiếu sáng là một hình vuông R1 với cạnh 0.1 đơn vị và tâm ở [0.8 0.5] và quay 450 (vào Draw|Rotate ) và coi vùng tính là C1 là hình tròn có bán kính 0.45 và tâm cùng một chỗ với hình vuông. Mô hình CGS là C1‐R1. Với biên ngoài, ta dùng điều kiện biên Neumann với q = ‐jk. Hệ số sóng k = 60 tương ứng với bước sóng 0.1 đơn vị. Như vậy ta cần nhập giá trị q = ‐60j và g = 0 bằng cách vào menu Boundary| Specify Boundary Condition... Đối với biên hình vuông ta dùng điều kiện biên Dirichlet: 161 x.aike)y,x(vr rr−=−= Trong bài toán này, sóng tới phải đi qua đoạn ‐x. Như vậy điều kiện biên có dạng đơn giản là: ikxe)y,x(vr −=−= Vào menu Boundary| Specify Boundary Condition... và nhập điều kiện biên Dirichlet h = 1, r = ‐exp(‐i*60*x). Vào menu PDE|PDE Specification... và nhập các hệ số của phương trình là c = 1, a = ‐3600 và f = 0. Tiếp theo bấm vào nút công cụ chia lưới để chia lưới cho bài toán. Ta lưu tất cả kết quả vào file ct8_4.m. Bây giờ ta có thể giải bài toán và có nghiệm phức. Để thấy được sự lan truyền sóng phản xạ, sau khi giải bài toán ta chọn Draw|Export Geometry Description, Set Formular, Label...; Boundary|Export Decomposed Gemetry, Boundary Condʹs...; PDE|Export Coeficients...; Solve|Export Solution... và chạy các lệnh MATLAB sau(lưu trong file ct8_5.m): m = 10; % so khung hinh h = newplot; hf = get(h,ʹParentʹ); set(hf,ʹRendererʹ,ʹzbufferʹ) axis tight; set(gca,ʹDataAspectRatioʹ,[1 1 1]); axis off; M = moviein(m,hf); maxu = max(abs(u)); for j = 1:m uu = real(exp(‐j*2*pi/m*sqrt(‐1))*u); fprintf(ʹ%d ʹ,j); pdeplot(p,e,t,ʹxydataʹ,uu,ʹcolorbarʹ,ʹoffʹ,ʹmeshʹ,ʹoffʹ); caxis([‐maxu maxu]); axis tight, set(gca,ʹDataAspectRatioʹ,[1 1 1]); axis off; M(:,j) = getframe(hf); if j = = m fprintf(ʹdone\nʹ); end end movie(hf,M,50); 162 c. Bài toán mặt cực tiểu: Trong nhiều bài toán hệ số c, a và f không chỉ phụ thuộc vào x và y mà còn vào u. Ta khảo sát phương trình: 0u |u|1 1. 2 =⎟⎟⎠ ⎞ ⎜⎜⎝ ⎛ ∇ ∇+ ∇− trong hình tròn đơn vị ( ){ }1yx|y,x 22 ≤+=Ω với u = x2 trên ∂Ω. Đây là bài toán phi tuyến tính và không thể giải với trình giải solver. Do đó trình pdenonlin được dùng. Vùng tìm nghiệm là hình tròn đơn vị. Vẽ hình tròn này và xác định điều kiện biên bằng cách vào menu Boundary|Boundary Mode. Dùng Select All của menu Edit để chọn tất cả các biên. Sau đó nhấp đúp vào biên để mở hộp thoại Boundary Condition. Điều kiện biên u = x^2 được nhập vào bằng cách đánh x.^2 vào mục của r. Tiếp theo mở hộp thoại PDE Specification để xác định PDE. Đây là phương trình elliptic với 2|u|1 1c ∇+= , a = 0 và f = 0. Hệ số c được nhập vào bằng cách đánh c =1./sqrt(1+ux.^2+uy.^2). Khởi gán lưới và làm tinh lại một lần. Trước khi giải phương trình chọn Parameters . . . từ menu Solve và dùng tuỳ chọn Use nonlinear và đặt sai số 0.001. Nhấn nút = để giải phương trình. Dùng hộp thoại Plot Selection để vẽ nghiệm dạng 3‐D. d. Chia vùng: PDE Toolbox được thiết kế để làm việc với sự phân vùng cấp 1. Nếu vùng Ω phức tạp, thường nên phân nó thành các vùng có cấu trúc đơn giản hơn đơn giản. Các cấu trúc như vậy thường được thực hiện bởi pdetool. Giả sử Ω là một tập hợp các vùng con Ω1, Ω2,..., Ωn.Vậy ta có thể đánh số lại các nút của lưới trên Ω sao cho chỉ số của các nút ở các vùng con được nhóm lại với nhau trong khi tất cả chỉ số của các nút chung của 2 hay nhiều vùng con như cũ. Do ma trận K có các số hạng khác 0 chỉ ở các hàng và các cột chỉ các nút cạnh nhau, nên nó được phân thành: ⎟⎟ ⎟⎟ ⎟⎟ ⎠ ⎞ ⎜⎜ ⎜⎜ ⎜⎜ ⎝ ⎛ ⋅⋅⋅ ⋅⋅⋅ = CBBB BK00 B0K0 B00K K n21 T nn T 22 T 11 L L MMOMM Trong khi vế phải là: 163 ⎟⎟ ⎟⎟ ⎟⎟ ⎠ ⎞ ⎜⎜ ⎜⎜ ⎜⎜ ⎝ ⎛ = c n 2 1 f f f f f M Thường trình assempde của PDE Toolbox có thể gộp các ma trận Kj, Bj, fj và C một cách riêng rẽ nên ta có thể kiểm soát được việc lươ và xử lí các ma trận này. Hơn nữa cấu trúc của hệ thống tuyến tính Ku = F được đơn giản hoá bằng cách chia K thành từng ma trận riêng phần như trên. Bây giờ ta khảo sát một màng hình L. Ta có thể vẽ màng này bằng lệnh: pdegplot(ʹlshapegʹ) Chú ý các biên giữa các vùng con. Có 3 vùng con vì miền đang xét có dạng L. Như vậy công thức ma trận với n = 3 từ trên có thể dùng. Bây giờ ta tạo lưới : [p,e,t] = initmesh(ʹlshapegʹ); [p,e,t] = refinemesh(ʹlshapegʹ,p,e,t); [p,e,t] = refinemesh(ʹlshapegʹ,p,e,t); Với trường hợp này với n = 3 ta có: ⎟⎟ ⎟⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜⎜ ⎜ ⎝ ⎛ = ⎟⎟ ⎟⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜⎜ ⎜ ⎝ ⎛ ⎟⎟ ⎟⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜⎜ ⎜ ⎝ ⎛ c 3 2 1 3 2 1 321 T 33 T 22 T 11 f f f f c u u u CBBB BK00 B0K0 B00K Và nghiệm xác định bằng cách loại trừ khối: L )uBf(Ku fKBfKBfKBfu)BKBBKBBKBC( c T 11 1 11 3 1 332 1 221 1 11cc T 3 1 33 T 2 1 22 T 1 1 11 −= −−−=−−− − −−−−−− Khi giải bài toán, ta dùng phương pháp phân tích Choleski. Cac lệnh MATLAB như sau( lưu trong ct8_7.m): echo on clc % Gia pt Poissonʹs % ‐div(grad(u))=1 % tren mang L voi u=0 tren bien. % Bai toan duoc gia bang cach chia vung. pause % Nhan phim bat ki de tiep tuc. 164 clc % Dinh nghia bai toan g = ʹlshapegʹ; % mang dang L b = ʹlshapebʹ; % 0 tren bien c = 1; a = 0; f = 1; time = []; [p,e,t] = initmesh(g); [p,e,t] = refinemesh(g,p,e,t); [p,e,t] = refinemesh(g,p,e,t); pause % Nhan phim bat ki de tiep tuc. clc np = size(p,2); % Truoc het tim cac diem chung cp = pdesdp(p,e,t); % Dinh vi khong gian nc = length(cp); C = zeros(nc,nc); FC = zeros(nc,1); pause % Nhan phim bat ki de tiep tuc. % Ket hop vung 1 va cap nhat [i1,c1] = pdesdp(p,e,t,1); ic1 = pdesubix(cp,c1); [K,F] = assempde(b,p,e,t,c,a,f,time,1); K1 = K(i1,i1); d = symmmd(K1); i1 = i1(d); K1 = chol(K1(d,d)); B1 = K(c1,i1); a1 = B1/K1; C(ic1,ic1) = C(ic1,ic1) + K(c1,c1) ‐ a1*a1ʹ; 165 f1 = F(i1); e1 = K1ʹ\f1; FC(ic1) = FC(ic1) + F(c1) ‐ a1*e1; pause % Nhan phim bat ki de tiep tuc. % Ket hop vung 2 va cap nhat [i2,c2] = pdesdp(p,e,t,2); ic2 = pdesubix(cp,c2); [K,F] = assempde(b,p,e,t,c,a,f,time,2); K2 = K(i2,i2); d = symmmd(K2); i2 = i2(d); K2 = chol(K2(d,d)); B2 = K(c2,i2); a2 = B2/K2; C(ic2,ic2) = C(ic2,ic2) + K(c2,c2) ‐ a2*a2ʹ; f2 = F(i2); e2 = K2ʹ\f2; FC(ic2) = FC(ic2) + F(c2) ‐ a2*e2; pause % Nhan phim bat ki de tiep tuc. % Ket hop vung 3 va cap nhat [i3,c3] = pdesdp(p,e,t,3); ic3 = pdesubix(cp,c3); [K,F] = assempde(b,p,e,t,c,a,f,time,3); K3 = K(i3,i3); d = symmmd(K3); i3 = i3(d); K3 = chol(K3(d,d)); B3 = K(c3,i3); a3 = B3/K3; C(ic3,ic3) = C(ic3,ic3) + K(c3,c3) ‐ a3*a3ʹ; f3 = F(i3); e3 = K3ʹ\f3; FC(ic3) = FC(ic3 )+ F(c3)‐a3*e3; pause % Nhan phim bat ki de tiep tuc. 166 % Giai u = zeros(np,1); u(cp) = C\FC; % cac diem chung u(i1) = K1\(e1‐a1ʹ*u(c1)); % cac diem tren vung 1 u(i2) = K2\(e2‐a2ʹ*u(c2)); % cac diem tren vung 2 u(i3) = K3\(e3‐a3ʹ*u(c3)); % cac diem tren vung 3 % Ve pdesurf(p,t,u) pause % Nhan phim bat ki de tiep tuc. echo off Các lệnh giải bằng GUI lưu trong ct8_8.m 2. Các ví dụ về bài toán parabolic: a. Phương trình truyền nhiệt: khối kim loại bị đốt nóng: Bài toán parabolic nói chung là bài toán về phương trình truyền nhiệt dạng: 0u t ud =∆−∂ ∂ Phương trình truyền nhiệt mô tả sự lan truyền nhiệt trong các vật thể. Ví dụ đầu tiên mà ta xem xét là một thanh kim loại có một lỗ hình chữ nhật bị đốt nóng. Tại đầu bên trái của thanh nhiệt độ là 1000C. Tại đầu bên phải nhiệt lan truyền từ thanh vào môi trường không khí chung quanh với tốc độ hằng, ví dụ là 10. Các biên khác cách nhiệt. Do đó ta có các điều kiện biên sau: • u = 100 ở bên trái (điều kiện biên Dirichlet) • 10 n u −=∂ ∂ ở bên phải (điều kiện biên Neumann) • 0 n u =∂ ∂ trên các biên khác(điều kiện biên Neumann) Với phương trình truyền nhiệt ta cần điều kiện đầu: nhiệt độ của thanh kim loại tại t0. Trong bài toán này nhiệt độ ban đầu của thanh là 00C. Cuối cùng ta xác định thời điểm bắt đầu truyền nhiệt là t = 0 và ta muốn tính toán quá trình truyền nhiệt trong suốt 5s. Sau khi đã khởi động pdetool và chọn Generic Scalar ta vẽ mô hình CSG dễ dàng. Ta vẽ hình chữ nhật R1: [‐0.5 ‐0.8 1 1.6]. Ta vẽ tiếp hình chữ nhật khác (lỗ) R2: [‐0.05 ‐0.4 0.1 0.8]. Mô hình này là R1 ‐ R2. Bấm vào nút ∂Ω để xác định biên để mô tả biên và điều kiện biên. Dùng 167
File đính kèm:
- giao_trinh_matlab_chuong_8_phuong_trinh_vi_phan_dao_ham_rien.pdf