] 0,1 []中热方程的周期边界条件


13

让我们考虑一个平滑的初始条件和热方程在一个维度: 在开区间] 0 1 [,让我们假设我们想要与有限差分数值求解。

tu=xxu
]0,1[

我知道,要使我的问题很好地解决,我需要赋予它x = 1的边界条件。我知道Dirichlet或Neumann都能很好地工作。x=0x=1

如果我在第一种情况下有内部点x k = kN表示k=1N,则我有N个未知数:uk=uxk表示k=1N,因为u是在边界处规定的。xk=kN+1k=1,,NNuk=u(xk)k=1,,Nu

在第二种情况下真有未知数ü 0ù Ñ + 1,我知道如何使用(均相)诺伊曼BC在边界来离散拉普拉斯,例如具有两个虚构点的红利x 1x N + 2以及等式N+2u0,,uN+1x1xN+2

u1u12h=0=uN+2uN2h

我的问题是关于定期公元前。我觉得我可以使用一个方程,即 ,但也许两年,然后我会用 X ü 0 = X ù 1

u(0)=u(1)
xu(0)=xu(1)

但我不确定。我也不知道我应该有多少个未知数。难道N+1


您有Dirichlet或Neumann边界条件吗?鬼单元的数量取决于您Neumann边界条件的近似顺序。
ilciavo 2015年

@ilciavo,问题是关于周期性边界条件的。
比尔·巴特

Answers:


8

最好的方法是(如您所说)仅使用周期性边界条件的定义,并从一开始就使用的事实正确地建立方程式。实际上,更强烈的是,u(0)=u(1)周期性边界条件标识x = 1x=0x=1。出于这个原因,您在解决方案域中应该只包含以下几点之一。使用周期性边界条件时,开放间隔没有意义,因为没有边界

这个事实意味着您不应该在处放置点,因为它与x = 0相同。离散化N + 1个点,然后使用以下事实:根据定义,x 0左侧的点x Nx 0右侧的点x=1x=0N+1x0 xN x 0xN x0

周期性网格的示意图

然后可以将您的PDE在空间中离散为

t[x0x1xN]=1Δx2[xN2x0+x1x02x1+x2xN12xN+x0]

可以用矩阵形式写成 ,其中 =[ - 2 1 0 0 1 1 - 2 1 0 0

tx=1Δx2Ax
A=[21001121000012110012].

当然,不需要实际创建或存储此矩阵。有限的差异应即时计算,并注意根据需要特别处理第一个和最后一个点。

tu=xxu+b(t,x)
x[1,1)uRef(t,x)=exp(t)cos(5πx)b(t,x)=(25π21)exp(t)cos(5πx)
clear

% Solve: u_t = u_xx + b
% with periodic boundary conditions

% analytical solution:
uRef = @(t,x) exp(-t)*cos(5*pi*x);
b = @(t,x) (25*pi^2-1)*exp(-t)*cos(5*pi*x);

% grid
N = 30;
x(:,1) = linspace(-1,1,N+1);

% leave off 1 point so initial condition is periodic
% (doesn't have a duplicate point)
x(end) = [];
uWithMatrix = uRef(0,x);
uNoMatrix = uRef(0,x);

dx = diff(x(1:2));
dt = dx.^2/2;

%Iteration matrix:
e = ones(N,1);
A = spdiags([e -2*e e], -1:1, N, N);
A(N,1) = 1;
A(1,N) = 1;
A = A/dx^2;

%indices (left, center, right) for second order centered difference
iLeft = [numel(x), 1:numel(x)-1]';
iCenter = (1:numel(x))';
iRight = [2:numel(x), 1]';

%plot
figure(1)
clf
hold on
h0=plot(x,uRef(0,x),'k--','linewidth',2);
h1=plot(x,uWithMatrix);
h2=plot(x,uNoMatrix,'o');
ylim([-1.2, 1.2])
legend('Analytical solution','Matrix solution','Matrix-free solution')
ht = title(sprintf('Time t = %0.2f',0));
xlabel('x')
ylabel('u')
drawnow

for t = 0:dt:1
    uWithMatrix = uWithMatrix + dt*( A*uWithMatrix + b(t,x) );
    uNoMatrix = uNoMatrix + dt*(  ( uNoMatrix(iLeft) ...
                                - 2*uNoMatrix(iCenter) ...
                                  + uNoMatrix(iRight) )/dx^2 ...
                                + b(t,x) );
    set(h0,'ydata',uRef(t,x))
    set(h1,'ydata',uWithMatrix)
    set(h2,'ydata',uNoMatrix)
    set(ht,'String',sprintf('Time t = %0.2f',t))
    drawnow
end

初始条件图

t = 0.5时的溶液图

t = 1.0时的溶液图

t = 2.0时的溶液图


1
简便的解决方案!!万一有人在这里需要Python的实现
ilciavo 2015年

x

@ bela83您是正确的,除了初始条件外,无需指定其他任何内容。这样做将导致系统超额确定。您需要做的就是在间隔的终点附近稍加注意,以确保您正确地定期包裹东西。有许多有效的方法可以做到这一点。
Doug Lipinski 2015年

-1

根据这个你应该施加周期性边界条件为:

u(0,t)=u(1,t)ux(0,t)=ux(1,t)

使用反向欧拉隐式离散热方程的一种方法是

un+1unΔt=ui+1n+12uin+1+ui+1n+1Δx2

解方程组

[IΔtΔx2A][u1n+1u1n+1uNn+1]=[u1nu2nuNn]

A=[210000121000012100001210000120000012]

u0uN+1

u1uN=0u2u02ΔxuN+1uN12Δx=0

根据2.11节LeVeque,您可以得到二阶精度。ux

[0100010101010100000IΔtΔx2A0000000][u0n+1u1n+1u2n+1uNn+1uN+1n+1]=[00u1nu2nuNn]

这将为您提供N + 2个方程式和N + 2个未知数。

您还可以摆脱第一个进入方程式和幻像元的系统,然后得出一个由N个方程式和N个未知数组成的系统。


u1uNuN]0,1[xk=kN+1xN=NN+1

Nu0uN1u1uNu1uNu0uN+1

u0=uN+1N+1

uxu(0,t)=u(1,t)ux(0,t)=ux(1,t)

1
u1 = uN给您的系统增加了一个额外的限制(等式u1-uN = 0)
ilciavo 2015年
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.