Difference between revisions of "Umar"

From ccitonlinewiki
Jump to: navigation, search
(Tugas Pertemuan 3)
Line 304: Line 304:
 
   
 
   
 
  end PR_Truss;
 
  end PR_Truss;
 +
 +
=====PseudoCode Panggil=====
 +
'''degtorad'''
 +
function degtorad
 +
  input Real deg;
 +
  output Real rad;
 +
  protected
 +
  constant Real pi = 3.14;
 +
algorithm
 +
 +
rad:=deg*pi/180;
 +
 +
end degtorad;
 +
 +
'''Stiffness_Matrices'''
 +
function Stiffness_Matrices
 +
  input Real A;
 +
  output Real X[4,4];
 +
 +
protected
 +
  Real Y;
 +
  Real float_error = 10e-10;
 +
  final constant Real pi=2*Modelica.Math.asin(1.0);
 +
 +
algorithm
 +
 +
  Y:=A/180*pi;
 +
   
 +
X:=[(Modelica.Math.cos(Y))^2,Modelica.Math.cos(Y)*Modelica.Math.sin(Y),-(Modelica.Math.cos(Y))^2,-
 +
Modelica.Math.cos(Y)*Modelica.Math.sin(Y);
 +
 +
Modelica.Math.cos(Y)*Modelica.Math.sin(Y),(Modelica.Math.sin(Y))^2,-Modelica.Math.cos(Y)*Modelica.Math.sin(Y),-
 +
(Modelica.Math.sin(Y))^2;
 +
 +
-(Modelica.Math.cos(Y))^2,-Modelica.Math.cos(Y)*Modelica.Math.sin(Y),
 +
(Modelica.Math.cos(Y))^2,Modelica.Math.cos(Y)*Modelica.Math.sin(Y);
 +
 +
-Modelica.Math.cos(Y)*Modelica.Math.sin(Y),-(Modelica.Math.sin(Y))^2,Modelica.Math.cos(Y)*Modelica.Math.sin(Y),
 +
(Modelica.Math.sin(Y))^2];
 +
 +
  for i in 1:4 loop
 +
  for j in 1:4 loop
 +
    if abs(X[i,j]) <= float_error then
 +
      X[i,j] := 0;
 +
    end if;
 +
  end for;
 +
  end for;
 +
 +
end Stiffness_Matrices;
 +
 +
'''Local_Global'''
 +
function Local_Global
 +
  input Real Y[4,4];
 +
  input Integer B;
 +
  input Integer p1;
 +
  input Integer p2;
 +
  output Real G[B,B];
 +
 +
algorithm
 +
 +
  for i in 1:B loop
 +
  for j in 1:B loop
 +
    G[i,j]:=0;
 +
  end for;
 +
  end for;
 +
 +
G[2*p1,2*p1]:=Y[2,2];
 +
G[2*p1-1,2*p1-1]:=Y[1,1];
 +
G[2*p1,2*p1-1]:=Y[2,1];
 +
G[2*p1-1,2*p1]:=Y[1,2];
 +
 +
G[2*p2,2*p2]:=Y[4,4];
 +
G[2*p2-1,2*p2-1]:=Y[3,3];
 +
G[2*p2,2*p2-1]:=Y[4,3];
 +
G[2*p2-1,2*p2]:=Y[3,4];
 +
 +
G[2*p2,2*p1]:=Y[4,2];
 +
G[2*p2-1,2*p1-1]:=Y[3,1];
 +
G[2*p2,2*p1-1]:=Y[4,1];
 +
G[2*p2-1,2*p1]:=Y[3,2];
 +
 +
G[2*p1,2*p2]:=Y[2,4];
 +
G[2*p1-1,2*p2-1]:=Y[1,3];
 +
G[2*p1,2*p2-1]:=Y[2,3];
 +
G[2*p1-1,2*p2]:=Y[1,4];
 +
 +
end Local_Global;
 +
 +
'''Reaction_Trusses'''
 +
function Reaction_Trusses
 +
  input Integer N;
 +
  input Real A[N,N];
 +
  input Real B[N,1];
 +
  input Real C[N,1];
 +
  output Real Sol[N];
 +
protected
 +
  Real X[N,1];
 +
  Real float_error = 10e-10;
 +
 +
algorithm
 +
  X:=A*B-C;
 +
 +
  for i in 1:N loop
 +
  if abs(X[i,1]) <= float_error then
 +
    X[i,1] := 0;
 +
  end if;
 +
  end for;
 +
 +
  for i in 1:N loop
 +
  Sol[i]:=X[i,1];
 +
  end for;
 +
 +
end Reaction_Trusses;
 +
 +
'''Gauss_Jordan'''
 +
function Gauss_Jordan
 +
  input Integer N;
 +
  input Real A[N,N];
 +
  input Real B[N];
 +
  output Real X[N];
 +
protected
 +
  Real float_error = 10e-10;
 +
 +
algorithm
 +
  X:=Modelica.Math.Matrices.solve(A,B);
 +
 +
  for i in 1:N loop
 +
  if abs(X[i]) <= float_error then
 +
    X[i] := 0;
 +
  end if;
 +
  end for;
 +
 +
end Gauss_Jordan;

Revision as of 14:40, 2 December 2020

بِسْمِ اللهِ الرَّحْمَنِ الرَّحِيْمِ

السَّلاَمُ عَلَيْكُمْ وَرَحْمَةُ اللهِ وَبَرَكَاتُ

Biodata Diri

Umar.jpg

Nama  : Umar

NPM  : 1806200886

TTL  : Jakarta, 16 September 2000

Tempat Tinggal: Jakarta

Saya adalah Mahasiswa Fakultas Teknik Universitas Indonesia, Program Studi Teknik Mesin angkatan 2018. Saat ini Saya sedang menempuh perkuliahan di semester 5, yang artinya sudah tahun ketiga pekuliahan.

Alasan Saya mengambil Program Studi (Prodi) Teknik Mesin karena Prodi ini cukup luas prospeknya dan juga prodi yang mempelajari ilmu engineering yang lebih advance dari prodi teknik lainnya menurut Saya dan akan terus digunakan di masa mendatang.


Pertemuan 1 (11 November 2020)

Setelah melewati pembelajaran selama paruh semester awal dengan Bapak Dr. Ir. Engkos A. Kosasih, M.T. dan melakukan Ujian Tengah Semester (UTS), kelas Metode Numerik - 02 berganti dosen menjadi Bapak Dr. Ir. Ahmad Indra Siswantara atau biasa disapa Pak Da'i. Pada pertemuan pertama setelah UTS ini, Pak Da'i meminta mahasiswa untuk membuat akun pada situs wiki air. Kami dijelaskan bagaimana cara - cara untuk menggunakan wiki air ini supaya lebih familiar dalam menggunakannya, karena tugas - tugas kedepannya akan dikerjakan di wiki air. Pak Da'i pada saat itu juga memaparkan kembali apa tujuan dari pembelajaran metode numerik ini, berikut tujuan - tujuan yang beliau sebutkan :

  • Memahami konsep dan prinsip dasar dalam Metode Numerik
  • Mampu mengaplikasikan pemahaman dari konsep yang ada di dalam permodelan numerik
  • Mampu mengaplikasikan metode numerik dalam persoalan teknik
  • Mendapat nilai tambah/moral sehingga kita menjadi orang yang lebih beradab seperti yang sudah tertulis di sila ke-2 Pancasila.

Uniknya pada perkuliahan kemarin Saya mendapat suatu pelajaran hidup bahwa kita sebagai manusia punya limitasi terkait ilmu pengetahuan atau apapun itu, salah satu kasusnya dalam bidang matematika yaitu belum terpecahkan jawaban atau belum terdefinisi jawaban dari bilangan berapapun dibagi dengan 0 (n/0) walaupun menggunakan software sekalipun. Maka dari itu kita bisa petik hikmah bahwa sebagai manusia tidak boleh merasa "tinggi" walaupun orang - orang menganggap kita sebagai orang hebat sekalipun.

Tugas Pertemuan 1

Pada minggu pertama, setiap mahasiswa diminta untuk melihat dan mempraktikan tentang tutorial atau dasar Open Modellica dari youtube. Kemudian diharapkan untuk mengupload video tutorial singkat di Youtube. Berikut ini adalah video tutorial dasar dari saya untuk penghitungan volume langkah piston pada OpenModelica.

Pertemuan 2 (Rabu, 18 November 2020)

Pak Dai menjelaskan bahwa menggunakan Software OpenModelica lebih nyaman dan sederhana dibanding Software atau program yang sejenis lainnya. Sangat cocok untuk digunakan oleh para Engineer, karena dapat menyelesaikan persoalan perhitungan terkait masalah - masalah keteknikan atau permodelan desain (seperti : perpindahan kalor, sistem fluida, pengendalian sistem, dan rangkaian elektronika). Selain itu OpenModelica juga tidak rumit untuk seorang pemula untuk mempelajarinya. Kemudian Open Modelica tidak mempunyai bahasa program sendiri, itulah yang menyebabkan waktu simulasi permodelannya cukup lama. Open modelica memproses data lebih lama dikarenakan Open Modelica harus menerjemahkan perintah yang ditulis ke bahasa C++, setelah diproses baru akan muncul data - data perhitungan yang kita inginkan.


Tugas Pertemuan 2

Berikut tugas kedua yaitu pengaplikasian OpenModelica dengan class dan function dalam permasalahan matriks variabel array


Pertemuan 3 (25 November 2020)

Pada awal-awal Pak Dai memaparkan tiga aplikasi metode numerik yang sering digunakan dalam menyelesaikan permasalahan teknik, pertama ada Computation Fluid Dynamics (CFD), lalu FInite Element Analysis (FEA), dan Metode Stokastik. CFD dan FEA berbasis ilmu fisika, kemudian metode stokastik berbasis data dan statistik. Ada lima langkah yang Pak Dai paparkan dalam mengaplikasikan metode numerik ke permasalahan teknik :

  • Riset masalah tekniknya terlebih dahulu
  • Menganalisis masalah (mendefinisikan variabel yang mau dicari dan mencari parameter fisikanya)
  • Membuat model matematika
  • Membuat model numerik
  • Setelah itu cari penyelesaian dengan bantuan komputer untuk mendapatkan output yang diinginkan

Agar Kami bisa lebih paham tentang dasar-dasar metode numerik, Pak Dai menyuruh Kami untuk mencoba membuat fungsi untuk menyelesaikan Persamaan 9.12 di buku Numerical Methods for Engineers 7th Edition oleh Chapra dengan cara apapun (misalnya eliminasi gauss). Kedua, Kami disuru latihan menyelesaikan sistem persamaan dengan membuat fungsi penyelesaian dengan cara pseudocode 9.4 untuk menjawab soal 9.5 yang ada di buku yang sama juga. Latihan yang kedua ini dimaksudkan agar Kami paham dalam penggunaan array dalam penggunaan OpenModelica, yang dimana array ini dapat memudahkan mengumpulkan himpunan penyelesaian. Berikut adalah kodingan di OpenModelica :

Gauss Jordan function GaussJordan

input Real [:,:] A;
output Real [:,:] B;

protected // untuk local variable
Integer h = 1;    //pivot row
Integer k = 1;    //pivot coloumn
Integer m = size(A,1); //Number of row
Integer n = size(A,2); //Number of column
Integer c = 0;
Integer max_row; // Row index of max number in pivot column

Real [:] pivot_column;
Real [:] pivot_row;
Real [:,:] temp_array;
Real r;

Real float_error = 10e-10;


algorithm

//fungsi input A dan output B 
B := A;
  
while h <= m and k <= n loop

  for i in 1 : m loop
    for j in 1 : n loop
     if abs(B[i,j]) <= float_error then
       B[i,j] := 0;
      end if;
    end for;
  end for;

//Finding pivot 
  pivot_column:= {B[i,h] for i in h:m};
  
    //Mencari baris terbawah yang mempunyai nilai pivot tertinggi
    c:=h-1;
    for element in pivot_column loop
      c:= c+1;
      if abs(element)== max(abs(pivot_column)) then
        max_row :=c;
      end if;
    end for;
    
  //Jika tidak ada pivot di kolom ini, pindah ke kolom selanjutnya
  if B[max_row,k] == 0 then
    k:=k+1;
   
  else 
    // tukar row h - max_row
    temp_array := B;
    temp_array[h] := B[max_row];
    temp_array[max_row] := B[h];
    B:= temp_array;
    
    //devide pivot row by pivot number
     B[h] := B[h]/B[h,k];
     
     for i in (h+1) :m loop
       r := B[i,k]/B[h,k];
      
      B[i,k]:=0;
      
      for j in (k+1) : n loop
        B[i,j] := B[i,j]-B[h,j] * r;
      end for;
    end for;
    
    //move ke pivot kolom dan row selanjutnya
    h := h+1;
    k := k+1;
    
  end if;
  
end while;

// proses dari kanan atas
h :=m;
k :=n;

while h >=1 and k>=1 loop
  
  //dealing with error
  for i in 1:m loop
    for j in 1:n loop
      if abs(B[i,j]) <=float_error then
        B[i,j]:=0;
      end if;
    end for;
  end for; 

//finding pivot 
    pivot_row := {B[h,i] for i in 1:k};
    
    //Get position index k of pivot 
    c := 0;
    for element in pivot_row loop
      c := c+1;
      if element <> 0 then
        break;
      end if;
    end for;
    k:= c;
    
  // no pivot in this row, move to next row
  if B[h,k] == 0 then 
    h:= h-1;
    
  else
    //perform row operatation
    for i in 1:(h-1) loop
      r := B[i,k];
      B[i] := B[i] - B[h] *r;
    end for;
    
    //move to next pivot row dan column
    h:=h+1;
    k:=k+1;
    
  end if;
  
end while;
    
     
end GaussJordan;

Tugas Pertemuan 3

Kami diberi tugas oleh Pak Dai untuk membuat program sederhana atau penyelesaian dari soal statika struktur dibawah ini dengan OpenModelica

Soal statur.png
PseudoCode Truss

PR_Truss

class PR_Truss
 parameter Integer N=8; //Bentuk matriks berapa x berapa
 parameter Real A=0.001; 
 parameter Real E=200e9; 

 Real KG[N,N]; 
 Real KGinitial[N,N]; 
 Real Sol[N]; 
 Real X[N]={0,0,-1035.2762,-3863.7033,0,0,-1035.2762,-3863.7033};
 Real R[N];
 Real SolMat[N,1];
 Real XMat[N,1];
 
 Real L1=1;
 Real L2=1;
 Real L3=1.6;
 Real L4=1.25;
 Real L5=1.6;

 Real Tetha1=degtorad(0);//Data dari Chegg
 Real Tetha2=degtorad(0);//Data dari Chegg
 Real Tetha3=degtorad(231.34);//Data dari Chegg
 Real Tetha4=degtorad(270);//Data dari Chegg
 Real Tetha5=degtorad(308.66);//Data dari Chegg 

 //Boundary
  Integer b1=1;
  Integer b2=3;

//Truss 1
 Real X1=Tetha1;
 Real k1=A*E/L1;
 Real K1[4,4];
 Integer p1o=1;
 Integer p1i=2;
 Real KG1[N,N];

//Truss 2
 Real X2=Tetha2;
 Real k2=A*E/L2;
 Real K2[4,4];
 Integer p2o=2;
 Integer p2i=3;
 Real KG2[N,N];

//Truss 3
 Real X3=Tetha1;
 Real k3=A*E/L3;
 Real K3[4,4];
 Integer p3o=2;
 Integer p3i=4;
 Real KG3[N,N];

//Truss 4
 Real X4=Tetha4;
 Real k4=A*E/L4;
 Real K4[4,4];
 Integer p4o=1;
 Integer p4i=4;
 Real KG4[N,N];

//Truss 5
 Real X5=Tetha5;
 Real k5=A*E/L5;
 Real K5[4,4];
 Integer p5o=3;
 Integer p5i=4;
 Real KG5[N,N];

algorithm

//Pembuatan K Global
 K1:=Stiffness_Matrices(X1);
 KG1:=k1*Local_Global(K1,N,p1o,p1i);

 K2:=Stiffness_Matrices(X2);
 KG2:=k2*Local_Global(K2,N,p2o,p2i);

 K3:=Stiffness_Matrices(X3);
 KG3:=k3*Local_Global(K3,N,p3o,p3i);

 K4:=Stiffness_Matrices(X4);
 KG4:=k4*Local_Global(K4,N,p4o,p4i);

 K5:=Stiffness_Matrices(X5);
 KG5:=k5*Local_Global(K5,N,p5o,p5i);

 KG:=KG1+KG2+KG3+KG4+KG5;
 KGinitial:=KG;

//Implementing Boundary
 for i in 1:N loop
  KG[2*b1-1,i]:=0;
  KG[2*b1,i]:=0;
  KG[2*b2-1,i]:=0;
  KG[2*b2,i]:=0;
 end for;

 KG[2*b1-1,2*b1-1]:=1;
 KG[2*b1,2*b1]:=1;
 KG[2*b2-1,2*b2-1]:=1;
 KG[2*b2,2*b2]:=1;

//Solving Displacement
 Sol:=Gauss_Jordan(N,KG,X);

//Solving Reaction Force
 SolMat:=matrix(Sol);
 XMat:=matrix(X);
 R:=Reaction_Trusses(N,KGinitial,SolMat,XMat);


end PR_Truss;
PseudoCode Panggil

degtorad

function degtorad
 input Real deg;
 output Real rad;
 protected
 constant Real pi = 3.14;
algorithm

rad:=deg*pi/180;

end degtorad;

Stiffness_Matrices

function Stiffness_Matrices
 input Real A;
 output Real X[4,4];

protected
 Real Y;
 Real float_error = 10e-10;
 final constant Real pi=2*Modelica.Math.asin(1.0);

algorithm

 Y:=A/180*pi;
    
X:=[(Modelica.Math.cos(Y))^2,Modelica.Math.cos(Y)*Modelica.Math.sin(Y),-(Modelica.Math.cos(Y))^2,- 
Modelica.Math.cos(Y)*Modelica.Math.sin(Y);

Modelica.Math.cos(Y)*Modelica.Math.sin(Y),(Modelica.Math.sin(Y))^2,-Modelica.Math.cos(Y)*Modelica.Math.sin(Y),- 
(Modelica.Math.sin(Y))^2;

-(Modelica.Math.cos(Y))^2,-Modelica.Math.cos(Y)*Modelica.Math.sin(Y), 
(Modelica.Math.cos(Y))^2,Modelica.Math.cos(Y)*Modelica.Math.sin(Y);

-Modelica.Math.cos(Y)*Modelica.Math.sin(Y),-(Modelica.Math.sin(Y))^2,Modelica.Math.cos(Y)*Modelica.Math.sin(Y), 
(Modelica.Math.sin(Y))^2];

 for i in 1:4 loop
 for j in 1:4 loop
   if abs(X[i,j]) <= float_error then
     X[i,j] := 0;
   end if;
 end for;
 end for;

end Stiffness_Matrices;

Local_Global

function Local_Global
 input Real Y[4,4];
 input Integer B;
 input Integer p1;
 input Integer p2;
 output Real G[B,B];

algorithm

 for i in 1:B loop
 for j in 1:B loop
   G[i,j]:=0;
 end for;
 end for;

G[2*p1,2*p1]:=Y[2,2];
G[2*p1-1,2*p1-1]:=Y[1,1];
G[2*p1,2*p1-1]:=Y[2,1];
G[2*p1-1,2*p1]:=Y[1,2];

G[2*p2,2*p2]:=Y[4,4];
G[2*p2-1,2*p2-1]:=Y[3,3];
G[2*p2,2*p2-1]:=Y[4,3];
G[2*p2-1,2*p2]:=Y[3,4]; 

G[2*p2,2*p1]:=Y[4,2];
G[2*p2-1,2*p1-1]:=Y[3,1];
G[2*p2,2*p1-1]:=Y[4,1];
G[2*p2-1,2*p1]:=Y[3,2];

G[2*p1,2*p2]:=Y[2,4];
G[2*p1-1,2*p2-1]:=Y[1,3];
G[2*p1,2*p2-1]:=Y[2,3];
G[2*p1-1,2*p2]:=Y[1,4];

end Local_Global;

Reaction_Trusses

function Reaction_Trusses
 input Integer N;
 input Real A[N,N];
 input Real B[N,1];
 input Real C[N,1];
 output Real Sol[N];
protected
 Real X[N,1];
 Real float_error = 10e-10;

algorithm
 X:=A*B-C;

 for i in 1:N loop
 if abs(X[i,1]) <= float_error then
   X[i,1] := 0;
 end if;
 end for;

 for i in 1:N loop
  Sol[i]:=X[i,1];
 end for;

end Reaction_Trusses;

Gauss_Jordan

function Gauss_Jordan
 input Integer N;
 input Real A[N,N];
 input Real B[N];
 output Real X[N];
protected
 Real float_error = 10e-10;

algorithm
 X:=Modelica.Math.Matrices.solve(A,B);

 for i in 1:N loop
  if abs(X[i]) <= float_error then
   X[i] := 0;
  end if;
 end for;

end Gauss_Jordan;