এটি করার সর্বোত্তম উপায় হ'ল সাময়িক সীমানা শর্তের সংজ্ঞাটি ব্যবহার করা এবং ব্যবহার করে শুরু থেকেই আপনার সমীকরণগুলি সঠিকভাবে সেট আপ করা । আসলে, আরও দৃ strongly়ভাবে, পর্যায়ক্রমের সীমানা শর্তগুলি x = 0 এর সাথে x = 1 সনাক্ত করে । এই কারণে আপনার সমাধান ডোমেনে এই পয়েন্টগুলির মধ্যে কেবল একটি থাকা উচিত। কোনও সীমানা নেই বলে পর্যায়ক্রমিক সীমানা শর্তগুলি ব্যবহার করার সময় একটি উন্মুক্ত ব্যবধানটি বোঝায় না ।u ( 0 ) = আপনি ( 1 )x = 0x = 1
এই সত্যটির অর্থ হল যে আপনাকে এ একটি বিন্দু রাখা উচিত নয় কারণ এটি x = 0 এর সমান । সঙ্গে Discretizing এন + + 1 পয়েন্ট, তারপর আপনি সত্য ব্যবহার সংজ্ঞা দ্বারা, বাঁদিকে বিন্দু এক্স 0 হয় এক্স এন এবং ডানদিকে বিন্দু এক্স এন হয় এক্স 0 ।x = 1x = 0এন+ 1এক্স0 xNxN x0
আপনার PDE এর পরে স্থান হিসাবে disc হিসাবে পৃথক করা যায়
∂∂t⎡⎣⎢⎢⎢⎢x0x1⋮xN⎤⎦⎥⎥⎥⎥=1Δx2⎡⎣⎢⎢⎢⎢xN−2x0+x1x0−2x1+x2⋮xN−1−2xN+x0⎤⎦⎥⎥⎥⎥
∂∂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