Граничные условия для уравнения переноса, дискретизированного методом конечных разностей

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

Ответ Слоеда очень тщательный и правильный. Я просто хотел добавить несколько моментов, чтобы было легче понять.

По сути, любое волновое уравнение имеет собственную скорость и направление волны. Для одномерного волнового уравнения: скорость волны - это постоянная a, которая определяет не только скорость, с которой информация распространяется в области, но и ее направление. Если a > 0 , информация идет слева направо, а если a < 0, это наоборот.

ut+aux=0
aa>0a<0

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

uinuin22Δt+aui+1n1ui1n12Δx=0
uin=uin2+μ(ui+1n1ui1n1)
μ=aΔt/Δxμ>0что переводится как волна, идущая влево. Теперь, если вы подумаете об этом, для волны, которая движется влево, понадобится только граничное условие на правой границе, поскольку все значения слева обновляются через своих правых соседей. Фактически, указание любого значения на левой границе не согласуется с природой проблемы. В некоторых методах, например при простом ветре, об этом заботятся автоматически, поскольку в схеме также используются только правильные соседи. В других методах, таких как скачкообразная лягушка, вы должны указать «правильное» значение.

Обычно это делается путем экстраполяции из внутреннего домена, чтобы найти пропущенное значение. Для многомерных и неканонических задач это включает в себя поиск всех собственных векторов потока якобиана, чтобы определить, какие части границы действительно нуждаются в граничных условиях, а какие - экстраполяции.

GradGuy
источник
Физически, что бы это значило, если использовать это уравнение с граничным условием слева и справа?
Фрэнк
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, Слод. Один вопрос, как правило, я вижу «раскручивание», определяемое как использование одностороннего трафарета, когда информация берется только от одной границы домена. Вы хотели сказать это в своем ответе?
Арон Ахмадиа
1
Да, в самом деле. Извините, если мой ответ был недостаточно четким. Однако, как правило, «раскрутка» означает, что вы учитываете направление потока информации. Это не означает, что вы полностью отбрасываете одну сторону решения, это просто означает, что вы отдаете предпочтение той части решения, которая находится в направлении «против ветра».
Майкл Шлотке-Лейкмпер
Если вы сделаете N = 1000и запустите код немного дольше, вы обнаружите, что он работает не совсем так, как ожидалось.
Саймон Моррис
Причина этого заключается в том, что мое решение «быстрого исправления» не является физически надежным, и, кроме того, оно довольно чувствительно к паразитным колебаниям в решении. Не используйте это для реальных научных расчетов!
Майкл Шлотке-Лейкмпер
2

Итак, я рассмотрел это более подробно, и кажется, что это (по крайней мере, в основных случаях, с которыми я работаю) зависит от групповой скорости метода.

Метод чехарды (например):

UяN+1знак равноUяN-1+μ(Uя+1N-Uя-1N)

UКNзнак равноея(ζКΔИкс+ω(ζ)NΔT)

е2яωΔTзнак равно1+μеяωΔT(еяζΔИкс-е-яζΔИкс)

грех(ωΔT)знак равноμгрех(ζΔИкс)

dωdζзнак равносоз(ζΔИкс)1-μ2sяN2(ζΔИкс)[-1,1]

Теперь нам нужно выяснить групповую скорость граничных условий:

Мой метод :U1N+2знак равноU1N+μU2N+1

Мы можем вычислить граничную групповую скорость следующим образом:

2ягрех(ωΔT)знак равноμеяζΔИкс

поэтому, чтобы найти некоторые групповые скорости, которые позволяют границы, нам нужно найти:

ωзнак равносζ

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

Simon Morris
источник
-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

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!

Джон
источник
2
Добро пожаловать в SciComp.SE! Вы должны сделать это новым вопросом. (Ответы предназначены только для реальных ответов.) Если вы используете ссылку «задать свой вопрос» внизу (она темно-желтая на светло-желтом, правда, немного трудно увидеть, если вы не знаете, что это там) , он автоматически свяжет вопрос с этим. (Вы также можете включить ссылку на этот вопрос в свой.)
Кристиан