] 0,1 [의 열 방정식에 대한 주기적 경계 조건


13

첫 번째 차원에서 부드러운 초기 조건과 열 방정식을 고려해 봅시다 : 열린 간격 , 유한 한 차이로 수치 적으로 풀고 싶다고 가정 해 봅시다.

∂티유=∂엑스엑스유
]0,1[

내 문제가 잘 드러나기 위해서는 과 경계 조건을 부여해야한다는 것을 알고 있습니다 . Dirichlet 또는 Neumann이 잘 작동한다는 것을 알고 있습니다.엑스=0엑스=1

첫 번째 경우 에 대해 내부 포인트 이 있으면 미지수를 갖습니다 . for 가 경계에 규정되어 있기 때문에엔엑스케이=케이엔+1케이=1,⋯,엔엔유케이=유(엑스케이)케이=1,⋯,엔유

두 번째 경우에는 실제로 미지수 있으며 (균질 한) Neumann BC를 사용하여 국경에서 하는 방법을 알고 있습니다. 허점 및 와 평등 :U 0 , ⋯ , U N + 1 X - 1 X N + 2엔+2유0,⋯,유엔+1엑스−1엑스엔+2

유1−유−12h=0=유엔+2−유엔2h

내 질문은 BC 주에 관한 것입니다. 나는 하나의 방정식, 즉 있지만 아마도 2를 사용할 수 있다고 생각합니다. 그리고 ∂ X U ( 0 ) = ∂ X U ( 1 )

유(0)=유(1)
∂엑스유(0)=∂엑스유(1)

그러나 나는 확실하지 않다. 나는 얼마나 많은 미지수를 가져야하는지 모른다. 그것은이다 ?엔+1


Dirichlet 또는 Neumann 경계 조건이 있습니까? 고스트 셀의 수는 Neumann 경계 조건에 대한 근사 순서에 따라 다릅니다.
— ilciavo

@ilciavo에서, 질문은주기적인 경계 조건에 관한 것입니다.
— Bill Barth

답변:


8

이를 수행하는 가장 좋은 방법은주기 경계 조건의 정의를 사용하고 처음부터 라는 사실을 사용하여 방정식을 올바르게 설정하는 것 입니다. 사실, 더 강하게, 주기적인 경계 조건을 식별 X = 0 와 X = 1 . 이러한 이유로 솔루션 도메인에는 이러한 지점 중 하나만 있어야합니다. 경계 가 없기 때문에 주기적 경계 조건을 사용할 때는 열린 간격이 의미 가 없습니다 .유(0)=유(1)엑스=0엑스=1

당신이에 점 놓지해야한다는이 사실은 수단 이 동일하므로 X = 0 . 와 이산화 N + 1 점, 당신은 그 사실을 사용하는 정의에 의해, 왼쪽에있는 점 X 0 IS X N 과의 오른쪽에있는 점 x를 N이 있다 X 0 .엑스=1엑스=0엔+1엑스0 엑스엔엑스엔 엑스0

주기적 그리드의 개략도

그런 다음 PDE를 공간에서 ∂ 로 분리 할 수 ​​있습니다

∂∂티[엑스0엑스1⋮엑스엔]=1Δ엑스2[엑스엔−2엑스0+엑스1엑스0−2엑스1+엑스2⋮엑스엔−1−2엑스엔+엑스0]

이것은 행렬 형태로 ∂ 로 쓸 수 있습니다 여기서 =[ - 2 1 0 ⋯ 0 1 1 - 2 1 0 ⋯ 0

∂∂티엑스→=1Δ엑스2ㅏ엑스→
ㅏ=[−210⋯011−210⋯0⋱⋱⋱⋱⋱⋱0⋯01−2110⋯01−2].

물론이 행렬을 실제로 만들거나 저장할 필요가 없습니다. 유한 한 차이는 즉시 필요에 따라 첫 번째와 마지막 점을 처리하도록주의하여 계산해야합니다.

∂티유=∂엑스엑스유+비(티,엑스)
엑스∈[−1,1)유심판(티,엑스)=특급⁡(−티)코사인⁡(5π엑스)비(티,엑스)=(25π2−1)특급⁡(−티)코사인⁡(5π엑스)
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
위대하고 간단한 해결책 !! 누군가가 여기 에 그것을 필요로하는 경우 파이썬에서 구현
— ilciavo

엑스

@ bela83 초기 조건 이외의 것을 지정할 필요가 없습니다. 그렇게하면 시스템이 과도하게 결정됩니다. 주기적으로 물건을 올바르게 감쌀 수 있도록 간격의 끝점 근처에서 조금만주의하면됩니다. 이를 수행하는 많은 유효한 방법이 있습니다.
— 더그 리핀 스키

-1

이것에 따르면 다음과 같이 주기적 경계 조건을 부과해야합니다.

유(0,티)=유(1,티)유엑스(0,티)=유엑스(1,티)

후방 오일러를 사용하여 열 방정식을 암시 적으로 분리하는 한 가지 방법은

유엔+1−유엔Δ티=유나는+1엔+1−2유나는엔+1+유나는+1엔+1Δ엑스2

방정식 시스템 풀기

[나는−Δ티Δ엑스2ㅏ][유1엔+1유1엔+1⋮유엔엔+1]=[유1엔유2엔⋮유엔엔]

ㅏ=[−21000…01−2100…001−210…0001−21…00001−2…0⋮⋮⋮⋮⋱⋱⋮000…01−2]

유0유엔+1

유1−유엔=0유2−유02Δ엑스−유엔+1−유엔−12Δ엑스=0

유엑스

[0100…0−10−1010…10−100000나는−Δ티Δ엑스2ㅏ0000000][유0엔+1유1엔+1유2엔+1유엔엔+1유엔+1엔+1]=[00유1엔유2엔유엔엔]

N + 2 방정식과 N + 2 미지수를 제공합니다.

첫 번째 방정식과 고스트 셀을 제거하고 N 개의 방정식과 N 개의 미지수에 도달 할 수 있습니다.


유−1유엔유엔]0,1[엑스케이=케이엔+1엑스엔=엔엔+1

엔유0유엔−1유−1유엔유1유엔유0유엔+1

유0=유엔+1엔+1

유엑스유(0,티)=유(1,티)유엑스(0,티)=유엑스(1,티)

1
u1 = uN은 시스템에 추가적인 제한 (식 u1−uN = 0)을 추가합니다
— ilciavo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.