Điều kiện biên định kỳ cho phương trình nhiệt trong] 0,1 [


13

Chúng ta hãy xem xét một điều kiện ban đầu trơn tru và phương trình nhiệt theo một chiều: trong khoảng mở , và chúng ta giả sử rằng chúng ta muốn giải quyết nó bằng số với sự khác biệt hữu hạn.] 0 , 1 [

tbạn= =xxbạn
]0,1[

Tôi biết rằng để vấn đề của mình được đặt ra, tôi cần phải cung cấp cho nó các điều kiện biên tại và . Tôi biết rằng Dirichlet hoặc Neumann hoạt động tốt.x = 1x= =0x= =1

Nếu tôi có trong trường hợp đầu tiên điểm bên trong cho , thì tôi có ẩn số: cho , bởi vì được quy định tại các ranh giới.x k = kN k=1,,NNuk=u(xk)k=1,,Nuxk= =kN+1k= =1,,NNbạnk= =bạn(xk)k= =1,,Nbạn

Trong trường hợp thứ hai, tôi thực sự có ẩn số và tôi biết cách sử dụng Neumann BC (đồng nhất) để phân biệt laplacian ở viền, ví dụ như điều chỉnh hai điểm hư cấu và và các đẳng thức:N+2bạn0,,bạnN+1x-1xN+2

bạn1-bạn-12h= =0= =bạnN+2-bạnN2h

Câu hỏi của tôi là về BC định kỳ. Tôi có cảm giác rằng tôi có thể sử dụng một phương trình, cụ thể là nhưng có thể là hai, và sau đó tôi sẽ sử dụng

bạn(0)= =bạn(1)
xbạn(0)= =xbạn(1)

nhưng tôi không chắc Tôi cũng không biết mình nên có bao nhiêu điều chưa biết. Có phải là không?N+1


Bạn có điều kiện biên Dirichlet hoặc Neumann? Số lượng ô ma phụ thuộc vào thứ tự gần đúng cho các điều kiện biên Neumann của bạn.
ilciavo

@ilciavo, câu hỏi là về điều kiện biên định kỳ.
Bill Barth

Câu trả lời:


8

Cách tốt nhất để làm điều này là (như bạn đã nói) chỉ sử dụng định nghĩa về các điều kiện biên định kỳ và thiết lập chính xác các phương trình của bạn ngay từ đầu bằng cách sử dụng thực tế là . Trong thực tế, thậm chí mạnh hơn, các điều kiện biên định kỳ xác định với . Vì lý do này, bạn chỉ nên có một trong những điểm này trong miền giải pháp của mình. Một khoảng mở không có ý nghĩa khi sử dụng các điều kiện biên định kỳ vì không có ranh giới .x = 0 x = 1bạn(0)= =bạn(1)x= =0x= =1

Thực tế này có nghĩa là bạn không nên đặt một điểm tại vì nó giống với . Phân biệt với điểm, sau đó bạn sử dụng thực tế là theo định nghĩa, điểm ở bên trái của và điểm ở bên phải của .x = 0 N + 1 x 0 x N x N x 0x= =1x= =0N+1x0 xNxN x0

sơ đồ lưới điện định kỳ

PDE của bạn sau đó có thể được rời rạc trong không gian dưới dạng

t[x0x1xN]= =1Δx2[xN-2x0+x1x0-2x1+x2xN-1-2xN+x0]

Điều này có thể được viết dưới dạng ma trận dưới dạng trong đó Một=[ - 2 1 0 0 1 1 - 2 1 0 0

tx= =1Δx2Mộtx
Một= =[-210011-2100001-211001-2].

Tất nhiên không cần phải thực sự tạo hoặc lưu trữ ma trận này. Sự khác biệt hữu hạn nên được tính toán một cách nhanh chóng, chú ý xử lý các điểm đầu tiên và cuối cùng đặc biệt khi cần thiết.

Ví dụ đơn giản, tập lệnh MATLAB sau đây giải quyết với các điều kiện biên định kỳ trên miền . Giải pháp được sản xuất được sử dụng, nghĩa là . Tôi đã sử dụng chuyển tiếp thời gian Euler để đơn giản hóa và tính toán giải pháp cả có và không tạo thành ma trận. Các kết quả được hiển thị dưới đây.x [ - 1 , 1 ) u Ref ( t , x ) = exp ( - t ) cos ( 5 π x ) b ( t , x ) = ( 25 π 2 - 1 ) điểm kinh nghiệm ( - t

tbạn= =xxbạn+b(t,x)
x[-1,1)bạnTham chiếu(t,x)= =điểm kinh nghiệm(-t)cos(5πx)b(t,x)= =(25π2-1)điểm kinh nghiệm(-t)cos(5πx)
clear

% Solve: u_t = u_xx + b
% with periodic boundary conditions

% analytical solution:
uRef = @(t,x) exp(-t)*cos(5*pi*x);
b = @(t,x) (25*pi^2-1)*exp(-t)*cos(5*pi*x);

% grid
N = 30;
x(:,1) = linspace(-1,1,N+1);

% leave off 1 point so initial condition is periodic
% (doesn't have a duplicate point)
x(end) = [];
uWithMatrix = uRef(0,x);
uNoMatrix = uRef(0,x);

dx = diff(x(1:2));
dt = dx.^2/2;

%Iteration matrix:
e = ones(N,1);
A = spdiags([e -2*e e], -1:1, N, N);
A(N,1) = 1;
A(1,N) = 1;
A = A/dx^2;

%indices (left, center, right) for second order centered difference
iLeft = [numel(x), 1:numel(x)-1]';
iCenter = (1:numel(x))';
iRight = [2:numel(x), 1]';

%plot
figure(1)
clf
hold on
h0=plot(x,uRef(0,x),'k--','linewidth',2);
h1=plot(x,uWithMatrix);
h2=plot(x,uNoMatrix,'o');
ylim([-1.2, 1.2])
legend('Analytical solution','Matrix solution','Matrix-free solution')
ht = title(sprintf('Time t = %0.2f',0));
xlabel('x')
ylabel('u')
drawnow

for t = 0:dt:1
    uWithMatrix = uWithMatrix + dt*( A*uWithMatrix + b(t,x) );
    uNoMatrix = uNoMatrix + dt*(  ( uNoMatrix(iLeft) ...
                                - 2*uNoMatrix(iCenter) ...
                                  + uNoMatrix(iRight) )/dx^2 ...
                                + b(t,x) );
    set(h0,'ydata',uRef(t,x))
    set(h1,'ydata',uWithMatrix)
    set(h2,'ydata',uNoMatrix)
    set(ht,'String',sprintf('Time t = %0.2f',t))
    drawnow
end

Âm mưu của điều kiện ban đầu

Lô dung dịch tại t = 0,5

Sơ đồ giải pháp tại t = 1.0

Sơ đồ giải pháp tại t = 2.0


1
Giải pháp tuyệt vời và đơn giản !! trong trường hợp ai đó cần nó ở đây, việc triển khai trong Python
ilciavo

Tuyệt quá ! Tôi không muốn quá cụ thể về phương pháp, ví dụ như bản thân tôi sử dụng phương pháp bán rời rạc. Nhưng đối với phương trình, bạn xác nhận rằng không cần chỉ định một điều kiện trên -derivative? Chính xác hơn, một điều kiện như vậy sẽ dẫn đến một vấn đề đặt ra? x
bela83

@ bela83 Bạn đúng rằng không cần chỉ định gì nhiều hơn điều kiện ban đầu. Làm như vậy sẽ dẫn đến một hệ thống xác định quá mức. Tất cả những gì bạn cần làm là cẩn thận một chút ở gần điểm cuối của khoảng thời gian để chắc chắn rằng bạn bọc mọi thứ theo định kỳ. Có nhiều cách hợp lệ để làm điều này.
Doug Lipinski

-1

Theo đó, bạn nên áp đặt các điều kiện biên định kỳ như:

bạn(0,t)= =bạn(1,t)bạnx(0,t)= =bạnx(1,t)

Một cách để loại bỏ phương trình nhiệt một cách ngầm định sử dụng Euler lạc hậu là

bạnn+1-bạnnΔt= =bạnTôi+1n+1-2bạnTôin+1+bạnTôi+1n+1Δx2

Giải hệ phương trình

[Tôi-ΔtΔx2Một][bạn1n+1bạn1n+1bạnNn+1]= =[bạn1nbạn2nbạnNn]

Trong đó

Một= =[-21000Giáo dục01-2100Giáo dục001-210Giáo dục0001-21Giáo dục00001-2Giáo dục0000Giáo dục01-2]

Điều kiện biên định kỳ của bạn có thể được bao gồm bằng cách thêm hai phương trình và hai ô (ma) bổ sung và sao cho:bạn0bạnN+1

bạn1-bạnN= =0bạn2-bạn02Δx-bạnN+1-bạnN-12Δx= =0

Theo Mục 2.11 LeVeque, điều này mang lại cho bạn độ chính xác bậc 2 chobạnx

Cuối cùng, hệ phương trình của bạn sẽ giống như:

[0100Giáo dục0-10-1010Giáo dục10-100000Tôi-ΔtΔx2Một0000000][bạn0n+1bạn1n+1bạn2n+1bạnNn+1bạnN+1n+1]= =[00bạn1nbạn2nbạnNn]

Cung cấp cho bạn phương trình N + 2 và ẩn số N + 2.

Bạn cũng có thể thoát khỏi phương trình đầu tiên và các ô ma và đến một hệ thống N phương trình và N ẩn số.


Tôi không hiểu câu lệnh: "thêm hai ô bổ sung và " vì đã là một điểm trong . Tôi có ý nghĩ để . bạn-1bạnNbạnN]0,1[xk= =kN+1xN= =NN+1
bela83

Đó chỉ là vấn đề lập chỉ mục. Bạn bắt đầu với ô (hoặc điểm) từ đến và bạn thêm hai ô và . Nếu bạn có các ô đi từ đến thì bạn cần thêm các ô tại vàNbạn0bạnN-1bạn-1bạnNbạn1bạnNbạn0bạnN+1
ilciavo

OK, tôi không hiểu hai phương trình nữa! Đầu tiên phải là (với ký hiệu từ câu hỏi): phải không? Nhưng tôi không hiểu điều thứ hai: tại sao không chọn một xấp xỉ khác biệt trung tâm? Cuối cùng, điều đó làm cho không xác định, nếu giá trị đầu tiên và cuối cùng bằng nhau. Hãy so sánh với tình huống với (đồng nhất) Neumann BC trong câu hỏi. bạn0= =bạnN+1N+1
bela83

Tôi đã thay đổi ký hiệu. Nó phụ thuộc vào thứ tự gần đúng cho . Đầu tiên đến từ và lần thứ hai từbạnxbạn(0,t)= =bạn(1,t)bạnx(0,t)= =bạnx(1,t)
ilciavo

1
u1 = uN thêm một hạn chế bổ sung (phương trình u1 uN = 0) vào hệ thống của bạn
ilciavo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.