Граничні умови рівняння адвекції дискретизуються методом кінцевих різниць


14

Я намагаюся знайти деякі ресурси, які допоможуть пояснити, як вибрати граничні умови при використанні методів кінцевих різниць для вирішення PDE.

Книги та записки, до яких я зараз маю доступ до всіх, говорять подібні речі:

Загальні правила, що регулюють стабільність за наявності меж, є надто складними для вступного тексту; їм потрібна складна математична техніка

(А. Ізерлес - перший курс з числового аналізу диференціальних рівнянь)

Наприклад, намагаючись реалізувати двоетапний високосний метод для рівняння адвекції:

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 дуже ретельна і правильна. Я просто хотів додати кілька балів, щоб полегшити розуміння.

В основному будь-яке рівняння хвилі має властиві швидкості та напрямку хвилі. Для одновимірного хвильового рівняння:

ut+aux=0
швидкість хвилі - це константа a яка визначає не тільки швидкість, з якою поширюється інформація в області, але і її напрямок. Якщо a>0 , інформація рухається зліва направо, а якщо , це навпаки.a<0

Для методу стрибкової жаби, коли ви дискретизуєте отримані рівняння: або: u n i =u n - 2 i +μ(u n - 1 i + 1 -u n - 1 i - 1 )деμ=-aΔt/Δx. У вашому випадкуμ>0

уiн-уiн-22Δт+ауi+1н-1-уi-1н-12Δх=0
уiн=уiн-2+мк(уi+1н-1-уi-1н-1)
мк=-аΔт/Δхмк>0що перекладається на хвилю, що йде ліворуч. Тепер, якщо ви подумаєте про це, хвилі, яка рухається ліворуч, знадобиться лише гранична умова на правій межі, оскільки всі значення ліворуч оновлюються через їхніх правих сусідів. Фактично вказівка ​​будь-якого значення на лівій межі не відповідає природі проблеми. У певних методах, як, наприклад, простий вітер, це вирішується автоматично, оскільки схема також включає лише трафіки сусідів у трафареті. В інших методах, як, наприклад, стрибка жаби, ви повинні вказати якесь "правильне" значення.

Зазвичай це робиться шляхом екстраполяції з внутрішнього домену для пошуку відсутнього значення. Для багатовимірних і неканонічних задач це передбачає пошук усіх власних векторів потоку якобіан, щоб визначити, які частини кордону насправді потребують граничних умов, а які частини потребують екстраполяції.


Фізично, що означало б використовувати це рівняння з граничною умовою на лівій і правій стороні?
Франк

5

Загальна відповідь
Ваша проблема полягає в тому, що ви взагалі не встановлюєте (або навіть вказуєте) граничні умови - ваша числова проблема неправильно визначена.

Як правило, існують два можливі способи визначення граничних умов:

  1. у0у101
  2. Змініть цифровий трафарет, щоб він використовував лише інформацію про інтер'єр на межі.

Яким шляхом ви йдете в значній мірі залежить від фізики вашої проблеми. Для задач типу хвильового рівняння зазвичай визначають власні значення потоку якобіан, щоб вирішити, чи потрібні умови зовнішніх кордонів, або чи слід застосовувати внутрішнє рішення (цей метод зазвичай називають "перемотуванням").



уi-1нуi+1нiн+1i=1у0ну100н+1у101н

у1ну100н

Ви можете знайти модифіковану версію вихідного коду нижче:

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. Одне питання, як правило, я вважаю, що "перемотування" визначається як використання одностороннього трафарету, коли інформація черпається лише з однієї межі домену. Ти це мав на увазі сказати у своїй відповіді?
Арон Ахмадія

1
Так, справді. Вибачте, якщо моя відповідь була недостатньо чіткою. Однак, як правило, "згортання" просто означає, що ви враховуєте напрямок потоку інформації. Це не означає, що ви повністю відкидаєте одну сторону рішення, це просто означає, що ви віддаєте перевагу тій частині рішення, яка лежить у напрямку "вітер".
Michael Schlottke-Lakemper

Якщо зробити N = 1000та запустити код трохи довше, ви виявите, що він не веде себе так, як очікувалося.
Саймон Морріс

Причиною цього є те, що моє рішення «швидкого виправлення» не є фізично надійним, а крім того, досить чутливим до помилкових коливань у розчині. Не використовуйте це для фактичних наукових обчислень!
Michael Schlottke-Lakemper

2

Тому я розглянув це дещо детальніше, і, здається, це (принаймні в основних випадках, якими я займаюся) залежить від групової швидкості методу.

Метод стрибка (наприклад):

уiн+1=уiн-1+мк(уi+1н-уi-1н)

укн=еi(ζкΔх+ω(ζ)нΔт)

е2iωΔт=1+мкеiωΔт(еiζΔх-е-iζΔх)

гріх(ωΔт)=мкгріх(ζΔх)

гωгζ=cos(ζΔх)1-мк2сiн2(ζΔх)[-1,1]

Тепер нам потрібно з'ясувати групову швидкість граничних умов:

у1н+2=у1н+мку2н+1

Ми можемо обчислити швидкість граничної групи наступним чином:

2iгріх(ωΔт)=мкеiζΔх

щоб знайти деякі групові швидкості, які дозволяють нам знайти кордони:

ω=cζ

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

Хлопці, я дуже новачок на цьому сайті. Можливо, це не місце просити, але, будь ласка, пробачте мене, тому що я тут дуже нова :) Я маю надзвичайно подібну проблему, різницею є лише пускова функція, яка в моєму випадку - косинусна хвиля. Мій код такий: очистити все; clc; закрити всіх;

M = 1000; N = 2100;

mu = 0,5;

c = [mu 0 -mu]; f = @ (x) 1- cos (20 * pi * x-0,025). ^ 2; u = нулі (M, N); х = 0: (1 / М): 0,05; u (1: довжина (x), 1) = f (x); u (1: довжина (x), 2) = f (x - mu / (M)); x = область простору (0,1, М);

для i = 3: N затримка;

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

сюжет (x, u (:, i)); вісь ([0 1,5 -0,5 2]) дроунов; % закінчення паузи

Тут вже є цей код, але чомусь, мабуть, пов’язаний з косинусоїдою, мій код не вдається: / будь-яка допомога буде вдячна :) дякую!


2
Welcome to SciComp.SE! You should make this a new question. (Answers are only meant for, well, actual answers.) If you use the "ask your own question link" at the bottom (it's dark yellow on light yellow, admittedly a bit hard to see if you don't know it's there), it'll automatically link the question to this one. (You can also include a link to this question in yours.)
Крістіан Класон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.