ऐसा करने का सबसे अच्छा तरीका है (जैसा कि आपने कहा) केवल आवधिक सीमा की शर्तों की परिभाषा का उपयोग करें और अपने समीकरणों को इस तथ्य का उपयोग करके प्रारंभ से सही ढंग से सेट करें कि । वास्तव में, और भी अधिक दृढ़ता से, आवधिक सीमा की स्थिति x = 0 को x = 1 से पहचानती है । इस कारण से, आपको अपने समाधान डोमेन में इनमें से एक बिंदु होना चाहिए। जब कोई सीमा नहीं होती है, तो आवधिक सीमा शर्तों का उपयोग करते समय एक खुले अंतराल का कोई मतलब नहीं होता है ।u(0)=u(1)x=0x=1
इस तथ्य का मतलब है कि आपको पर एक बिंदु नहीं रखना चाहिए क्योंकि यह x = 0 के समान है । साथ Discretizing एन + 1 अंक, तो आप इस तथ्य का उपयोग करें कि परिभाषा के द्वारा, के बाईं ओर बिंदु एक्स 0 है एक्स एन और के अधिकार के लिए बिंदु एक्स एन है एक्स 0 ।x=1x=0N+1x0 xNxN x0
आपके पीडीई को तब अंतरिक्ष में ized के रूप में विवेकाधीन किया जा सकता है
∂∂t⎡⎣⎢⎢⎢⎢x0x1⋮xN⎤⎦⎥⎥⎥⎥=1Δx2⎡⎣⎢⎢⎢⎢xN−2x0+x1x0−2x1+x2⋮xN−1−2xN+x0⎤⎦⎥⎥⎥⎥
यह के रूप में मैट्रिक्स के रूप में लिखा जा सकता है
जहां
एक=[ - 2 1 0 ⋯ 0 1 1 - 2 1 0 ⋯ 0
∂∂tx⃗ =1Δx2Ax⃗
A=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢−21011−2⋱⋯001⋱⋱0⋯⋯0⋱⋱100⋯⋱−21101−2⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥.
बेशक इस मैट्रिक्स को वास्तव में बनाने या संग्रहीत करने की कोई आवश्यकता नहीं है। पहले और आखिरी बिंदुओं को विशेष रूप से आवश्यकतानुसार संभालने के लिए ध्यान रखते हुए, मक्खी पर परिमित अंतर की गणना की जानी चाहिए।
∂tu=∂xxu+b(t,x)
x∈[−1,1)uRef(t,x)=exp(−t)cos(5πx)b(t,x)=(25π2−1)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