Sonlu farklar yöntemi ile ayrıştırılan adveksiyon denklemi için sınır koşulları


14

PDE'leri çözmek için sonlu fark yöntemleri kullanırken sınır koşullarının nasıl seçileceğini açıklamaya yardımcı olacak bazı kaynaklar bulmaya çalışıyorum.

Şu anda hepsine erişebildiğim kitaplar ve notlar benzer şeyler söylüyor:

Sınırların varlığında istikrarı düzenleyen genel kurallar bir giriş metni için çok karmaşıktır; sofistike matematiksel makineler gerektirirler

(A. Iserles Diferansiyel Denklemlerin Sayısal Analizinde İlk Ders)

Örneğin, adveksiyon denklemi için 2 aşamalı birdirbir yöntemini uygulamaya çalışırken:

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

MATLAB kullanma

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

Çözelti, aniden kötü davranmaya başladığında sınıra ulaşıncaya kadar güzel davranır.

Bunun gibi sınır koşullarının nasıl ele alınacağını nereden öğrenebilirim?

Yanıtlar:


12

Sloede'nın yanıtı çok kapsamlı ve doğrudur. Daha kolay kavramak için birkaç nokta eklemek istedim.

ut+aux=0
aa>0a<0

uinuin22Δt+aui+1n1ui1n12Δx=0
uin=uin2+μ(ui+1n1ui1n1)
μ=aΔt/Δxμ>0sola doğru giden bir dalga anlamına gelir. Şimdi düşünürseniz, sola doğru giden bir dalganın sadece sağ sınırda bir sınır koşulu gerekir, çünkü soldaki tüm değerler sağ komşuları üzerinden güncellenir. Aslında sol sınırda herhangi bir değer belirtmek sorunun niteliği ile tutarsızdır. Basit rüzgâr gibi bazı yöntemlerde, şema otomatik olarak şablonunda sadece doğru komşuları içerdiğinden bu otomatik olarak halledilir. Sıçrama kurbağası gibi diğer yöntemlerde, bir miktar "doğru" değer belirtmeniz gerekir.

Bu genellikle eksik değeri bulmak için iç etki alanından ekstrapolasyon yoluyla yapılır. Çok boyutlu ve kanonik olmayan problemler için, sınırın hangi kısımlarının gerçekten sınır koşullarına ihtiyaç duyduğunu ve hangi kısımların ekstrapolasyon gerektirdiğini belirlemek için Jacobian akısının tüm öz vektörlerini bulmayı içerir.


Fiziksel olarak, bu denklemi sol ve sağ tarafta bir sınır koşulu ile kullanmak ne anlama gelir?
Frank

5

Genel cevap
Sorununuz, sınır koşullarını hiç belirlememeniz (hatta belirtmemeniz) - sayısal sorununuz yanlış tanımlanmış.

Genel olarak, sınır koşullarını belirtmenin iki olası yolu vardır:

  1. u0u101
  2. Sayısal şablonu değiştirerek sınırda yalnızca iç bilgileri kullanmasını sağlayın.

Hangi yöne gittiğiniz probleminizin fiziğine bağlıdır. Dalga denklemi tipi problemler için dış sınır koşullarının gerekip gerekmediğine veya iç çözümün kullanılıp kullanılmayacağına karar vermek için genellikle Jacobian akısının özdeğerlerini belirler.



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

u1nu100n

Kaynak kodunuzun değiştirilmiş bir sürümünü aşağıda bulabilirsiniz:

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

Güzel cevap ve scicomp'a hoş geldiniz, Sloede. Bir soru, normalde "upwinding" ifadesini alanın yalnızca bir sınırından çizildiği tek taraflı bir şablonun kullanımı olarak tanımlanmış olarak görüyorum. Bunu cevabınızda mı demek istediniz?
Aron Ahmadia

1
Evet kesinlikle. Üzgünüm, cevabım yeterince açık değilse. Bununla birlikte, genel olarak, "yukarı sarmak" sadece bilgi akışının yönünü dikkate aldığınız anlamına gelir. Bu, çözümün bir tarafını tamamen attığınız anlamına gelmez, sadece çözümün "rüzgar" yönünde yer alan bir tercihi verdiğiniz anlamına gelir.
Michael Schlottke-Lakemper

N = 1000Kodu biraz daha uzun yapar ve çalıştırırsanız, beklendiği gibi davranmadığını görürsünüz.
Simon Morris

Bunun nedeni, "hızlı düzeltme" çözümümün fiziksel olarak sağlam olmaması ve bunun üstündeki çözümdeki sahte salınımlara karşı oldukça hassas olmasıdır. Bunu gerçek bilimsel hesaplamalar için kullanmayın!
Michael Schlottke-Lakemper

2

Bu yüzden biraz daha ayrıntılı olarak baktım ve bu (en azından ele aldığım temel durumlarda) yöntemin grup hızına bağlı gibi görünüyor.

Birdirbir yöntemi (örneğin):

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

ukn=ei(ζkΔx+ω(ζ)nΔt)

e2iωΔt=1+μeiωΔt(eiζΔxeiζΔx)

sin(ωΔt)=μsin(ζΔx)

dωdζ=cos(ζΔx)1μ2sin2(ζΔx)[1,1]

Şimdi sınır koşullarının grup hızını bulmamız gerekiyor:

u1n+2=u1n+μu2n+1

Sınır grubu hızını aşağıdaki gibi hesaplayabiliriz:

2isin(ωΔt)=μeiζΔx

sınırların izin verdiği bazı grup hızlarını bulmak için şunları bulmamız gerekir:

ω=cζ

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

ζ=π2Δxμ=2sin(cμπ2)c[1,1]μ


u0n+1=u1n[1,1]

Tamamen anlamadan önce bu konuyla ilgili daha fazla okumak için hala biraz daha var. Bence aradığım anahtar kelimeler GKS teorisi.

Tüm bu Is Isles Part III notları için kaynak


Yaptığım şeylerin daha net bir hesaplamasını burada bulabilirsiniz: http://people.maths.ox.ac.uk/trefethen/publication/PDF/1983_7.pdf


-2

Arkadaşlar Bu sitede çok yeniyim. Belki burası soracak bir yer değil, ama lütfen burada çok yeni olduğum için beni affet :) Son derece benzer bir sorun yaşıyorum, tek fark benim durumumda bir kosinüs dalgası olan başlangıç ​​işlevi. Kodum şudur: tümünü temizle; CLC; hepsini kapat;

M = 1000; N = 2100;

mu = 0.5;

c = u-mu]; f = @ (x) 1- cos (20 * pi * x-0.025). ^ 2; u = sıfırlar (M, N); x = 0 olduğu: (1 / M): 0.05; u (1: uzunluk (x), 1) = f (x); u (1: uzunluk (x), 2) = f (x-mu / (M)); X = linspace (0,1 M);

i = 3 için: N basılı tutun;

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

çizim (x, u (:, i)); eksen ([0 1.5 -0.5 2]) çizilmiş; % duraklatma sonu

Burada zaten bu kod var, ama bir nedenden dolayı, muhtemelen kosinüs dalgası ile ilgili, benim kodum başarısız: / herhangi bir yardım mutluluk duyacağız :) teşekkürler!


2
SciComp.SE'ye hoş geldiniz! Bunu yeni bir soru yapmalısın. (Cevaplar yalnızca gerçek cevaplar içindir.) En altta "kendi soru sorma bağlantısını" kullanırsanız (açık sarı üzerinde koyu sarı, kuşkusuz orada olduğunu bilmiyorsanız görmek biraz zor) , soruyu otomatik olarak bu soruyla ilişkilendirir. (Bu soruna bir bağlantı da ekleyebilirsiniz.)
Christian Clason
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.