Professional Documents
Culture Documents
04integracija 1
04integracija 1
MAŠINSKI FAKULTET
PODGORICA
KME
Broj listova:
end
end
% specificni
for i=2*Nj-1:Nj:Nj*(Ni-1)-1
an(i)=2.*L*deltax/dely;
end
% Definisanje as
for k=0:Nj:(Ni-3)*Nj
for i=3+Nj+k:1:3+Nj+k+Nj-4
as(i)=L*deltax/dely;
end
end
% specificni
for i=2+Nj:Nj:Nj*(Ni-1)-Nj+2
as(i)=2.*L*deltax/dely;
end
% Definisanje aw
for k=0:Nj:(Ni-4)*Nj
for i=2*Nj+2+k:1:3*Nj-1+k
aw(i)=L*deltay/delx;
end
end
% specificni
for i=Nj+2:1:2*Nj-1
aw(i)=2.*L*deltay/delx;
end
% Definisanje ae
for k=0:Nj:(Ni-4)*Nj
for i=2+Nj+k:1:2*Nj-1+k
ae(i)=L*deltay/delx;
end
end
% specificni
for i=(Ni-1)*Nj-Nj+2:1:Nj*(Ni-1)-1
ae(i)=2.*L*deltay/delx;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% POCETNO POLJE "fi", KONSTANTNI KOEFICIJENTI, IDR.
% Sracunavanje pocetne vrijednost za fi.
% Koeficijent ap je u opstem slucaju:
% ap=ae+as+aw+an+(ap)o-Sp*deltax*deltay
%========================================================================
%========================================================================
% Iterativno resavanje sistema linearnih algebarskih jednacina.
% Algoritam je Gaus-Seidel SOR (,,Successive Over-Relaxation'')
%========================================================================
%========================================================================
%###############################################################################
##
% GAUS SEIDEL SOLVER
% (rjesavanje sistema alg.jednacina, za tekuci vremenski trenutak
!!!)
Rezidual = epsilon + 1.;
brojac = 0.;
while Rezidual > epsilon % POCETAK SOLVERA ZA TEKUCI TRENUTAK
% epsilon je mjera smanjenja reda velicine najveceg reziduala, u
% odnosu na njegovu vrijednost posle 1. iteracije.
brojac = brojac + 1.;
%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
% SHEMA SOLVERA. RACUNANJE PO SVIM CV - PRORACUNSKIM CVOROVIMA
% za svaku CV-u (osim onih fiksiranih Dirihleovim g.uslovom):
for k=0:Nj:(Ni-3)*Nj
for i=2+Nj+k:1:2*Nj-1+k
% NOVO fi(i), (Successive Over-Relaxation)
fi(i)=omega*[b(i)+as(i)*fi(i-1)+aw(i)*fi(i-Nj)
+an(i)*fi(i+1)+ae(i)*fi(i+Nj)]./ap(i) + (1-omega)*fi(i);
end
end
%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
% SRACUNAVANJE REZIDUALA:
Rezidual=0.0;
for k=0:Nj:(Ni-3)*Nj
for i=2+Nj+k:1:2*Nj-1+k
%_______________________________________________________
% Svi fi(i) su vec sracunati. Sada se moze odrediti
% Rezidual(i) u k-toj iteraciji: b + suma_nb_od_(fi)nb -
ap*(fi)p;
% to je ne-nula broj u k-toj iteraciji.
%_______________________________________________________
rezidual(i)=abs(b(i)+as(i)*fi(i-1)+aw(i)*fi(i-Nj)
+an(i)*fi(i+1)+ae(i)*fi(i+Nj)-ap(i)*fi(i));
if rezidual(i) > Rezidual
Rezidual = rezidual(i); %Najveci se zove Rezidual
end
end
end
%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
%###############################################################################
##
% Grafici rjesenja:
figure(1), pcolor(xp,yp,a), shading faceted, colorbar('vert'),
title(' RJESENJE: \phi(x,y)
\newline NA PRESJECIMA LINIJA NALAZE SE PRORACUNSKI CVOROVI'),
xlabel('0<x<Lx'), ylabel('0<y<Ly'),
RJESENJE: (x,y)
NA PRESJECIMA LINIJA NALAZE SE PRORACUNSKI CVOROVI
1 500
0.9 450
0.8 400
0.7 350
0.6 300
0<y<Ly
0.5 250
0.4 200
0.3 150
0.2 100
0.1 50
0 0
0 0.2 0.4 0.6 0.8 1
0<x<Lx
RJESENJE =f(x,y)
500
400
Vrijednost funkcije
300
200
100
0
1
1
0.8
0.5 0.6
0.4
0.2
0<y<Ly 0 0
0<x<Lx
RJESENJE (x,y)
1 450
0.5
200
0.4
150
0.3
100
0.2
250 350450250 350450
150 150
0.1 50 50 50
0 0
0 0.2 0.4 0.6 0.8 1
0<x<Lx
FUNKCIJA U DOMENU
1 500
0.9 450
0.8 400
0.7 350
0.6 300
0<y<Ly
0.5 250
0.4 200
0.3 150
0.2 100
0.1 50
0 0
0 0.2 0.4 0.6 0.8 1
0<x<Lx
FUNKCIJA U DOMENU
1
0.9 100
200 300
400500
0.8
0.7
0.6
0<y<Ly
0.5
0.4
0.3
0.2
250350
450
150
0.1 50
0
0 0.2 0.4 0.6 0.8 1
0<x<Lx
for i=2*Nj:Nj:Nj*(Ni-1);
fi(i)=fin;
end
% Definisanje an
for k=0:Nj:(Ni-3)*Nj
for i=2+Nj+k:1:2*Nj-2+k
an(i)=L*deltax/dely;
end
end
% specificni
for i=2*Nj-1:Nj:Nj*(Ni-1)-1
an(i)=2.*L*deltax/dely;
end
% Definisanje as
for k=0:Nj:(Ni-3)*Nj
for i=3+Nj+k:1:3+Nj+k+Nj-4
as(i)=L*deltax/dely;
end
end
% specificni
for i=2+Nj:Nj:Nj*(Ni-1)-Nj+2
as(i)=2.*L*deltax/dely;
end
% Definisanje aw
for k=0:Nj:(Ni-4)*Nj
for i=2*Nj+2+k:1:3*Nj-1+k
aw(i)=L*deltay/delx;
end
end
% specificni
for i=Nj+2:1:2*Nj-1
aw(i)=2.*L*deltay/delx;
end
% Definisanje ae
for k=0:Nj:(Ni-4)*Nj
for i=2+Nj+k:1:2*Nj-1+k
ae(i)=L*deltay/delx;
end
end
% specificni
for i=(Ni-1)*Nj-Nj+2:1:Nj*(Ni-1)-1
ae(i)=2.*L*deltay/delx;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% POCETNO POLJE "fi", KONSTANTNI KOEFICIJENTI, IDR.
% Sracunavanje pocetne vrijednost za fi. U smislu algoritma ovo je
% ekvivalentno pretpostavljanju polja "fi" (vremenska diskretizacija je
% implicitna. Koeficijent (ap)o je kod implicitne vremenske diskretizacije
% jednak: (ap)o = ro * deltax*deltay / deltat, tj. isti je za sve CV-e.
% Koeficijent ap je u opstem slucaju: ap=ae+as+aw+an+(ap)o-Sp*deltax*deltay
for i=2+Nj+k:1:2*Nj-1+k
fi(i)=0; % POCETNI USLOV
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%========================================================================
%========================================================================
% Iterativno rjesavanje sistema linearnih algebarskih jednacina.
% Algoritam je Gaus-Seidel SOR (,,Successive Over-Relaxation'')
% Diskretizacija u vremenu je implicitna.
%========================================================================
%========================================================================
% POCETAK PETLJE KOJA POKRIVA VREMENSKI PERIOD PRORACUNA, TJ. SVE VREMENSKE
KORAKE:
vremindeks = 0.;
while vremindeks < brojvrkoraka % uvecanje vremnindeks-a je na dnu petlje.
% PROCEDURA SE PONAVLJA ONOLIKO PUTA KOLIKO JE VREMENSKIH KORAKA.
if vremindeks == 0.
disp('...RACUNANJE JE U TOKU')
end
%###############################################################################
##
% GAUS SEIDEL SOLVER
% (rjesavanje sistema alg.jednacina, za tekuci vremenski trenutak
!!!)
Rezidual = epsilon + 1.;
brojac = 0.;
while Rezidual > epsilon % POCETAK SOLVERA ZA TEKUCI TRENUTAK
% epsilon je mjera smanjenja reda velicine najveceg reziduala, u
% odnosu na njegovu vrijednost posle 1. iteracije.
brojac = brojac + 1.;
%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
% SHEMA SOLVERA. RACUNANJE PO SVIM CV - PRORACUNSKIM CVOROVIMA
% za svaku CV-u (osim onih fiksiranih Dirihleovim g.uslovom):
for k=0:Nj:(Ni-3)*Nj
for i=2+Nj+k:1:2*Nj-1+k
% NOVO fi(i), (Successive Over-Relaxation)
fi(i)=omega*[b(i)+as(i)*fi(i-1)+aw(i)*fi(i-Nj)
+an(i)*fi(i+1)+ae(i)*fi(i+Nj)]./ap(i) + (1-omega)*fi(i);
end
end
%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
% SRACUNAVANJE REZIDUALA:
Rezidual=0.0;
for k=0:Nj:(Ni-3)*Nj
for i=2+Nj+k:1:2*Nj-1+k
%_______________________________________________________
% Svi fi(i) su vec sracunati. Sada se moze odrediti
% Rezidual(i) u k-toj iteraciji: b + suma_nb_od_(fi)nb -
ap*(fi)p;
% to je ne-nula broj u k-toj iteraciji.
%_______________________________________________________
rezidual(i)=abs(b(i)+as(i)*fi(i-1)+aw(i)*fi(i-Nj)
+an(i)*fi(i+1)+ae(i)*fi(i+Nj)-ap(i)*fi(i));
if rezidual(i) > Rezidual
Rezidual = rezidual(i); %Najveci se zove Rezidual
end
end
end
%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
%###############################################################################
##
% disp('---------------------------------');
% disp('------NOVI VREMENSKI KORAK-------');
% disp('---------------------------------');
% disp('...')
%SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
% RJESENJE (SLOZENO U MATRICU)
% SVAKA VRSTA MATRICE JE VEKTOR RJESENJA "fi" ZA TEKUCI VREM.KORAK
FI(vremindeks,:) = fi(1,:);
%SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
% KRAJ PRORACUNA.
%###############################################################################
#######
%***********************************************************************
% Crtanje grafika funkcije fi
%***********************************************************************
% | |
% | |
for j=1:1:Ni % | (n) |
k=(j-1)*Nj; % |_____________|
for i=1:1:Nj % \ | \ |
a(i,j)=fi(i+k); % \ | \ |
end % (w) \ | (domen) \ | (e)
end % Ly \ | \|
% \|____________|
% (s) Lx
%***********************************************************************
% (x,y) KOORDINATE TACAKA U KOJIMA JE DEFINISANA VRIJEDNOST "fi"
% To su: koordinate cvorova na ivicama i centara konacnih zapremina
% unutar domena.
x = cat(2,[0. deltax/2.],[3*deltax/2.0:deltax:(Lx-deltax/2.0)], [Lx]);
y = cat(2,[0. deltay/2.],[3*deltay/2.0:deltay:(Ly-deltay/2.0)], [Ly]);
[xp,yp] = meshgrid(x,y); % DOMEN (x,y) TACAKA
% Grafici rjesenja:
figure(1), pcolor(xp,yp,a), shading faceted, colorbar('vert'),
title(' RJESENJE: \phi(x,y)
\newline NA PRESJECIMA LINIJA NALAZE SE PRORACUNSKI CVOROVI'),
xlabel('0<x<Lx'), ylabel('0<y<Ly'),
figure(3),
A=contourf(xp,yp,a);clabel(A),colorbar('vert'),title('RJESENJE \phi(x,y)'),
xlabel('0<x<Lx'), ylabel('0<y<Ly'),zlabel('Vrijednost \phi'),
RJESENJE: (x,y)
NA PRESJECIMA LINIJA NALAZE SE PRORACUNSKI CVOROVI
1 500
0.9 450
0.8 400
0.7 350
0.6 300
0<y<Ly
0.5 250
0.4 200
0.3 150
0.2 100
0.1 50
0 0
0 0.2 0.4 0.6 0.8 1
0<x<Lx
RJESENJE =f(x,y)
500
400
Vrijednost funkcije
300
200
100
0
1
1
0.8
0.5 0.6
0.4
0.2
0<y<Ly 0 0
0<x<Lx
RJESENJE (x,y)
1 450
0.5
200
0.4
150
0.3
100
0.2 450
350
250 250 450
350
150 150
0.1 50 50 50
0 0
0 0.2 0.4 0.6 0.8 1
0<x<Lx
FUNKCIJA U DOMENU
1 500
0.9 450
0.8 400
0.7 350
0.6 300
0<y<Ly
0.5 250
0.4 200
0.3 150
0.2 100
0.1 50
0 0
0 0.2 0.4 0.6 0.8 1
0<x<Lx
FUNKCIJA U DOMENU
1
0.7
0.6
0<y<Ly
0.5
0.4
0.3
0.2 450
350
250
150
0.1 50
0
0 0.2 0.4 0.6 0.8 1
0<x<Lx