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à:

.(cu) + 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ả

pdf14 trang | Chuyên mục: MATLAB | Chia sẻ: yen2110 | Lượt xem: 606 | Lượt tải: 1download
Tóm tắt nội dung Giáo trình Matlab - Chương 8: Phương trình vi phân đạo hàm riêng (Phần 1), để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
à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:

  • pdfgiao_trinh_matlab_chuong_8_phuong_trinh_vi_phan_dao_ham_rien.pdf