Я пытаюсь найти некоторые ресурсы, которые помогут объяснить, как выбирать граничные условия при использовании методов конечных разностей для решения PDE.
Книги и заметки, к которым у меня сейчас есть доступ, говорят о похожих вещах:
Общие правила, регулирующие стабильность при наличии границ, слишком сложны для вводного текста; они требуют сложных математических механизмов
(А. Изерлес. Первый курс по численному анализу дифференциальных уравнений)
Например, при попытке реализовать двухэтапный метод чехарды для уравнения адвекции:
используя 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
Решение ведет себя хорошо, пока не достигнет границы, когда оно внезапно начинает вести себя плохо.
Где я могу узнать, как обрабатывать граничные условия, как это?
источник
Общий ответ
Ваша проблема в том, что вы вообще не устанавливаете (или даже не указываете) граничные условия - ваша численная задача плохо определена.
Как правило, существует два возможных способа задания граничных условий:
Какой путь вы выберете, зависит от физики вашей проблемы. Для задач типа волнового уравнения обычно определяют собственные значения потока Якобиана, чтобы решить, нужны ли внешние граничные условия, или следует использовать внутреннее решение (этот метод обычно называют «намоткой»).
Вы можете найти измененную версию вашего исходного кода ниже:
источник
N = 1000
и запустите код немного дольше, вы обнаружите, что он работает не совсем так, как ожидалось.Итак, я рассмотрел это более подробно, и кажется, что это (по крайней мере, в основных случаях, с которыми я работаю) зависит от групповой скорости метода.
Метод чехарды (например):
Теперь нам нужно выяснить групповую скорость граничных условий:
Мой метод :Un + 21= тыN1+ μ un + 12
Мы можем вычислить граничную групповую скорость следующим образом:
поэтому, чтобы найти некоторые групповые скорости, которые позволяют границы, нам нужно найти:
The solution which I've found in the literature is to takeun+10=un1 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
источник
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;
plot(x, u(:,i)); axis( [ 0 1.5 -0.5 2] ) drawnow; %pause end
There is already this code here, but for some reason, probably related to the cosine wave, my code fails :/ any help would be appreciated :) thanks!
источник