เงื่อนไขขอบเขตสำหรับสมการการพาความร้อนแยกด้วยวิธีผลต่างอันตะ


14

ฉันพยายามค้นหาแหล่งข้อมูลเพื่อช่วยอธิบายวิธีการเลือกเงื่อนไขขอบเขตเมื่อใช้วิธีการผลต่าง จำกัด เพื่อแก้ PDE

หนังสือและบันทึกที่ฉันมีอยู่ในปัจจุบันสามารถเข้าถึงทุกคนพูดในสิ่งที่คล้ายกัน:

กฎทั่วไปที่ควบคุมเสถียรภาพในการปรากฏตัวของเขตแดนนั้นซับซ้อนเกินไปสำหรับข้อความเกริ่นนำ; พวกเขาต้องการเครื่องจักรทางคณิตศาสตร์ที่ซับซ้อน

(A. Iserles เป็นสนามแรกในการวิเคราะห์เชิงตัวเลขของสมการเชิงอนุพันธ์)

ตัวอย่างเช่นเมื่อพยายามใช้วิธี leapfrog 2 ขั้นตอนสำหรับสมการการพา:

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

ใช้ 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

วิธีการแก้ปัญหาทำงานได้ดีจนกระทั่งถึงขอบเขตเมื่อจู่ ๆ ก็เริ่มประพฤติไม่ดี

ฉันจะเรียนรู้วิธีจัดการกับเงื่อนไขขอบเขตเช่นนี้ได้ที่ไหน

คำตอบ:


12

การตอบสนองของ Sloede นั้นละเอียดและถูกต้องมาก ฉันแค่ต้องการเพิ่มบางจุดเพื่อให้ง่ายต่อการเข้าใจ

โดยทั่วไปสมการคลื่นใด ๆ จะมีความเร็วและทิศทางคลื่นโดยธรรมชาติ สำหรับสมการคลื่นหนึ่งมิติ: ความเร็วคลื่นคงซึ่งกำหนดไม่เพียง แต่ความเร็วที่ข้อมูลจะถูกแพร่กระจายในโดเมน แต่ยังทิศทางของ หาก> 0ข้อมูลที่เกิดจากซ้ายไปขวาและถ้า< 0มันเป็นรอบวิธีอื่น ๆ

ut+aux=0
aa>0a<0

สำหรับวิธีการกระโดดกบเมื่อคุณแยกสมการที่คุณได้รับ: หรือ: U nฉัน =U n - 2ฉัน +μ(U n - 1 ฉัน+ 1 -ยู n - 1 ฉัน- 1 )ที่μ=-ΔT/Δx ในกรณีของคุณμ>0

uinuin22Δt+aui+1n1ui1n12Δx=0
uin=uin2+μ(ui+1n1ui1n1)
μ=aΔt/Δxμ>0ซึ่งแปลเป็นคลื่นที่ไปทางซ้าย ทีนี้ถ้าคุณคิดเกี่ยวกับมันคลื่นที่เคลื่อนที่ไปทางซ้ายจะต้องมีเงื่อนไขขอบเขตที่ขอบเขตด้านขวาเท่านั้นเนื่องจากค่าทั้งหมดทางด้านซ้ายกำลังได้รับการอัปเดตผ่านเพื่อนบ้านที่ถูกต้อง ในความเป็นจริงการระบุค่าใด ๆ ที่ขอบเขตซ้ายนั้นไม่สอดคล้องกับลักษณะของปัญหา ในวิธีการบางอย่างเช่นง่าย ๆ อยู่เหนือลมสิ่งนี้ได้รับการดูแลโดยอัตโนมัติเนื่องจากโครงร่างนี้เกี่ยวข้องกับเพื่อนบ้านที่ถูกต้องในลายฉลุ ในวิธีอื่นเช่นกบกระโดดคุณต้องระบุค่า "ถูกต้อง" บางอย่าง

ซึ่งมักจะทำผ่านการคาดการณ์จากโดเมนภายในเพื่อค้นหาค่าที่หายไป สำหรับปัญหาที่มีหลายมิติและไม่ใช่ที่ยอมรับซึ่งเกี่ยวข้องกับการหาเวกเตอร์ eigen ทั้งหมดของฟลักซ์จาโคเบียนเพื่อกำหนดว่าส่วนใดของขอบเขตที่ต้องการเงื่อนไขขอบเขตจริงและส่วนใดต้องการการอนุมาน


ในทางกายภาพการใช้สมการนี้กับเงื่อนไขขอบเขตทางด้านซ้ายและขวาหมายความว่าอย่างไร
Frank

5

คำตอบทั่วไป
ปัญหาของคุณคือคุณไม่ได้ตั้งค่า (หรือระบุ) เงื่อนไขขอบเขตเลย - ปัญหาเชิงตัวเลขของคุณไม่ชัดเจน

โดยทั่วไปมีสองวิธีที่เป็นไปได้ในการระบุเงื่อนไขขอบเขต:

  1. u0u101
  2. เปลี่ยนลายฉลุตัวเลขเพื่อที่จะใช้เฉพาะข้อมูลการตกแต่งภายในที่ขอบเขต

วิธีการที่คุณไปหนักขึ้นอยู่กับฟิสิกส์ของปัญหาของคุณ สำหรับปัญหาประเภทคลื่น - สมการหนึ่งมักจะกำหนดค่าลักษณะเฉพาะของฟลักซ์จาโคเบียนเพื่อตัดสินว่าเงื่อนไขขอบเขตภายนอกนั้นจำเป็นหรือไม่หรือต้องใช้วิธีแก้ปัญหาภายใน (วิธีนี้เรียกกันโดยทั่วไปว่า



ui1nui+1nin+1i=1u0nu100n+1u101n

u1nu100n

คุณสามารถค้นหาซอร์สโค้ดของคุณที่แก้ไขด้านล่าง:

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

คำตอบที่ดีและยินดีที่จะ scicomp, Sloede หนึ่งคำถามโดยปกติฉันเห็น "upwinding" ถูกกำหนดให้ใช้ stencil ด้านเดียวที่ดึงข้อมูลจากขอบเขตเดียวของโดเมน คุณหมายถึงพูดอย่างนั้นหรือเปล่า?
Aron Ahmadia

1
ใช่แน่นอน. ขออภัยถ้าคำตอบของฉันไม่ชัดเจนเพียงพอ อย่างไรก็ตามโดยทั่วไป "การย้อนกลับ" หมายความว่าคุณคำนึงถึงทิศทางการไหลของข้อมูล ไม่จำเป็นต้องหมายความว่าคุณทิ้งโซลูชันด้านใดด้านหนึ่งโดยสิ้นเชิง แต่เพียงหมายความว่าคุณให้ความพึงพอใจกับส่วนของโซลูชันที่อยู่ในทิศทาง "เหนือลม"
Michael Schlottke-Lakemper

หากคุณทำN = 1000และเรียกใช้รหัสอีกเล็กน้อยคุณจะพบว่ามันไม่ได้ทำงานตามที่คาดไว้
Simon Morris

สาเหตุของเรื่องนี้ก็คือโซลูชัน "แก้ไขด่วน" ของฉันไม่ได้มีคุณสมบัติทางเสียงและเหนือสิ่งอื่นใดที่ค่อนข้างอ่อนไหวต่อการแกว่งไปมาในวิธีแก้ปัญหา อย่าใช้สิ่งนี้ในการคำนวณทางวิทยาศาสตร์จริง ๆ !
Michael Schlottke-Lakemper

2

ดังนั้นฉันจึงดูที่รายละเอียดเพิ่มเติมและดูเหมือนว่า (อย่างน้อยในกรณีพื้นฐานที่ฉันจัดการ) ขึ้นอยู่กับความเร็วกลุ่มของวิธีการ

วิธีการเล่นต้องเต (ตัวอย่าง) คือ:

ยูผมn+1=ยูผมn-1+μ(ยูผม+1n-ยูผม-1n)

ลองวิธีแก้ปัญหาของแบบฟอร์ม ยูkn=อีผม(ζkΔx+ω(ζ)nΔเสื้อ) เราพบ:

อี2ผมωΔเสื้อ=1+μอีผมωΔเสื้อ(อีผมζΔx-อี-ผมζΔx)

บาป(ωΔเสื้อ)=μบาป(ζΔx)

dωdζ=cos(ζΔx)1-μ2sผมn2(ζΔx)[-1,1]

ตอนนี้เราต้องค้นหาความเร็วกลุ่มของเงื่อนไขขอบเขต:

วิธีการของฉัน :ยู1n+2=ยู1n+μยู2n+1

เราสามารถคำนวณความเร็วของกลุ่มขอบเขตดังต่อไปนี้:

2ผมบาป(ωΔเสื้อ)=μอีผมζΔx

ดังนั้นเพื่อค้นหาความเร็วของกลุ่มที่ขอบเขตอนุญาตให้เราต้องค้นหา:

ω=ζ

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

ζ=π2Δx would give μ=2sin(cμπ2) for which a solution for c[1,1] will exist. (For most choices of μ at least)


The solution which I've found in the literature is to take u0n+1=u1n since this has a boundary wave number which lies outside [1,1].

I've still quite quite a bit more to read up about this before I understand it completely. I think the key words I'm looking for are GKS theory.

Source for all this A Iserles Part III notes


A clearer calculation of what I've done can be found here: http://people.maths.ox.ac.uk/trefethen/publication/PDF/1983_7.pdf


-2

Guys I am very new to this site. Maybe this isn't the place to ask, but please forgive me as I am very new here :) I am having an extremely similar problem, the only difference being the starting function which, in my case, is a cosine wave. My code is this: clear all; clc; close all;

M = 1000; N = 2100;

mu = 0.5;

c = [mu 0 -mu]; f = @(x)1- cos(20*pi*x-0.025).^2; u = zeros (M, N); x=0:(1/M):0.05; u(1:length(x),1) = f(x); u(1:length(x),2) = f(x - mu/(M)); x=linspace(0,1,M);

for i = 3:N hold off;

% 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);

plot(x, u(:,i)); axis( [ 0 1.5 -0.5 2] ) drawnow; %pause end

มีรหัสนี้อยู่แล้วที่นี่ แต่ด้วยเหตุผลบางอย่างอาจเกี่ยวข้องกับคลื่นโคไซน์รหัสของฉันล้มเหลว: / ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม :) ขอบคุณ!


2
ยินดีต้อนรับสู่ SciComp.SE! คุณควรทำให้เป็นคำถามใหม่ (คำตอบนั้นมีไว้สำหรับคำตอบที่แท้จริงเท่านั้น) หากคุณใช้ "ถามลิงค์คำถามของคุณเอง" ที่ด้านล่าง (เป็นสีเหลืองเข้มบนสีเหลืองอ่อนยอมรับว่าเป็นเรื่องยากที่จะดูว่าคุณไม่รู้หรือไม่) มันจะเชื่อมโยงคำถามกับคำถามนี้โดยอัตโนมัติ (คุณสามารถรวมลิงค์ไปยังคำถามนี้ในของคุณได้ด้วย)
Christian Clason
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.