Các điều kiện biên cho phương trình thăng tiến được phân tách bằng phương pháp sai phân hữu hạn


14

Tôi đang cố gắng tìm một số tài nguyên để giúp giải thích cách chọn điều kiện biên khi sử dụng các phương pháp khác biệt hữu hạn để giải quyết các PDE.

Những cuốn sách và ghi chú mà tôi hiện có quyền truy cập đều nói những điều tương tự:

Các quy tắc chung chi phối sự ổn định trong sự hiện diện của các ranh giới là quá phức tạp đối với một văn bản giới thiệu; họ đòi hỏi máy móc toán học tinh vi

(A. Iserles Một khóa học đầu tiên trong phân tích số phương trình vi phân)

Ví dụ: khi cố gắng thực hiện phương pháp bước nhảy 2 bước cho phương trình thăng tiến:

uin+1=uin1+μ(ui+1nui1n)

sử dụng MATLAB

M = 100; N = 100;

mu = 0.5;

c = [mu 0 -mu];
f = @(x)(exp(-100*(x-0.5).^2));

u  = zeros (M, N);
x = 1/(M+1) * (1:M);

u(:,1) = f(x);
u(:,2) = f(x + mu/(M+1));

for i = 3:N
    hold off;
    u(:,i) = conv(u(:,i-1),c,'same') + u(:,i-2);
    plot(x, u(:,i));
    axis( [ 0 1 0 2] )
    drawnow;
end

Giải pháp hành xử độc đáo cho đến khi nó đạt đến ranh giới, khi nó đột nhiên bắt đầu cư xử tồi tệ.

Tôi có thể học cách xử lý các điều kiện biên như thế này ở đâu?

Câu trả lời:


12

Phản ứng của Sloede là rất kỹ lưỡng và chính xác. Tôi chỉ muốn thêm một vài điểm để dễ nắm bắt hơn.

Về cơ bản, bất kỳ phương trình sóng nào cũng có tốc độ và hướng sóng vốn có. Đối với phương trình sóng một chiều: tốc độ sóng là hằng số xác định không chỉ tốc độ truyền thông tin trong miền mà cả hướng của nó. Nếu , thông tin sẽ chuyển từ trái sang phải và nếu thì ngược lại.a a > 0 a < 0

bạnt+mộtbạnx= =0
mộtmột>0một<0

Đối với phương pháp nhảy , khi bạn loại bỏ các phương trình bạn nhận được: hoặc: trong đó . Trong trường hợp của bạn,u n i =u n - 2 i +μ(u n - 1 i + 1 -u n - 1 i - 1 )μ=-mộtΔt/Δxμ>0

bạnTôin-bạnTôin-22Δt+mộtbạnTôi+1n-1-bạnTôi-1n-12Δx= =0
bạnTôin= =bạnTôin-2+μ(bạnTôi+1n-1-bạnTôi-1n-1)
μ= =-mộtΔt/Δxμ>0có nghĩa là một làn sóng đi về bên trái. Bây giờ nếu bạn nghĩ về nó, một làn sóng truyền sang bên trái, sẽ chỉ cần một điều kiện biên ở ranh giới bên phải vì tất cả các giá trị ở bên trái đang được cập nhật thông qua các hàng xóm bên phải của chúng. Trong thực tế, việc chỉ định bất kỳ giá trị nào ở ranh giới bên trái không phù hợp với bản chất của vấn đề. Trong một số phương thức nhất định, như gió ngược đơn giản, điều này được xử lý tự động vì lược đồ cũng chỉ liên quan đến các hàng xóm chính xác trong khuôn tô. Trong các phương pháp khác, như ếch nhảy, bạn phải chỉ định một số giá trị "chính xác".

Điều này thường được thực hiện thông qua phép ngoại suy từ miền bên trong để tìm giá trị còn thiếu. Đối với các vấn đề đa chiều và không chính tắc, điều này liên quan đến việc tìm tất cả các vectơ riêng của từ thông Jacobian để xác định phần nào của ranh giới thực sự cần điều kiện biên và phần nào cần ngoại suy.


Về mặt vật lý, việc sử dụng phương trình này với điều kiện biên ở bên trái và bên phải có nghĩa là gì?
Frank

5

Câu trả lời chung
Vấn đề của bạn là bạn không đặt (hoặc thậm chí chỉ định) các điều kiện biên ở tất cả - vấn đề số của bạn không được xác định rõ ràng.

Nói chung, có hai cách có thể để xác định các điều kiện biên:

  1. Đặt điều kiện biên bằng cách chỉ định và bên ngoài, ví dụ: thông qua giải pháp chính xác.bạn0bạn101
  2. Thay đổi stprint số để nó sẽ chỉ sử dụng thông tin nội thất ở ranh giới.

Con đường nào bạn đi nhiều phụ thuộc vào vật lý của vấn đề của bạn. Đối với các bài toán loại phương trình sóng, người ta thường xác định các giá trị riêng của từ thông Jacobian để quyết định xem có cần điều kiện biên bên ngoài hay không, hay sử dụng giải pháp bên trong (phương pháp này thường được gọi là 'upwinding').


Khắc phục nhanh
Trong sơ đồ của bạn, khuôn tô số cần các giá trị và để tính giá trị tại vị trí trong thời gian . Do đó, ở ranh giới miền bên trái (tức là ), nó sẽ cần giá trị của , mà bạn chưa đặt trong ví dụ mã của mình. Vấn đề tương tự phát sinh đối với , cần để xây dựng stprint.bạnTôi-1nbạnTôi+1nTôin+1Tôi= =1bạn0nbạn100n+1bạn101n

Một cách dễ dàng để di chuyển sẽ là đặt và theo cách thủ công ở mỗi bước thời gian, bằng cách nội suy tuyến tính từ giải pháp bên trong. Đây không thực sự là vật lý (vì nó không tính đến tốc độ sóng thực tế), nhưng trong trường hợp của bạn sẽ dẫn đến một hành vi giải pháp thỏa đáng đầu tiên.bạn1nbạn100n

Bạn có thể tìm thấy một phiên bản sửa đổi của mã nguồn của bạn dưới đây:

M = 100; N = 100;

mu = 0.5;

c = [mu 0 -mu];
f = @(x)(exp(-100*(x-0.5).^2));

u  = zeros (M, N);
x = 1/(M+1) * (1:M);

u(:,1) = f(x);
u(:,2) = f(x + mu/(M+1));

for i = 3:N
    hold off;
    %u(:,i) = conv(u(:,i-1),c,'same') + u(:,i-2);

    % Apply the numerical stencil to all interior points
    for j = 2:M-1
        u(j,i) = u(j,i-2) + mu*(u(j+1,i-1) - u(j-1,i-1));
    end

    % Set the boundary values by interpolating linearly from the interior
    u(1,i) = 2*u(2,i) - u(3,i);
    u(M,i) = 2*u(M-1,i) - u(M-2,i);

    plot(x, u(:,i));
    axis( [ 0 1 0 2] )
    drawnow;
end

Câu trả lời hay, và chào mừng bạn đến với scicomp, Sloede. Một câu hỏi, thông thường tôi thấy "upwinding" được định nghĩa là việc sử dụng khuôn tô một mặt trong đó thông tin được rút ra từ chỉ một ranh giới của miền. Bạn có nghĩa là để nói rằng trong phản ứng của bạn?
Aron Ahmadia

1
Vâng, thực sự. Xin lỗi, nếu câu trả lời của tôi không đủ rõ ràng. Tuy nhiên, nói chung, "upwinding" chỉ có nghĩa là bạn đưa hướng của luồng thông tin vào tài khoản. Điều đó không có nghĩa là bạn loại bỏ hoàn toàn một mặt của giải pháp, điều đó chỉ có nghĩa là bạn ưu tiên cho một phần của giải pháp nằm theo hướng "ngược gió".
Michael Schlottke-Lakemper

Nếu bạn tạo N = 1000và chạy mã lâu hơn một chút, bạn sẽ thấy rằng nó không hoạt động như mong đợi.
Simon Morris

Lý do cho điều này là giải pháp "khắc phục nhanh" của tôi không phải là âm thanh vật lý và trên hết là khá nhạy cảm với các dao động giả trong giải pháp. Không sử dụng điều này cho các tính toán khoa học thực tế!
Michael Schlottke-Lakemper

2

Vì vậy, tôi đã xem xét điều này chi tiết hơn và dường như điều này (ít nhất là trong các trường hợp cơ bản mà tôi đang xử lý) phụ thuộc vào vận tốc nhóm của phương pháp.

Phương pháp nhảy vọt (ví dụ) là:

bạnTôin+1= =bạnTôin-1+μ(bạnTôi+1n-bạnTôi-1n)

Thử các giải pháp có dạng chúng tôi thấy:bạnkn= =eTôi(ζkΔx+ω(ζ)nΔt)

e2TôiωΔt= =1+μeTôiωΔt(eTôiζΔx-e-TôiζΔx)

tội(ωΔt)= =μtội(ζΔx)

dωdζ= =cos(ζΔx)1-μ2STôin2(ζΔx)[-1,1]

Bây giờ chúng ta cần tìm ra vận tốc nhóm của các điều kiện biên:

Phương pháp của tôi :bạn1n+2= =bạn1n+μbạn2n+1

Chúng ta có thể tính vận tốc nhóm biên như sau:

2Tôitội(ωΔt)= =μeTôiζΔx

vì vậy để tìm một số vận tốc nhóm mà ranh giới cho phép chúng ta cần tìm:

ω= =cζ

cos(ζΔx)= =0,μtội(ζΔx)= =2tội(ζcΔt)

ζ= =π2Δx sẽ cung cấp cho mà giải pháp cho sẽ tồn tại. (Đối với hầu hết các lựa chọn của ít nhất)μ= =2tội(cμπ2)c[-1,1]μ


Giải pháp mà tôi đã tìm thấy trong tài liệu là lấy vì đây có số sóng biên nằm ngoài .bạn0n+1= =bạn1n[-1,1]

Tôi vẫn còn khá nhiều để đọc về điều này trước khi tôi hiểu nó hoàn toàn. Tôi nghĩ rằng những từ khóa tôi đang tìm kiếm là lý thuyết GKS.

Nguồn cho tất cả các ghi chú A Phần III này


Một tính toán rõ ràng hơn về những gì tôi đã làm có thể được tìm thấy ở đây: http://people.maths.ox.ac.uk/trefethen/publication/PDF/1983_7.pdf


-2

Tôi rất mới cho trang web này. Có lẽ đây không phải là nơi để hỏi, nhưng xin hãy tha thứ cho tôi vì tôi rất mới ở đây :) Tôi đang gặp một vấn đề cực kỳ giống nhau, sự khác biệt duy nhất là chức năng bắt đầu, trong trường hợp của tôi, là sóng cosin. Mã của tôi là thế này: xóa tất cả; clc; đóng tất cả;

M = 1000; N = 2100;

mu = 0,5;

c = [mu 0 -mu]; f = @ (x) 1- cos (20 * pi * x-0,025). ^ 2; u = số không (M, N); x = 0: (1 / M): 0,05; u (1: chiều dài (x), 1) = f (x); u (1: chiều dài (x), 2) = f (x - mu / (M)); x = không gian (0,1, M);

cho i = 3: N giữ;

% Apply the numerical stencil to all interior points
for j = 2:M-1
    u(j,i) = u(j,i-2) - mu*(u(j+1,i-1) - u(j-1,i-1));
end

% Set the boundary values by interpolating linearly from the interior
u(M,i) =  2*u(M-1,i-1) - u(M-2,i-1);

cốt truyện (x, u (:, i)); trục ([0 1,5 -0,5 2]) rút ra; % tạm dừng kết thúc

Đã có mã này ở đây, nhưng vì một số lý do, có lẽ liên quan đến làn sóng cosin, mã của tôi không thành công: / bất kỳ trợ giúp nào sẽ được đánh giá cao :) cảm ơn!


2
Chào mừng bạn đến với SciComp.SE! Bạn nên làm điều này một câu hỏi mới. (Câu trả lời chỉ dành cho câu trả lời thực tế.) , nó sẽ tự động liên kết câu hỏi với câu hỏi này. (Bạn cũng có thể bao gồm một liên kết đến câu hỏi này trong câu hỏi của bạn.)
Christian Clason
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.