Próbuję znaleźć zasoby, które pomogą wyjaśnić, jak wybrać warunki brzegowe podczas korzystania z metod różnic skończonych do rozwiązywania PDE.
Książki i notatki, do których mam obecnie dostęp, mówią podobne rzeczy:
Ogólne zasady rządzące stabilnością w obecności granic są zdecydowanie zbyt skomplikowane, aby można było wprowadzić tekst wprowadzający; wymagają skomplikowanych mechanizmów matematycznych
(A. Iserles Pierwszy kurs numerycznej analizy równań różniczkowych)
Na przykład, próbując zaimplementować 2-etapową metodę skoku żab dla równania porady:
za pomocą 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
Rozwiązanie zachowuje się ładnie, dopóki nie osiągnie granicy, gdy nagle nagle zaczyna źle się zachowywać.
Gdzie mogę nauczyć się radzić sobie z takimi warunkami brzegowymi?
źródło
Ogólna odpowiedź
Twój problem polega na tym, że wcale nie ustawiasz (ani nawet nie określasz) warunków brzegowych - twój problem liczbowy jest źle zdefiniowany.
Zasadniczo istnieją dwa możliwe sposoby określenia warunków brzegowych:
To, w którą stronę idziesz, zależy w dużym stopniu od fizyki twojego problemu. W przypadku problemów typu równania falowego zwykle określa się wartości własne strumienia Jakobianu, aby zdecydować, czy potrzebne są zewnętrzne warunki brzegowe, czy też należy zastosować rozwiązanie wewnętrzne (ta metoda jest powszechnie nazywana „przewijaniem w górę”).
Poniżej znajdziesz zmodyfikowaną wersję swojego kodu źródłowego:
źródło
N = 1000
i uruchomisz kod nieco dłużej, okaże się, że nie działa on zgodnie z oczekiwaniami.Spojrzałem na to bardziej szczegółowo i wydaje się, że to (przynajmniej w podstawowych przypadkach, którymi się zajmuję) zależy od prędkości grupowej metody.
Metoda leapfrog (na przykład) to:
Teraz musimy dowiedzieć się, jaka jest prędkość grupowa warunków brzegowych:
Możemy obliczyć prędkość grupy granicznej w następujący sposób:
więc aby znaleźć pewne prędkości grupowe, na które pozwalają granice, musimy znaleźć:
Rozwiązaniem, które znalazłem w literaturze, jest podjęcieun + 10= un1 ponieważ ma on liczbę fal granicznych, która leży na zewnątrz [ - 1 , 1 ] .
Wciąż muszę przeczytać o tym więcej, zanim całkowicie to zrozumiem. Myślę, że kluczowymi słowami, których szukam, są teoria GKS.
Źródło wszystkich notatek A Iserles część III
Dokładniejsze obliczenia tego, co zrobiłem, można znaleźć tutaj: http://people.maths.ox.ac.uk/trefethen/publication/PDF/1983_7.pdf
źródło
Chłopaki, jestem bardzo nowy na tej stronie. Może nie jest to miejsce, o które warto zapytać, ale proszę wybacz mi, ponieważ jestem tu bardzo nowy :) Mam bardzo podobny problem, jedyną różnicą jest funkcja początkowa, która w moim przypadku jest falą cosinusową. Mój kod jest następujący: wyczyść wszystko; clc; zamknij wszystko;
M = 1000; N = 2100;
mu = 0,5;
c = [mu 0-im]; f = @ (x) 1-cos (20 * pi * x-0,025). ^ 2; u = zera (M, N); x = 0: (1 / M): 0,05; u (1: długość (x), 1) = f (x); u (1: długość (x), 2) = f (x - mu / (M)); x = przestrzeń linowa (0,1, M);
dla i = 3: N wstrzymanie;
wykres (x, u (:, i)); oś ([0 1,5 -0,5 2]) drawnow; % pauzy na końcu
Jest już ten kod, ale z jakiegoś powodu, prawdopodobnie związany z falą cosinusową, mój kod zawodzi: / każda pomoc byłaby mile widziana :) dzięki!
źródło