Anda di halaman 1dari 6

clear all; clear all;clc;

%Bagian 1
%Menyelesaikan PD Poisson & Laplace;
%dengan domain segi empat
%Tipe syarat batas Dirichlet, Neuman, & robin
disp(' Bentuk Umum ; Uxx+Uyy= f');
disp('-------------------------');
disp('Jenis Persmaan Diferensial');
disp('1. Laplace');
disp('2. Poisson');
PD=input('Pilih 1-2 : ?');

if PD==1,
f=0;
else
f=input('f=?');
end;%if
disp('UKURAN DOMAIN')
disp('--------------');
lebar=input('lebar=?');
tinggi=input('tinggi=?');
I=input('I: indeks sumbu x. i=1,2,.,I. I=?');
J=input('J: indeks sumbu y. j=1,2,.,J. J=?');
h=lebar/(I-1); %Lebar Kisi
k=tinggi/(J-1); %Tinggi Kisi
disp(' ');

%Bagian 2
%s : Indeks sisi, s=1,2,3,4)
disp('SYARAT BATAS');
disp('-------------');
for s=1:4
fprintf('\n Syarat batas sisi ke');

fprintf('\n 1. Dirichlet');
fprintf('\n 2. Neuman');
fprintf('\n 3. Robin\n');
tipe= input('pilih 1-3= ');
switch tipe
case 1,
TipeBC(s)=1; %Syarat batas sisi ke s bertipe dirichlet
BC(s)=input('u= ');

case 2,
TipeBC(s)=3; %Syarat batas sisi ke s bertipe Neuman dianggap
alfa(s)=0; %Syarat batas bertipe Robin dgn alfa=0
switch s
case 1,
fprintf('du/dy');
case 2,
fprintf('du/dy');
case 3
fprintf('du/dx');
case 4
fprintf('du/dx');
otherwise
%tidak ada lagi sisi
end
BC(s)=input('=');
%syarat batas sisi ke s bertipe robin
otherwise
TipeBC(s)=3;
switch s
case 1,
disp('dU/dy=alfa.u+betta');
case 2
disp('dU/dy=alfa.u+betta');
case 3,
disp('dU/dx=alfa.u+betta');
case 4,
disp('dU/dx=alfa.u+betta');
otherwise
%tidak ada lagi sisi robin
end %switch s
alfa(s)=input('alfa = ');
BC(s)=input('betta= ');

end
end
%inialisasi U pada batas
for i=1:I
U(i,1)=0;
U(i,J)=0;
end;
for j=1:J
U(1,j)=0;
U(I,J)=0;
end

%set nilai U Pada syarat batas bertipe Dirichlet


if TipeBC(1)==1
for i=1:I
U(i,1)=BC(1);
end
A1=U(1,1);
B1=U(I,1);
end
if TipeBC(2)==1
for i=1:I
U(i,J)=BC(2);
end
C2=U(1,j);
D2=U(I,J);
end
if TipeBC(3)==1
for j=1:J
U(i,J)=BC(3);
end
A3=U(1,1);
C3=U(I,J);
end
if TipeBC(4)==1
for j=1:J
U(I,j)=BC(4);
end
B4=U(I,1);
D4=U(I,J);
end

%-----Nilai U pada titik pojok mengikuti sisi Dirichlet----


%pojok A
if TipeBC(1)==1 & TipeBC(3)==1,
U(1,1)=(A1+A3)/2;
end;
if TipeBC(1)==1 & TipeBC(3)==3,
U(1,1)=A1;
end;
if TipeBC(1)==3 & TipeBC(3)==1,
U(1,1)=A3;
end;

%pojok B
if TipeBC(1)==1 & TipeBC(4)==1,
U(I,1)=(B1+B4)/2;
end;
if TipeBC(1)==1 & TipeBC(4)==3,
U(I,1)=B1;
end;
if TipeBC(1)==3 & TipeBC(4)==1
U(1,1)=B4;
end;

%pojok C
if TipeBC(2)==1 & TipeBC(3)==1,
U(1,J)=(C2+C3)/2;
end;
if TipeBC(2)==1 & TipeBC(3)==3,
U(1,J)=C2;
end;
if TipeBC(2)==3 & TipeBC(3)==1,
U(1,J)=C3;
end;

%pojok D
if TipeBC(2)==1 & TipeBC(4)==1,
U(I,J)=(D2+D4)/2;
end;
if TipeBC(2)==1 & TipeBC(4)==3,
U(I,J)=D2;
end;
if TipeBC(2)==3 & TipeBC(4)==1,
U(I,J)=D4;
end;

%Set tebakan awal U pada sisi dgn tipe neuman atau robin

%sisi 1
if TipeBC(1)==3 & TipeBC(1)==1,
for i=2:I-1
U(i,1)=(BC(2)-tinggi*BC(1)-tinggi)/(1+tinggi*alfa(1));
end;
end;

%sisi 2
if TipeBC(1)==1 & TipeBC(2)==3,
for i=2:I-1
U(i,J)=(BC(1)-tinggi*BC(2))/(1-tinggi*alfa(2));
end;
end;

%sisi 3
if TipeBC(3)==3 & TipeBC(4)==1,
for j=2:J-1
U(1,J)=(BC(4)-lebar*BC(3))/(1+lebar*alfa(4));
end;
end;

%sisi 4
if TipeBC(3)==1 & TipeBC(4)==3,
for j=2:J-1
U(I,J)=(BC(3)+lebar*BC(4))/(1-lebar*alfa(4));
end;
end;

%tebakan awal pojok yang dibentuk 2 sisi neuman atau robin

% pojok A
if TipeBC(1)==3 & TipeBC(3)==3
A1=(U(1,2)-k*BC(1))/(1+k*alfa(1));
A3=U(2,1)-h*BC(3)/(1+h*alfa(3));
U(1,1)=(A1+A3)/2;
end;

%Tebakan Awal Pojok B


if TipeBC(1)==3 & TipeBC(4)==3
B1=(U(I,2)-k*BC(1))/(1+k*alfa(1));
B4=U(I-1,1)-h*BC(4)/(1+h*alfa(4));
U(I,1)=(B1+B4)/2;
end;

%Tebakan Awal Pojok C


if TipeBC(2)==3 & TipeBC(3)==3
C2=(U(1,J-1)+k*BC(2))/(1-k*alfa(2));
C3=U(2,J)-h*BC(3)/(1+h*alfa(3));
U(1,J)=(C2+C3)/2;
end;

%Tebakan Awal Pojok D


if TipeBC(2)==3 & TipeBC(4)==3
D2=(U(I,2)-k*BC(1))/(1-k*alfa(1));
D4=U(I-1,J)-h*BC(4)/(1-h*alfa(4));
U(I,j)=(D2+D4)/2;
end;

H=lebar/2; K=tinggi/2;
r=sqrt(H*H+K*K);
aver=(U(1,1)+U(I,1)+U(1,J)+U(I,J)-r*r*f)/4;
%tebakan awal titik interior
for i=2:I-1
for j=2:J-1
U(i,j)=0; %aver
end
end
Ukonv=0; %inisialisasi banyaknya titik konvergen
banyakU=I*J;
epsilon=10.^(-6); %nilai toleransi perbedaan nilai U
Mj=(cos(pi/(I+1))+cos(pi/(J+1)))/2;
w=1.5; %2/(1+sqrt(1-Mj.^2));

dh=1/(h*h); dk=1/(k*k); dhk=2*(dh+dk);


iter=0;
%---------------------Bagian iterasi-----------------------
while Ukonv<banyakU,
Ukonv=0;
iter=iter+1;
for i=1:I
for j=1:J

temp = U(i,j);

%skema titik interior


if i>1&i<I & j>1&j<J,
U(i,j)=(dh*(U(i-1,j)+U(i+1,j))+dk*(U(i,j-1)+U(i,j+1))-f)/dhk;
%--- skema sisi neuman atau robin (tak termasuk ujungnya)------
%sisi ke 1 (sisi bawah)
elseif i>1&i<I&j==1 & TipeBC(1)==3,
U(i,1)=(dh*(U(i-1,1)+U(i+1,1))+dk*(2*U(i,2)-2*k*BC(1))-f)/
(dhk+dk*2*k*alfa(1));
elseif i>1&i<I & j==J & TipeBC(2)==3,
%skema sisi ke 2 (sisi atas)
U(i,J)=(dh*(U(i-1,J)+U(i+1,J))+ dk*(2*U(i,J-1)+2*k*BC(2))-f)/(dhk-
dk*2*k*alfa(2));
elseif i==1&j>1&&j<J & TipeBC(3)==3,
%sisi ke 3 (sisi kiri)
U(1,j)=(dh*(2*U(2,j)-2*h*BC(3))+dk*(U(1,j-1)+U(1,j+1))-f)/
(dhk+dh*2*h*alfa(3));
elseif i==I & j>1&j<J & TipeBC(4)==3,
%sisi ke 4 (sisi Kanan
U(I,j)=(dh*(2*U(I-1,j)+ 2*h*BC(4))+dk*(U(I,j-1)+U(I,j+1))-f)/(dhk-
dh*2*h*alfa(4));

%---- skema pojok yang dibentuk 2 sisi robin----


elseif i==1&j==1 & TipeBC(1)==3 & TipeBC(3)==3,

%Pojok kiri bawah (Pojok A)


U(1,1)=(dh*(2*U(2,1)-2*h*BC(3))+dk*(2*U(1,2)-2*k*BC(1))-f)/...
(dhk+dh*2*h*alfa(3)+dk*2*k*alfa(1));
elseif i==I&j==1& TipeBC(1)==3 & TipeBC(4)==3,
%Pojok kanan bawah (pojok B)
U(I,1)=(dh*(2*U(I-1,1)+2*h*BC(4))+dk*(2*U(I,2)-2*k*BC(1))-f)/...
(dhk-dh*2*h*alfa(4)+dk*2*k*alfa(1));
elseif i==1&j==J& TipeBC(2)==3 & TipeBC(3)==3,
%Pojok kiri atas (pojok C)
U(1,J)=(dh*(2*U(2,J)-2*h*BC(3))+dk*(2*U(1,J-1)+2*k*BC(2))-f)/...
(dhk+dh*2*h*alfa(3)-dk*2*k*alfa(2));
elseif i==1&j==J& TipeBC(2)==3 & TipeBC(4)==3,
%Pojok kanan atas (pojok D)
U(I,J)=(dh*(2*U(I-1,1)+2*h*BC(4))+dk*(2*U(I,J)+2*k*BC(2))-f)/...
(dhk-dh*2*h*alfa(4)-dk*2*k*alfa(2));
else
% sisi dirichlet tidak punya skema iterasi
% karena nilau U nya telah diketahui
end

%skema SOR
U(i,j)=w*U(i,j)+(1-w)*temp;
%kriteria konvergensi
beda=abs(U(i,j)-temp);
if beda < epsilon, Ukonv=Ukonv+1;
end;
end %for j
end %for i

fprintf('\nIterasi ke');
fprintf('%5d', iter);
fprintf('banyak U konvergen');
fprintf('%5d',Ukonv);
fprintf(' //');
fprintf('%5d', banyakU);

if iter==100000, break;
end
end %while ----------------- end iterasi-----------------------

%plot nulai U pada domain


arsiran=U(1:I,1:J);
pcolor(arsiran)
colorbar vert
shading interp
title('Grafik kontur Solusi Numerik');
xlabel('x');
ylabel('y');
drawnow;

for i=1:I
x=(i-1)*h;
for j=1:J
y=(j-1)*k;
u_eksak(i,j)=x.^2+y.^2;
end;
end;
error=U(1:I,1:J)-u_eksak(1:I,1:J);

%Plot eror
figure;
mesh(error);
shading interp;
colormap(jet);
title ('Grafik Error Global');
xlabel('i');
ylabel('j');
zlabel('error global');
colorbar vert;
fprintf('\nSelesai\n')

Anda mungkin juga menyukai