用有限差分法离散对流方程的边界条件


14

我试图找到一些资源来帮助解释在使用有限差分法求解PDE时如何选择边界条件。

我目前可以使用的所有书籍和笔记都说类似的话:

对于介绍性文本而言,在存在边界的情况下管理稳定性的一般规则过于复杂。他们需要复杂的数学机制

(A. Iserles微分方程数值分析的第一门课程)

例如,当尝试为平流方程实施两步越级方法时:

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

该解决方案表现良好,直到到达边界为止,这时它突然开始表现不佳。

在哪里可以学习如何处理这样的边界条件?

Answers:


12

Sloede的回应非常彻底和正确。我只是想添加一些要点,以使其更容易掌握。

基本上,任何波动方程都有固有的波动速度和方向。对于一维波动方程: 的波速度是恒定一个,其确定不仅在将信息域中传播速度也是其方向。如果> 0,信息是从左至右,如果一个< 0它周围的其他方法。

ut+aux=0
aa>0a<0

对于跳蛙法,当您离散方程式时,您会得到: 或: ü ñ =û ñ - 2 +μÜ ñ - 1 + 1 -Ü ñ - 1 - 1其中μ=-一个Δ/ΔX。在您的情况下,μ>0

uinuin22Δt+aui+1n1ui1n12Δx=0
uin=uin2+μ(ui+1n1ui1n1)
μ=aΔt/Δxμ>0转换为向左移动的波浪。现在,考虑一下,向左传播的波只需要在右边界处有边界条件,因为向左的所有值都通过它们的右邻域进行更新。实际上,在左边界处指定任何值都与问题的性质不一致。在某些方法中,例如简单的迎风,这是自动进行的,因为该方案还仅在模板中包含正确的邻居。在其他方法中,例如“跳蛙”,您必须指定一些“正确”的值。

这通常是通过从内部域外推来找到缺失值来完成的。对于多维和非规范问题,这涉及找到通量雅可比行列的所有特征向量,以确定边界的哪些部分实际上需要边界条件,哪些部分需要外推。


在物理上,在左侧和右侧的边界条件下使用此方程式意味着什么?
弗兰克(Frank)

5

常规答案
您的问题是根本没有设置(甚至指定)边界条件-您的数字问题定义不明确。

通常,有两种方法可以指定边界条件:

  1. ü0u101
  2. 更改数字模具,使其仅在边界处使用内部信息。

到底走哪条路取决于问题的物理性质。对于波动方程式问题,通常确定通量雅可比矩阵的特征值,以便确定是否需要外部边界条件,或者是否要使用内部解法(此方法通常称为“迎风”)。



ui1nui+1niñ+1个一世=1个u0nu100n+1u101n

u1nu100ñ

您可以在下面找到源代码的修改版本:

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。一个问题,通常我将“逆向”定义为使用单侧模板,其中仅从域的一个边界提取信息。您的意思是在回复中说吗?
Aron Ahmadia 2012年

1
确实是的。抱歉,如果我的答案不够清楚。但是,通常来说,“逆风”只是意味着您要考虑信息流的方向。这并不一定意味着您完全放弃了解决方案的一侧,而只是意味着您优先考虑解决方案中位于“逆风”方向上的部分。
Michael Schlottke-Lakemper 2012年

如果使N = 1000代码运行更长的时间,您会发现它的行为与预期不符。
西蒙·莫里斯

原因是我的“快速修复”解决方案在物理上并不健全,而且最重要的是对解决方案中的虚假振荡很敏感。请勿将其用于实际的科学计算!
Michael Schlottke-Lakemper 2012年

2

因此,我已经对此进行了更详细的研究,似乎这(至少在我正在处理的基本情况下)取决于方法的组速度。

跳过方法(例如)为:

ü一世ñ+1个=ü一世ñ-1个+μü一世+1个ñ-ü一世-1个ñ

尝试形式的解决方案 üķñ=Ë一世ζķΔX+ωζñΔŤ 我们发现:

Ë2一世ωΔŤ=1个+μË一世ωΔŤË一世ζΔX-Ë-一世ζΔX

ωΔŤ=μζΔX

dωdζ=cosζΔX1个-μ2s一世ñ2ζΔX[-1个1个]

现在我们需要找出边界条件的群速度:

我的方法ü1个ñ+2=ü1个ñ+μü2ñ+1个

我们可以如下计算边界群速度:

2一世ωΔŤ=μË一世ζΔX

因此要找到边界允许的某些群速度,我们需要找到:

ω=Cζ

cosζΔX=0μζΔX=2ζCΔŤ

ζ=π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 因为它的边界波数在外面 [-1个1个]

在我完全理解之前,我还有很多要阅读的内容。我认为我要寻找的关键词是GKS理论。

所有这些源于Iserles第三部分注释


有关我所做工作的更清晰的计算,可以在这里找到:http : //people.maths.ox.ac.uk/trefethen/publication/PDF/1983_7.pdf


-2

伙计们,我是这个网站的新手。也许这不是要问的地方,但是请原谅我,因为我在这里很新:)我有一个非常相似的问题,唯一的区别是启动函数,在我的情况下是余弦波。我的代码是这样的:全部清除;clc; 关闭所有;

M = 1000;N = 2100;

mu = 0.5;

c = [μ0-μ];f = @(x)1- cos(20 * pi * x-0.025)。^ 2; u =零(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);

因为我= 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);

plot(x,u(:,i)); 轴([0 1.5 -0.5 2])拉伸; %暂停结束

这里已经有此代码,但是由于某种原因,可能与余弦波有关,我的代码失败了://任何帮助将不胜感激:)谢谢!


2
欢迎来到SciComp.SE!您应该提出一个新问题。(答案仅是为了提供实际答案。)如果您在底部使用“问自己的问题链接”(深黄色到浅黄色,诚然有点很难看,如果您不知道它在那里) ,它将自动将问题链接到此问题。(您也可以在您的问题中包含指向该问题的链接。)
Christian Clason
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.