] 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+20,,+1엑스1엑스+2

112h=0=+22h

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

(0)=(1)
엑스(0)=엑스(1)

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


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

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

답변:


8

이를 수행하는 가장 좋은 방법은주기 경계 조건의 정의를 사용하고 처음부터 라는 사실을 사용하여 방정식을 올바르게 설정하는 것 입니다. 사실, 더 강하게, 주기적인 경계 조건을 식별 X = 0X = 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엑스02엑스1+엑스2엑스12엑스+엑스0]

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

엑스=1Δ엑스2엑스
=[21001121000012110012].

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

=엑스엑스+(,엑스)
엑스[1,1)심판(,엑스)=특급()코사인(5π엑스)(,엑스)=(25π21)특급()코사인(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+12나는+1+나는+1+1Δ엑스2

방정식 시스템 풀기

[나는ΔΔ엑스2][1+11+1+1]=[12]

=[210000121000012100001210000120000012]

0+1

1=0202Δ엑스+112Δ엑스=0

엑스

[0100010101010100000나는ΔΔ엑스20000000][0+11+12+1+1+1+1]=[0012]

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

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


1]0,1[엑스케이=케이+1엑스=+1

01110+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.