이를 수행하는 가장 좋은 방법은주기 경계 조건의 정의를 사용하고 처음부터 라는 사실을 사용하여 방정식을 올바르게 설정하는 것 입니다. 사실, 더 강하게, 주기적인 경계 조건을 식별 X = 0 와 X = 1 . 이러한 이유로 솔루션 도메인에는 이러한 지점 중 하나만 있어야합니다. 경계 가 없기 때문에 주기적 경계 조건을 사용할 때는 열린 간격이 의미 가 없습니다 .u ( 0 ) = u ( 1 )x = 0x = 1
당신이에 점 놓지해야한다는이 사실은 수단 이 동일하므로 X = 0 . 와 이산화 N + 1 점, 당신은 그 사실을 사용하는 정의에 의해, 왼쪽에있는 점 X 0 IS X N 과의 오른쪽에있는 점 x를 N이 있다 X 0 .x = 1x = 0엔+ 1엑스0 엑스엔엑스엔 엑스0
그런 다음 PDE를 공간에서 ∂ 로 분리 할 수 있습니다
∂∂티⎡⎣⎢⎢⎢⎢엑스0엑스1⋮엑스엔⎤⎦⎥⎥⎥⎥= 1Δ x2⎡⎣⎢⎢⎢⎢엑스엔− 2 x0+ x1엑스0− 2 x1+ x2⋮엑스엔− 1− 2 x엔+ x0⎤⎦⎥⎥⎥⎥
이것은 행렬 형태로 ∂ 로 쓸 수 있습니다
여기서
=[ - 2 1 0 ⋯ 0 1 1 - 2 1 0 ⋯ 0
∂∂티엑스⃗ = 1Δ x2X⃗
A = ⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢− 21011− 2⋱⋯001⋱⋱0⋯⋯0⋱⋱100⋯⋱− 21101− 2⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥.
물론이 행렬을 실제로 만들거나 저장할 필요가 없습니다. 유한 한 차이는 즉시 필요에 따라 첫 번째와 마지막 점을 처리하도록주의하여 계산해야합니다.
∂티u = ∂x xu + b ( t , x )
X ∈ [ - 1 , 1 )유심판( t , x ) = exp( − t ) cos( 5 πx )B ( t , X ) = ( 25 π2− 1 ) 특급( − 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