Difference between revisions of "Moh Khairul Imam Assidiqqi"

From ccitonlinewiki
Jump to: navigation, search
 
(78 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
السَّلاَمُ عَلَيْكُمْ وَرَحْمَةُ اللهِ وَبَرَكَاتُهُ
 
السَّلاَمُ عَلَيْكُمْ وَرَحْمَةُ اللهِ وَبَرَكَاتُهُ
 +
{| class="wikitable" style="float:right; margin-left: 10px;"
 +
!colspan="2"|Profile
 +
|-
 +
|colspan="2"|[[File:Moh Khairul Imam Assidiqqi.jpg|300px|Center]]
 +
|-
 +
|'''Nama Lengkap'''
 +
|Moh Khairul Imam Assidiqqi
 +
|-
 +
|'''NPM'''
 +
|1906301210
 +
|-
 +
|style="vertical-align:top;"|'''Jurusan'''
 +
|Teknik Mesin
 +
|-
 +
|'''Alamat Email'''
 +
|moh.khairul@ui.ac.id
 +
|-
 +
|colspan="2" style="text-align:center;width:200px;"|
 +
|}
  
== '''Biodata Diri''' ==
+
== '''Perkenalan Singkat''' ==
 +
Assalamu'alaikum Wr. Wb. Perkenalkan nama saya Moh Khairul Imam Assidiqqi. Saya adalah mahasiswa Departemen Teknik Mesin angkatan 2019.
  
Nama    : Moh Khairul Imam Assidiqqi
 
 
NPM      : 1906301210
 
 
Jurusan  : Teknik Mesin
 
 
TTL      : Malang, 30 Oktober 2000
 
  
  
Line 32: Line 45:
 
Berikut adalah hasil tugas saya:
 
Berikut adalah hasil tugas saya:
  
[https://youtu.be/7b-ODkR49Q8 Cara Mencari Interpolasi Dengan OpenModelica]
+
<div class="center" style="width: auto; margin-left: auto; margin-right: auto;">
 +
<youtube width="200" height="100">https://youtu.be/7b-ODkR49Q8</youtube>
 +
</div>
 +
 
 +
== '''Pertemuan Kedua Metode Numerik (18-11-2020)''' ==
 +
 
 +
Pada pertemuan kedua dengan Pak Dai, kami diberikan pelajaran yang sangat berharga bahwa kita harus menjadi orang yang beruntung. Maksudnya adalah kita harus menjalani hari ini lebih baik dari hari kemarin. Dan jangan menjadi orang yang merugi yang hari malah lebih buruk dari hari kemarin.
 +
 
 +
Setelah itu Pak Dai juga menyuruh kami untuk menayangkan tugas-tugas kami pada minggu pertama. Kami diperbolehkan bertanya apapun yang masih kami belum ketahui. Kemudian Pak Dai mengajarkan kami tentang Class dan Function di OpenModelica dan Pak Dai juga mengajarkan bahwa suatu fungsi  bisa dipanggil ke sebuah kelas.
 +
 
 +
=== Tugas 2 Metode Numerik ===
 +
Di akhir kelas, Pak Dai memberikan kami tugas untuk membuat video dimana kami diminta untuk membuat sebuah fungsi berupa persamaan aljabar simultan dengan variabel array kemudian membuat class untuk memanggil fungsi tersebut.
 +
 
 +
Berikut adalah hasil tugas saya:
 +
 
 +
'''function'''
 +
 
 +
function Gauss
 +
input Real A[5,5];
 +
input Real B[5];
 +
output Real X[5];
 +
 +
algorithm
 +
X:=Modelica.Math.Matrices.solve(A,B);
 +
end Gauss;
 +
 
 +
'''class'''
 +
 
 +
class SPL_5_Variabel
 +
parameter Real A[5,5]=[2,-2,0,4,2;
 +
                      -2,4,2,0,5;
 +
                      2,-2,2,-2,0;
 +
                      0,4,2,4,4;
 +
                      4,2,2,4,-2];
 +
parameter Real B[5]={2,4,6,8,-12};
 +
Real X[5];
 +
 +
equation
 +
X=Gauss(A,B);                 
 +
end SPL_5_Variabel;
 +
 
 +
 
 +
 
 +
<div class="center" style="width: auto; margin-left: auto; margin-right: auto;">
 +
<youtube width="200" height="100">https://youtu.be/BRja-6qgMLA</youtube>
 +
</div>
 +
 
 +
== '''Pertemuan Ketiga Metode Numerik (25-11-2020)''' ==
 +
 
 +
Pada pertemuan ketiga, Pak Dai memaparkan tiga aplikasi metode numerik yang sering digunakan dalam menyelesaikan permasalahan teknik, pertama ada Computation Fluid Dynamics (CFD), lalu Finite Element Analysis, dan Metode Stokastik. Setelah itu Pak Dai meminta beberapa mahasiswa untuk mereview tugas-tugas yang telah diberikan sebelumnya. Salah satu teman kami yaitu Josiah memberikan sharing mengenai aljabar simultan dan variabel array.
 +
 
 +
Kemudian Pak Dai menjelaskan kembali mengenai metode Gauss. Pak dai mendorong kami untuk membuat code sendiri untuk menyelesaikan Gauss Jordan. Salah satu mahasiswa, yaitu Cristo memberikan sharing mengenai code yang telah ia buat untuk Gauss Jordan, berikut code modelica untuk Gauss Jordan dari Cristo:
 +
 
 +
// Gauss-Jordan Algorithm
 +
// Transforms input matrix A into reduced row echelon form matrix B
 +
// Christopher S.E. November 2020
 +
input Real [:,:] A;    // An augmented matrix of m*n
 +
output Real [:,:] B;    // Output matrix in reduced row echelon form
 +
// Local variables
 +
 
 +
protected
 +
Integer h = 1;          // Initialize pivot row
 +
Integer k = 1;          // Initialize pivot column
 +
Integer m = size(A,1);  // Number of rows in matrix
 +
Integer n = size(A,2);  // Number of columns in matrix
 +
Integer c = 0;          // Index counter
 +
Integer max_row;        // Row index of max number in pivot column
 +
 
 +
Real [:] pivot_column;  // Vector containing pivot column data
 +
Real [:] pivot_row;    // Vector containing backwards pivot row data
 +
Real [:,:] temp_array;  // Stores matrix data when switching rows
 +
Real r;                // Ratio value used for row operations
 +
 
 +
// Limit to handle floating point errors
 +
Real float_error = 10e-10;
 +
 
 +
algorithm
 +
 
 +
// Transfer input matrix A into variable B
 +
B := A;
 +
 
 +
while h <= m and k <= n loop
 +
 
 +
// Dealing with floating point errors
 +
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 the pivot
 +
    pivot_column := {B[i,h] for i in h:m};
 +
 
 +
    // Get position index of lowest row with greatest pivot number
 +
    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;
 +
 
 +
  // No pivot in this column, move on to next column
 +
  if B[max_row, k] == 0 then
 +
    k := k+1;
 +
 
 +
  else
 +
    // Swap Rows h <-> max_row
 +
    temp_array := B;
 +
    temp_array[h] := B[max_row];
 +
    temp_array[max_row] := B[h];
 +
    B:= temp_array;
 +
   
 +
    // Divide pivot row by pivot number
 +
    B[h] := B[h]/B[h,k];
 +
   
 +
    // For all rows below the pivot
 +
    for i in (h+1):m loop
 +
     
 +
      // Store the ratio of the row to the pivot
 +
      r := B[i,k] / B[h,k];
 +
     
 +
      // Set lower part of pivot column to zero
 +
      B[i,k] := 0;
 +
     
 +
      // Operations on the remaining row elements
 +
      for j in (k+1):n loop
 +
          B[i,j] := B[i,j] - B[h,j] * r;
 +
      end for;
 +
     
 +
    end for;
 +
   
 +
    // Move on to next pivot row and column
 +
    h := h+1;
 +
    k := k+1;
 +
   
 +
  end if;
 +
 
 +
end while;
 +
 
 +
// The matrix is now in row echelon form
 +
 
 +
// Set values of (h,k) to (m,n)
 +
h := m;
 +
k := n;
 +
 
 +
while h >= 1 and k >=1 loop
 +
 
 +
  // Dealing with floating point errors
 +
  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 the 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 on to next row
 +
  if B[h, k] == 0 then
 +
    h := h-1;
 +
   
 +
  else
 +
   
 +
    // Perform row operations
 +
    for i in 1:(h-1) loop
 +
      r := B[i,k];
 +
      B[i] := B[i] - B[h] * r;
 +
    end for;
 +
   
 +
    // Move on to next pivot row and column
 +
    h := h-1;
 +
    k := k-1;
 +
 
 +
  end if;
 +
 
 +
end while;
 +
 
 +
// The matrix is now in reduced row echelon form
 +
 
 +
end GaussJordan;
 +
 
 +
 
 +
=== Tugas 3 Metode Numerik ===
 +
Di akhir kelas, Pak Dai memberikan kami tugas yaitu menyelesaikan persoalan berikut:
 +
 
 +
[[File:pr3-1.png|720px|center]]
 +
 
 +
Berikut adalah penyelesaiannya:
 +
 
 +
<syntaxhighlight lang="modelica">
 +
 
 +
class Trusses
 +
 
 +
parameter Integer N=8; //Global matrice = 2*points connected
 +
parameter Real A=0.001; //Area m2
 +
parameter Real E=200e9; //Pa
 +
Real G[N,N]; //global
 +
Real Ginitial[N,N]; //global
 +
Real Sol[N]; //global dispplacement
 +
Real X[N]={0,0,-1035.2762,-3863.7033,0,0,-1035.2762,-3863.7033};
 +
Real R[N]; //global reaction force
 +
Real SolMat[N,1];
 +
Real XMat[N,1];
 +
 
 +
//boundary condition
 +
Integer b1=1;
 +
Integer b2=3;
 +
 
 +
//truss 1
 +
parameter Real X1=0; //degree between truss
 +
Real k1=A*E/1;
 +
Real K1[4,4]; //stiffness matrice
 +
Integer p1a=1;
 +
Integer p1b=2;
 +
Real G1[N,N];
 +
 
 +
//truss 2
 +
parameter Real X2=0; //degree between truss
 +
Real k2=A*E/1;
 +
Real K2[4,4]; //stiffness matrice
 +
Integer p2a=2;
 +
Integer p2b=3;
 +
Real G2[N,N];
 +
 
 +
//truss 3
 +
parameter Real X3=90; //degree between truss
 +
Real k3=A*E/1.25;
 +
Real K3[4,4]; //stiffness matrice
 +
Integer p3a=2;
 +
Integer p3b=4;
 +
Real G3[N,N];
 +
 
 +
//truss 4
 +
parameter Real X4=90+38.6598; //degree between truss
 +
Real k4=A*E/1.6;
 +
Real K4[4,4]; //stiffness matrice
 +
Integer p4a=1;
 +
Integer p4b=4;
 +
Real G4[N,N];
 +
 
 +
//truss 5
 +
parameter Real X5=90-38.6598; //degree between truss
 +
Real k5=A*E/1.6;
 +
Real K5[4,4]; //stiffness matrice
 +
Integer p5a=3;
 +
Integer p5b=4;
 +
Real G5[N,N];
 +
 
 +
/*
 +
for each truss, please ensure pXa is lower then pXb (X represents truss element number)
 +
*/
 +
 
 +
algorithm
 +
 
 +
//creating global matrice
 +
K1:=Stiffness_Matrices(X1);
 +
G1:=k1*Local_Global(K1,N,p1a,p1b);
 +
 
 +
K2:=Stiffness_Matrices(X2);
 +
G2:=k2*Local_Global(K2,N,p2a,p2b);
 +
 
 +
K3:=Stiffness_Matrices(X3);
 +
G3:=k3*Local_Global(K3,N,p3a,p3b);
 +
 
 +
K4:=Stiffness_Matrices(X4);
 +
G4:=k4*Local_Global(K4,N,p4a,p4b);
 +
 
 +
K5:=Stiffness_Matrices(X5);
 +
G5:=k5*Local_Global(K5,N,p5a,p5b);
 +
 
 +
G:=G1+G2+G3+G4+G5;
 +
Ginitial:=G;
 +
 
 +
//implementing boundary condition
 +
for i in 1:N loop
 +
G[2*b1-1,i]:=0;
 +
G[2*b1,i]:=0;
 +
G[2*b2-1,i]:=0;
 +
G[2*b2,i]:=0;
 +
end for;
 +
 
 +
G[2*b1-1,2*b1-1]:=1;
 +
G[2*b1,2*b1]:=1;
 +
G[2*b2-1,2*b2-1]:=1;
 +
G[2*b2,2*b2]:=1;
 +
 
 +
//solving displacement
 +
Sol:=Gauss_Jordan(N,G,X);
 +
 
 +
//solving reaction force
 +
SolMat:=matrix(Sol);
 +
XMat:=matrix(X);
 +
R:=Reaction_Trusses(N,Ginitial,SolMat,XMat);
 +
 
 +
end Trusses;
 +
 
 +
</syntaxhighlight>
 +
 
 +
Fungsi Panggil
 +
 
 +
<syntaxhighlight lang="modelica">
 +
 
 +
function Reaction_Trusses
 +
 
 +
input Integer N;
 +
input Real A[N,N];
 +
input Real B[N,1];
 +
input Real C[N,1];
 +
Real X[N,1];
 +
output Real Sol[N];
 +
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;
 +
 
 +
</syntaxhighlight>
 +
 
 +
<syntaxhighlight lang="modelica">
 +
 
 +
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;
 +
 
 +
</syntaxhighlight>
 +
 
 +
<syntaxhighlight lang="modelica">
 +
 
 +
function Stiffness_Matrices
 +
 
 +
input Real A;
 +
Real Y;
 +
output Real X[4,4];
 +
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;
 +
 
 +
</syntaxhighlight>
 +
 
 +
<syntaxhighlight lang="modelica">
 +
 
 +
function Gauss_Jordan
 +
 
 +
input Integer N;
 +
input Real A[N,N];
 +
input Real B[N];
 +
output Real X[N];
 +
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;
 +
 
 +
</syntaxhighlight>
 +
 
 +
== '''Pertemuan Keempat Metode Numerik (02-12-2020)''' ==
 +
 
 +
=== '''Kuis 1 Metode Numerik Diagram Class dan Flowchart''' ===
 +
 
 +
Buatlah class diagram dan flowchart setiap class untuk coding dari Josiah Enrico!
 +
 
 +
Berikut adalah jawaban saya:
 +
 
 +
[[File:Kuis irul.jpg|700px|center]]
 +
 
 +
=== Tugas 4 Metode Numerik ===
 +
Kami diminta untuk menyelesaikan persoalan Space Truss (3D) dengan membuat flowchart, diagram class, dan coding modelicanya.
 +
 
 +
[[File:Soal_no_8.jpg|720px|center]]
 +
 
 +
Penyelesaian:
 +
 
 +
Saya buat terlebih dahulu flowchart dan diagram class
 +
 
 +
[[File:431124.jpg|700px|center]]
 +
 
 +
[[File:irul flowchart.jpg|700px|center]]
 +
 
 +
Kemudian saya membuat free body diagram dari sistem dan mencari data-data yang dibutuhkan.
 +
 
 +
[[File:MessageImage 1607498238406.jpg|720px|center]]
 +
 
 +
Setelah itu data-data yang sudah didapatkan diproses di dalam OpenModelica menggunakan referensi coding A. M. Fahmi.
 +
 
 +
Pertama mencari k tiap element terlebih dahulu menggunakan rumus  k=AE/L. Setelah itu bisa mencari nilai Ke.
 +
 
 +
[[File:IrulKelement.jpg|720px|center]]
 +
 
 +
Kemudian dibuat stiffness matrix global (Kg) dari tiap K element.
 +
 
 +
[[File:IrulKe.jpg|720px|center]]
 +
 
 +
Setelah itu semua stiffness matrix global dijumlahkan dan didapatkan sum stiffness matrix global (Kgtot).
 +
 
 +
[[File:Irul Kgtot.jpg|400px|center]]
 +
 
 +
Lalu tentukan boundaries pada sum stiffness matrix global.
 +
 
 +
[[File:Irulboundaryno8.jpg|400px|center]]
 +
 
 +
Kemudian untuk mencari nilai displacement (U) lainnya digunakan eliminasi Gauss Jordan dengan persamaan XU=F. Dimana X adalah stiffness matrix global yang sudah ditentukan boundarynya.
 +
 
 +
[[File:IrulGauss jordanno8.jpg|400px|center]]
 +
 
 +
Setelah itu mencari reaction menggunakan persamaan R=Kg*U - F.
 +
 
 +
[[File:Irul rf.jpg|400px|center]]
 +
 
 +
Langkah terakhir membuat sebuah Class untuk memanggil fungsi-fungsi diatas agar bisa melihat nilai U dan R.
 +
 
 +
[[File:Irul space truss.jpg|720px|center]]
 +
 
 +
Setelah di simulate, bisa dilihat nilai U dan R nya.
 +
 
 +
[[File:IrulHasil.jpg|250px|center]]
 +
 
 +
Video Penjelasan:
 +
 
 +
<div class="center" style="width: auto; margin-left: auto; margin-right: auto;">
 +
<youtube width="200" height="100">https://www.youtube.com/watch?v=BFNXobXrORI</youtube>
 +
</div>
 +
 
 +
== '''Pertemuan Kelima Metode Numerik (16-12-2020)''' ==
 +
Pada pertemuan kelima, kelas diisi oleh Bu Candra dengan materi aplikasi metode numerik dalam kasus metode numerik.
 +
Berikut adalah model yang dioperasikan:
 +
[[File:Brackopt.png|500px|center]]
 +
Berikut adalah fungsinya:
 +
[[File:Fxobj3.png|500px|center]]
 +
 
 +
== '''Tugas Besar''' ==
 +
Tugas besar yang diberikan untuk kelas metnum 02 dan 03 adalah melakukan optimasi pada rangka sederhana:
 +
[[File:Soal Tugas Besar.jpg|500px|center]]
 +
Dengan data sebagai berikut:
 +
[[File:Data Tugas Besar.jpg|500px|center]]
 +
Pada soal ini kami diharapkan dapat mendesain rangka batang dengan harga terjangkau dengan fungsi yang optimal.
 +
 
 +
Faktor atau variabel bebasnya meliputi : Harga, Material yang digunakan, cross section Dilakukan dengan metode optimasi dan membentuk curve fitting pada variabel harga
 +
 
 +
Asumsi yang digunakan untuk melakukan perhitungan ini antara lain:
 +
*Karena trusses, beban akan terdistribusi hanya pada node.
 +
*Safety factor minimal bernilai 2.
 +
*Batas displacement 0,001 m sebelum buckling (pada truss paling atas).
 +
*Ketinggian trusses pada tiap lantai sama yaitu 0,6 m.
 +
 
 +
Untuk jenis material yang sama:
 +
#Mencari harga untuk 6 ukuran batang dengan material yang sama yaitu SS304.
 +
#Mengitung nilai safety factor pada 6 ukuran batang dengan coding awal.
 +
#Membuat rasio antara safety factor dengan harga total.
 +
#Membuat persamaan antara rasio (safe/harga) dengan area dengan metode curve fitting.
 +
#Melakukan optimasi menggunakan metode golden section.
 +
 
 +
Untuk area penampang yang sama:
 +
#Mencari harga untuk 4 jenis material dengan area penampang yang sama yaitu 201 mm^2.
 +
#Mengitung nilai safety factor pada 4 jenis batang dengan coding awal.
 +
#Membuat rasio antara safety factor dengan harga total.
 +
#Membuat persamaan antara rasio (safe/harga) dengan jenis material dengan metode curve fitting.
 +
#Melakukan optimasi menggunakan metode golden section.
 +
 
 +
Berikut adalah codingan yang digunakan:
 +
 
 +
*Untuk perhitungan displacement, reaction force, stress, dan safety factor:
 +
model Trusses_3D_Tugas_Besar_Safety
 +
 +
//define initial variable
 +
parameter Integer Points=size(P,1); //Number of Points
 +
parameter Integer Trusses=size(C,1); //Number of Trusses
 +
parameter Real Yield=215e6; //Yield Strength (Pa)
 +
parameter Real Area=0.000201;  //Area L Profile (Dimension=0.035, Thickness=0,003) (m2)
 +
parameter Real Elas=193e9;    //Elasticity SS 304  (Pa)
 +
 +
//define connection
 +
parameter Integer C[:,2]=[1,5;
 +
                          2,6;
 +
                          3,7;
 +
                          4,8;
 +
                          5,6;  //1st floor
 +
                          6,7;  //1st floor
 +
                          7,8;  //1st floor
 +
                          5,8;  //1st floor
 +
                          5,9;
 +
                          6,10;
 +
                          7,11;
 +
                          8,12;
 +
                          9,10; //2nd floor
 +
                          10,11;//2nd floor
 +
                          11,12;//2nd floor
 +
                          9,12; //2nd floor
 +
                          9,13;
 +
                          10,14;
 +
                          11,15;
 +
                          12,16;
 +
                          13,14;//3rd floor
 +
                          14,15;//3rd floor
 +
                          15,16;//3rd floor
 +
                        13,16];//3rd floor
 +
                                                             
 +
//define coordinates (please put orderly)
 +
parameter Real P[:,6]=[0.3,-0.375,0,1,1,1;    //1
 +
                        -0.3,-0.375,0,1,1,1;    //2
 +
                        -0.3,0.375,0,1,1,1;    //3
 +
                        0.3,0.375,0,1,1,1;      //4
 +
                           
 +
                        0.3,-0.375,0.6,0,0,0;  //5
 +
                        -0.3,-0.375,0.6,0,0,0;  //6
 +
                        -0.3,0.375,0.6,0,0,0;  //7
 +
                        0.3,0.375,0.6,0,0,0;    //8
 +
                           
 +
                        0.3,-0.375,1.2,0,0,0;  //9
 +
                        -0.3,-0.375,1.2,0,0,0;  //10 
 +
                        -0.3,0.375,1.2,0,0,0;  //11
 +
                        0.3,0.375,1.2,0,0,0;    //12
 +
                           
 +
                        0.3,-0.375,1.8,0,0,0;  //13
 +
                        -0.3,-0.375,1.8,0,0,0;  //14
 +
                        -0.3,0.375,1.8,0,0,0;  //15
 +
                        0.3,0.375,1.8,0,0,0];  //16
 +
                         
 +
//define external force (please put orderly)
 +
parameter Real F[Points*3]={0,0,0,
 +
                            0,0,0,
 +
                            0,0,0,
 +
                            0,0,0,
 +
                            0,0,0,
 +
                            0,0,0,
 +
                            0,0,0,
 +
                            0,0,0,
 +
                            0,0,0,
 +
                            0,0,0,
 +
                            0,0,0,
 +
                            0,0,0,
 +
                            0,0,-500,
 +
                            0,0,-1000,
 +
                            0,0,-1000,
 +
                            0,0,-500};
 +
 +
//solution
 +
Real displacement[N], reaction[N];
 +
Real check[3];
 +
 +
Real stress1[Trusses];
 +
Real safety[Trusses];
 +
Real dis[3];
 +
Real Str[3];
 +
 
 +
protected
 +
parameter Integer N=3*Points;
 +
Real q1[3], q2[3], g[N,N], G[N,N], G_star[N,N], id[N,N]=identity(N), cx, cy, cz, L, X[3,3];
 +
Real err=10e-10, ers=10e-4;
 +
 +
algorithm
 +
//Creating Global Matrix
 +
G:=id;
 +
for i in 1:Trusses loop
 +
  for j in 1:3 loop
 +
  q1[j]:=P[C[i,1],j];
 +
  q2[j]:=P[C[i,2],j];
 +
  end for;
 +
     
 +
    //Solving Matrix
 +
    L:=Modelica.Math.Vectors.length(q2-q1);
 +
    cx:=(q2[1]-q1[1])/L;
 +
    cy:=(q2[2]-q1[2])/L;
 +
    cz:=(q2[3]-q1[3])/L;
 +
    X:=(Area*Elas/L)*[cx^2,cx*cy,cx*cz;
 +
                      cy*cx,cy^2,cy*cz;
 +
                      cz*cx,cz*cy,cz^2];
 +
 +
    //Transforming to global matrix
 +
    g:=zeros(N,N);
 +
    for m,n in 1:3 loop
 +
      g[3*(C[i,1]-1)+m,3*(C[i,1]-1)+n]:=X[m,n];
 +
      g[3*(C[i,2]-1)+m,3*(C[i,2]-1)+n]:=X[m,n];
 +
      g[3*(C[i,2]-1)+m,3*(C[i,1]-1)+n]:=-X[m,n];
 +
      g[3*(C[i,1]-1)+m,3*(C[i,2]-1)+n]:=-X[m,n];
 +
    end for; 
 +
 +
  G_star:=G+g;
 +
  G:=G_star;
 +
end for;
 +
 +
//Implementing boundary
 +
for x in 1:Points loop
 +
  if P[x,4] <> 0 then
 +
    for a in 1:Points*3 loop
 +
      G[(x*3)-2,a]:=0;
 +
      G[(x*3)-2,(x*3)-2]:=1;
 +
    end for;
 +
  end if;
 +
  if P[x,5] <> 0 then
 +
    for a in 1:Points*3 loop
 +
      G[(x*3)-1,a]:=0;
 +
      G[(x*3)-1,(x*3)-1]:=1;
 +
    end for;
 +
  end if;
 +
  if P[x,6] <> 0 then
 +
    for a in 1:Points*3 loop
 +
      G[x*3,a]:=0;
 +
      G[x*3,x*3]:=1;
 +
    end for;
 +
  end if;
 +
end for;
 +
 +
//Solving displacement
 +
displacement:=Modelica.Math.Matrices.solve(G,F);
 +
 +
//Solving reaction
 +
reaction:=(G_star*displacement)-F;
 +
 +
//Eliminating float error
 +
for i in 1:N loop
 +
  reaction[i]:=if abs(reaction[i])<=err then 0 else reaction[i];
 +
  displacement[i]:=if abs(displacement[i])<=err then 0 else displacement[i];
 +
end for;
 +
 +
//Checking Force
 +
check[1]:=sum({reaction[i] for i in (1:3:(N-2))})+sum({F[i] for i in (1:3:(N-2))});
 +
check[2]:=sum({reaction[i] for i in (2:3:(N-1))})+sum({F[i] for i in (2:3:(N-1))});
 +
check[3]:=sum({reaction[i] for i in (3:3:N)})+sum({F[i] for i in (3:3:N)});
 +
 
 +
for i in 1:3 loop
 +
  check[i] := if abs(check[i])<=ers then 0 else check[i];
 +
end for;
 +
 +
//Calculating stress in each truss
 +
for i in 1:Trusses loop
 +
for j in 1:3 loop
 +
  q1[j]:=P[C[i,1],j];
 +
  q2[j]:=P[C[i,2],j];
 +
  dis[j]:=abs(displacement[3*(C[i,1]-1)+j]-displacement[3*(C[i,2]-1)+j]);
 +
end for;
 +
     
 +
    //Solving Matrix
 +
    L:=Modelica.Math.Vectors.length(q2-q1);
 +
    cx:=(q2[1]-q1[1])/L;
 +
    cy:=(q2[2]-q1[2])/L;
 +
    cz:=(q2[3]-q1[3])/L;
 +
    X:=(Elas/L)*[cx^2,cx*cy,cx*cz;
 +
                cy*cx,cy^2,cy*cz;
 +
                cz*cx,cz*cy,cz^2];
 +
   
 +
    Str:=(X*dis);
 +
    stress1[i]:=Modelica.Math.Vectors.length(Str);
 +
end for;
 +
 +
//Safety factor
 +
for i in 1:Trusses loop
 +
  if stress1[i]>0 then
 +
    safety[i]:=Yield/stress1[i];
 +
  else
 +
    safety[i]:=0;
 +
  end if;
 +
end for;
 +
 +
end Trusses_3D_Tugas_Besar_Safety;
 +
 
 +
Berikut adalah variasi 6 luas area untuk material tetap yaitu SS304 dan variasi 4 material untuk luas area yang sama yaitu 0,000201 m^2
 +
 
 +
[[File:Data irul.jpg|500px|center]]
 +
 
 +
Berdasarkan hasil data yang telah diperoleh, bisa didapatkan Luas area dan material yang optimal digunakan pada rangka yang akan dibuat dengan menggunakan optimasi dengan curve fitting dan golden section
 +
 
 +
*Untuk membuat kurva curve fitting:
 +
function Curve_Fitting
 +
 +
input Real X[:];
 +
input Real Y[size(X,1)];
 +
input Integer order=2;
 +
output Real Coe[order+1];
 +
 +
protected
 +
Real Z[size(X,1),order+1];
 +
Real ZTr[order+1,size(X,1)];
 +
Real A[order+1,order+1];
 +
Real B[order+1];
 +
 +
algorithm
 +
 +
for i in 1:size(X,1) loop
 +
  for j in 1:(order+1) loop
 +
  Z[i,j]:=X[i]^(order+1-j);
 +
  end for;
 +
end for;
 +
ZTr:=transpose(Z);
 +
 +
A:=ZTr*Z;
 +
B:=ZTr*Y;
 +
Coe:=Modelica.Math.Matrices.solve(A,B);
 +
 +
end Curve_Fitting;
 +
 
 +
* Untuk golden section material tetap:
 +
 
 +
{| class="wikitable"
 +
|-
 +
| style='border-style: none  none  solid  solid;' |
 +
 
 +
model Opt_Gold
 +
 
 +
parameter Real xd[:]={0.000144,0.000171,0.000184,0.000201,0.000224,0.000231};
 +
parameter Real yd[size(xd,1)]={845155,985330,1053955,1144809,1269736,1308215};
 +
parameter Real xlo=144e-6;
 +
parameter Real xhi=231e-6;
 +
parameter Integer N=10; // maximum iteration
 +
parameter Real es=0.0001; // maximum error
 +
 
 +
Real f1[N], f2[N], x1[N], x2[N], ea[N], y[3];
 +
Real xopt,  fx;
 +
protected
 +
Real d, xl, xu, xint, R=(5^(1/2)-1)/2;
 +
 
 +
algorithm
 +
xl := xlo;
 +
xu := xhi;
 +
y  := Curve_Fitting(xd,yd);
 +
 +
for i in 1:N loop
 +
d:= R*(xu-xl);
 +
x1[i]:=xl+d;
 +
x2[i]:=xu-d;
 +
f1[i]:=y[1]*x1[i]^2+y[2]*x1[i]+y[3];
 +
f2[i]:=y[1]*x2[i]^2+y[2]*x2[i]+y[3];
 +
xint:=xu-xl;
 +
 +
if f1[i]>f2[i] then
 +
  xl:=x2[i];
 +
  xopt:=x1[i];
 +
  fx:=f1[i];
 +
  else
 +
    xu:=x1[i];
 +
    xopt:=x2[i];
 +
    fx:=f2[i];
 +
end if;
 +
 +
ea[i]:=(1-R)*abs((xint)/xopt);
 +
if ea[i]<es then
 +
  break;
 +
end if;
 +
end for;
 +
 
 +
end Opt_Gold;
 +
 
 +
|}
 +
 
 +
* Untuk golden section luas area tetap:
 +
 
 +
{| class="wikitable"
 +
|-
 +
| style='border-style: none  none  solid  solid;' |
 +
 
 +
model Opt_Gold
 +
 
 +
parameter Real xd[:]={193000000000,195000000000,197000000000,200000000000};
 +
parameter Real yd[size(xd,1)]={1109361,732878,531151,538340};
 +
parameter Real xlo=193e9;
 +
parameter Real xhi=200e9;
 +
parameter Integer N=10; // maximum iteration
 +
parameter Real es=0.0001; // maximum error
 +
 
 +
Real f1[N], f2[N], x1[N], x2[N], ea[N], y[3];
 +
Real xopt,  fx;
 +
protected
 +
Real d, xl, xu, xint, R=(5^(1/2)-1)/2;
 +
 
 +
algorithm
 +
xl := xlo;
 +
xu := xhi;
 +
y  := Curve_Fitting(xd,yd);
 +
 +
for i in 1:N loop
 +
d:= R*(xu-xl);
 +
x1[i]:=xl+d;
 +
x2[i]:=xu-d;
 +
f1[i]:=y[1]*x1[i]^2+y[2]*x1[i]+y[3];
 +
f2[i]:=y[1]*x2[i]^2+y[2]*x2[i]+y[3];
 +
xint:=xu-xl;
 +
 +
if f1[i]>f2[i] then
 +
  xl:=x2[i];
 +
  xopt:=x1[i];
 +
  fx:=f1[i];
 +
  else
 +
    xu:=x1[i];
 +
    xopt:=x2[i];
 +
    fx:=f2[i];
 +
end if;
 +
 +
ea[i]:=(1-R)*abs((xint)/xopt);
 +
if ea[i]<es then
 +
  break;
 +
end if;
 +
end for;
 +
 
 +
end Opt_Gold;
 +
 
 +
|}
 +
 
 +
*Hasil Perhitungan dan Kesimpulan
 +
 
 +
[[File:Hasil opt area irul.jpg|500px|center]]
 +
 
 +
Nilai luas area penampang paling optimum untuk material SS304 adalah 230,563 mm^2
 +
 
 +
[[File:Hasil opt material irul.jpg|500px|center]]
 +
 
 +
Material yang paling optimum yang dapat digunakan untuk luas penampang 201 mm^2 adalah material dengan nilai elastisitas 193035000000 N/m^2 yaitu material yang paling mendekati adalah SS304.
 +
 
 +
 
 +
== '''UAS''' ==
 +
Berikut adalah hasil jawaban UAS saya:
 +
 
 +
[[File:No 1irul.jpg|500px|center]]
 +
 
 +
 
 +
[[File:No 2irul.jpg|500px|center]]
 +
 
 +
 
 +
[[File:No 3irul.jpg|500px|center]]
 +
 
 +
 
 +
[[File:No 4.jpg|500px|center]]
 +
 
 +
 
 +
[[File:No 5n6irul.jpg|500px|center]]
 +
 
 +
 
 +
[[File:No 7irul.jpg|500px|center]]
 +
 
 +
Berikut adalah codingan yang digunakan untuk soal no 7
 +
 
 +
[[File:Coding no 7 irul(1).png|500px|center]]
 +
 
 +
 
 +
[[File:Coding no 7 irul(2).png|500px|center]]
 +
 
 +
 
 +
[[File:Coding no 7 irul(3).png|500px|center]]

Latest revision as of 18:25, 14 January 2021

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

Profile
Center
Nama Lengkap Moh Khairul Imam Assidiqqi
NPM 1906301210
Jurusan Teknik Mesin
Alamat Email moh.khairul@ui.ac.id

Perkenalan Singkat

Assalamu'alaikum Wr. Wb. Perkenalkan nama saya Moh Khairul Imam Assidiqqi. Saya adalah mahasiswa Departemen Teknik Mesin angkatan 2019.


Pertemuan Pertama Metode Numerik (11-11-2020)

Pada hari Rabu, 11 November 2020 adalah pertemuan pertama kelas Metode Numerik bersama Pak Dr. Ir. Ahmad Indra Siswantara. Pak Dai memberikan penjelasan terlebih dahulu bagaimana cara menggunakan Wiki AIR. Kemudian beliau menjelaskan apa itu metode numerik dan untuk apa kita mempelajarinya.

Ada 4 tujuan mempelajari metode numerik:

1. Memahami konsep dan prinsip dasar di dalam metode numerik.

2. Dapat menerapkan pemahaman terhadap konsep di dalam permodelan numerik.

3. Mampu menerapkan metode numerik di dalam persoalan keteknikan.

4. Mendapat nilai tambah sehingga menjadi orang yang beradab.

Setelah itu Pak Dai menjelaskan secara singkat tentang Open Modelica.

Tugas 1 Metode Numerik

Sebelum kelas berakhir, Pak Dai memberikan kami tugas untuk mempelajari Open Modelica. Setelah itu kami ditugaskan untuk membuat video tutorial cara menggunakan Open Modelica.

Berikut adalah hasil tugas saya:

Pertemuan Kedua Metode Numerik (18-11-2020)

Pada pertemuan kedua dengan Pak Dai, kami diberikan pelajaran yang sangat berharga bahwa kita harus menjadi orang yang beruntung. Maksudnya adalah kita harus menjalani hari ini lebih baik dari hari kemarin. Dan jangan menjadi orang yang merugi yang hari malah lebih buruk dari hari kemarin.

Setelah itu Pak Dai juga menyuruh kami untuk menayangkan tugas-tugas kami pada minggu pertama. Kami diperbolehkan bertanya apapun yang masih kami belum ketahui. Kemudian Pak Dai mengajarkan kami tentang Class dan Function di OpenModelica dan Pak Dai juga mengajarkan bahwa suatu fungsi bisa dipanggil ke sebuah kelas.

Tugas 2 Metode Numerik

Di akhir kelas, Pak Dai memberikan kami tugas untuk membuat video dimana kami diminta untuk membuat sebuah fungsi berupa persamaan aljabar simultan dengan variabel array kemudian membuat class untuk memanggil fungsi tersebut.

Berikut adalah hasil tugas saya:

function

function Gauss
input Real A[5,5];
input Real B[5];
output Real X[5];

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

class

class SPL_5_Variabel
parameter Real A[5,5]=[2,-2,0,4,2;
                      -2,4,2,0,5;
                      2,-2,2,-2,0;
                      0,4,2,4,4;
                      4,2,2,4,-2];
parameter Real B[5]={2,4,6,8,-12};
Real X[5];

equation
X=Gauss(A,B);                  
end SPL_5_Variabel;


Pertemuan Ketiga Metode Numerik (25-11-2020)

Pada pertemuan ketiga, Pak Dai memaparkan tiga aplikasi metode numerik yang sering digunakan dalam menyelesaikan permasalahan teknik, pertama ada Computation Fluid Dynamics (CFD), lalu Finite Element Analysis, dan Metode Stokastik. Setelah itu Pak Dai meminta beberapa mahasiswa untuk mereview tugas-tugas yang telah diberikan sebelumnya. Salah satu teman kami yaitu Josiah memberikan sharing mengenai aljabar simultan dan variabel array.

Kemudian Pak Dai menjelaskan kembali mengenai metode Gauss. Pak dai mendorong kami untuk membuat code sendiri untuk menyelesaikan Gauss Jordan. Salah satu mahasiswa, yaitu Cristo memberikan sharing mengenai code yang telah ia buat untuk Gauss Jordan, berikut code modelica untuk Gauss Jordan dari Cristo:

// Gauss-Jordan Algorithm
// Transforms input matrix A into reduced row echelon form matrix B
// Christopher S.E. November 2020
input Real [:,:] A;     // An augmented matrix of m*n
output Real [:,:] B;    // Output matrix in reduced row echelon form
// Local variables
protected
Integer h = 1;          // Initialize pivot row
Integer k = 1;          // Initialize pivot column
Integer m = size(A,1);  // Number of rows in matrix
Integer n = size(A,2);  // Number of columns in matrix
Integer c = 0;          // Index counter
Integer max_row;        // Row index of max number in pivot column
Real [:] pivot_column;  // Vector containing pivot column data
Real [:] pivot_row;     // Vector containing backwards pivot row data
Real [:,:] temp_array;  // Stores matrix data when switching rows
Real r;                 // Ratio value used for row operations
// Limit to handle floating point errors
Real float_error = 10e-10;
algorithm
// Transfer input matrix A into variable B
B := A;
while h <= m and k <= n loop
 
// Dealing with floating point errors
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 the pivot
   pivot_column := {B[i,h] for i in h:m};
 
   // Get position index of lowest row with greatest pivot number
   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;
 
 // No pivot in this column, move on to next column
 if B[max_row, k] == 0 then
   k := k+1;
 
 else
   // Swap Rows h <-> max_row
   temp_array := B;
   temp_array[h] := B[max_row];
   temp_array[max_row] := B[h];
   B:= temp_array;
   
   // Divide pivot row by pivot number
   B[h] := B[h]/B[h,k];
   
   // For all rows below the pivot
   for i in (h+1):m loop
     
     // Store the ratio of the row to the pivot
     r := B[i,k] / B[h,k];
     
     // Set lower part of pivot column to zero
     B[i,k] := 0;
     
     // Operations on the remaining row elements
     for j in (k+1):n loop
         B[i,j] := B[i,j] - B[h,j] * r;
     end for;
     
   end for;
   
   // Move on to next pivot row and column
   h := h+1;
   k := k+1;
   
 end if;
 
end while;
// The matrix is now in row echelon form
// Set values of (h,k) to (m,n)
h := m;
k := n;
while h >= 1 and k >=1 loop
 // Dealing with floating point errors
 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 the 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 on to next row
 if B[h, k] == 0 then
   h := h-1;
   
 else
   
   // Perform row operations
   for i in 1:(h-1) loop
     r := B[i,k];
     B[i] := B[i] - B[h] * r;
   end for;
   
   // Move on to next pivot row and column
   h := h-1;
   k := k-1;
 end if;
end while;
// The matrix is now in reduced row echelon form
end GaussJordan;


Tugas 3 Metode Numerik

Di akhir kelas, Pak Dai memberikan kami tugas yaitu menyelesaikan persoalan berikut:

Pr3-1.png

Berikut adalah penyelesaiannya:

class Trusses

parameter Integer N=8; //Global matrice = 2*points connected
parameter Real A=0.001; //Area m2
parameter Real E=200e9; //Pa
Real G[N,N]; //global
Real Ginitial[N,N]; //global
Real Sol[N]; //global dispplacement
Real X[N]={0,0,-1035.2762,-3863.7033,0,0,-1035.2762,-3863.7033};
Real R[N]; //global reaction force
Real SolMat[N,1];
Real XMat[N,1];

//boundary condition
Integer b1=1;
Integer b2=3;

//truss 1
parameter Real X1=0; //degree between truss
Real k1=A*E/1;
Real K1[4,4]; //stiffness matrice
Integer p1a=1;
Integer p1b=2;
Real G1[N,N];

//truss 2
parameter Real X2=0; //degree between truss
Real k2=A*E/1;
Real K2[4,4]; //stiffness matrice
Integer p2a=2;
Integer p2b=3;
Real G2[N,N];

//truss 3
parameter Real X3=90; //degree between truss
Real k3=A*E/1.25;
Real K3[4,4]; //stiffness matrice
Integer p3a=2;
Integer p3b=4;
Real G3[N,N];

//truss 4
parameter Real X4=90+38.6598; //degree between truss
Real k4=A*E/1.6;
Real K4[4,4]; //stiffness matrice
Integer p4a=1;
Integer p4b=4;
Real G4[N,N];

//truss 5
parameter Real X5=90-38.6598; //degree between truss
Real k5=A*E/1.6;
Real K5[4,4]; //stiffness matrice
Integer p5a=3;
Integer p5b=4;
Real G5[N,N];

/*
for each truss, please ensure pXa is lower then pXb (X represents truss element number)
*/

algorithm

//creating global matrice
K1:=Stiffness_Matrices(X1);
G1:=k1*Local_Global(K1,N,p1a,p1b);

K2:=Stiffness_Matrices(X2);
G2:=k2*Local_Global(K2,N,p2a,p2b);

K3:=Stiffness_Matrices(X3);
G3:=k3*Local_Global(K3,N,p3a,p3b);

K4:=Stiffness_Matrices(X4);
G4:=k4*Local_Global(K4,N,p4a,p4b);

K5:=Stiffness_Matrices(X5);
G5:=k5*Local_Global(K5,N,p5a,p5b);

G:=G1+G2+G3+G4+G5;
Ginitial:=G;

//implementing boundary condition
for i in 1:N loop
 G[2*b1-1,i]:=0;
 G[2*b1,i]:=0;
 G[2*b2-1,i]:=0;
 G[2*b2,i]:=0;
end for;

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

//solving displacement
Sol:=Gauss_Jordan(N,G,X);

//solving reaction force
SolMat:=matrix(Sol);
XMat:=matrix(X);
R:=Reaction_Trusses(N,Ginitial,SolMat,XMat);

end Trusses;

Fungsi Panggil

function Reaction_Trusses

input Integer N;
input Real A[N,N];
input Real B[N,1];
input Real C[N,1];
Real X[N,1];
output Real Sol[N];
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;
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;
function Stiffness_Matrices

input Real A;
Real Y;
output Real X[4,4];
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;
function Gauss_Jordan

input Integer N;
input Real A[N,N];
input Real B[N];
output Real X[N];
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;

Pertemuan Keempat Metode Numerik (02-12-2020)

Kuis 1 Metode Numerik Diagram Class dan Flowchart

Buatlah class diagram dan flowchart setiap class untuk coding dari Josiah Enrico!

Berikut adalah jawaban saya:

Kuis irul.jpg

Tugas 4 Metode Numerik

Kami diminta untuk menyelesaikan persoalan Space Truss (3D) dengan membuat flowchart, diagram class, dan coding modelicanya.

Soal no 8.jpg

Penyelesaian:

Saya buat terlebih dahulu flowchart dan diagram class

431124.jpg
Irul flowchart.jpg

Kemudian saya membuat free body diagram dari sistem dan mencari data-data yang dibutuhkan.

MessageImage 1607498238406.jpg

Setelah itu data-data yang sudah didapatkan diproses di dalam OpenModelica menggunakan referensi coding A. M. Fahmi.

Pertama mencari k tiap element terlebih dahulu menggunakan rumus k=AE/L. Setelah itu bisa mencari nilai Ke.

IrulKelement.jpg

Kemudian dibuat stiffness matrix global (Kg) dari tiap K element.

IrulKe.jpg

Setelah itu semua stiffness matrix global dijumlahkan dan didapatkan sum stiffness matrix global (Kgtot).

Irul Kgtot.jpg

Lalu tentukan boundaries pada sum stiffness matrix global.

Irulboundaryno8.jpg

Kemudian untuk mencari nilai displacement (U) lainnya digunakan eliminasi Gauss Jordan dengan persamaan XU=F. Dimana X adalah stiffness matrix global yang sudah ditentukan boundarynya.

IrulGauss jordanno8.jpg

Setelah itu mencari reaction menggunakan persamaan R=Kg*U - F.

Irul rf.jpg

Langkah terakhir membuat sebuah Class untuk memanggil fungsi-fungsi diatas agar bisa melihat nilai U dan R.

Irul space truss.jpg

Setelah di simulate, bisa dilihat nilai U dan R nya.

IrulHasil.jpg

Video Penjelasan:

Pertemuan Kelima Metode Numerik (16-12-2020)

Pada pertemuan kelima, kelas diisi oleh Bu Candra dengan materi aplikasi metode numerik dalam kasus metode numerik. Berikut adalah model yang dioperasikan:

Brackopt.png

Berikut adalah fungsinya:

Fxobj3.png

Tugas Besar

Tugas besar yang diberikan untuk kelas metnum 02 dan 03 adalah melakukan optimasi pada rangka sederhana:

Soal Tugas Besar.jpg

Dengan data sebagai berikut:

Data Tugas Besar.jpg

Pada soal ini kami diharapkan dapat mendesain rangka batang dengan harga terjangkau dengan fungsi yang optimal.

Faktor atau variabel bebasnya meliputi : Harga, Material yang digunakan, cross section Dilakukan dengan metode optimasi dan membentuk curve fitting pada variabel harga

Asumsi yang digunakan untuk melakukan perhitungan ini antara lain:

  • Karena trusses, beban akan terdistribusi hanya pada node.
  • Safety factor minimal bernilai 2.
  • Batas displacement 0,001 m sebelum buckling (pada truss paling atas).
  • Ketinggian trusses pada tiap lantai sama yaitu 0,6 m.

Untuk jenis material yang sama:

  1. Mencari harga untuk 6 ukuran batang dengan material yang sama yaitu SS304.
  2. Mengitung nilai safety factor pada 6 ukuran batang dengan coding awal.
  3. Membuat rasio antara safety factor dengan harga total.
  4. Membuat persamaan antara rasio (safe/harga) dengan area dengan metode curve fitting.
  5. Melakukan optimasi menggunakan metode golden section.

Untuk area penampang yang sama:

  1. Mencari harga untuk 4 jenis material dengan area penampang yang sama yaitu 201 mm^2.
  2. Mengitung nilai safety factor pada 4 jenis batang dengan coding awal.
  3. Membuat rasio antara safety factor dengan harga total.
  4. Membuat persamaan antara rasio (safe/harga) dengan jenis material dengan metode curve fitting.
  5. Melakukan optimasi menggunakan metode golden section.

Berikut adalah codingan yang digunakan:

  • Untuk perhitungan displacement, reaction force, stress, dan safety factor:
model Trusses_3D_Tugas_Besar_Safety

//define initial variable
parameter Integer Points=size(P,1); //Number of Points
parameter Integer Trusses=size(C,1); //Number of Trusses
parameter Real Yield=215e6; //Yield Strength (Pa)
parameter Real Area=0.000201;   //Area L Profile (Dimension=0.035, Thickness=0,003) (m2)
parameter Real Elas=193e9;     //Elasticity SS 304  (Pa)

//define connection
parameter Integer C[:,2]=[1,5; 
                          2,6;
                          3,7;
                          4,8;
                          5,6;  //1st floor
                          6,7;  //1st floor
                          7,8;  //1st floor
                          5,8;  //1st floor
                          5,9;
                         6,10;
                         7,11;
                         8,12;
                         9,10; //2nd floor
                         10,11;//2nd floor 
                         11,12;//2nd floor
                          9,12; //2nd floor
                          9,13;
                         10,14;
                         11,15;
                         12,16;
                         13,14;//3rd floor
                         14,15;//3rd floor
                         15,16;//3rd floor
                        13,16];//3rd floor
                                                              
//define coordinates (please put orderly)
parameter Real P[:,6]=[0.3,-0.375,0,1,1,1;     //1
                       -0.3,-0.375,0,1,1,1;    //2
                       -0.3,0.375,0,1,1,1;     //3
                       0.3,0.375,0,1,1,1;      //4
                           
                       0.3,-0.375,0.6,0,0,0;   //5
                       -0.3,-0.375,0.6,0,0,0;  //6
                       -0.3,0.375,0.6,0,0,0;   //7
                       0.3,0.375,0.6,0,0,0;    //8
                            
                       0.3,-0.375,1.2,0,0,0;   //9
                       -0.3,-0.375,1.2,0,0,0;  //10  
                       -0.3,0.375,1.2,0,0,0;   //11
                       0.3,0.375,1.2,0,0,0;    //12
                            
                       0.3,-0.375,1.8,0,0,0;   //13
                       -0.3,-0.375,1.8,0,0,0;  //14
                       -0.3,0.375,1.8,0,0,0;   //15
                       0.3,0.375,1.8,0,0,0];   //16
                          
//define external force (please put orderly)
parameter Real F[Points*3]={0,0,0,
                            0,0,0, 
                            0,0,0, 
                            0,0,0, 
                            0,0,0, 
                            0,0,0, 
                            0,0,0, 
                            0,0,0, 
                            0,0,0, 
                            0,0,0, 
                            0,0,0, 
                            0,0,0, 
                            0,0,-500, 
                            0,0,-1000, 
                            0,0,-1000, 
                            0,0,-500}; 

//solution
Real displacement[N], reaction[N];
Real check[3];

Real stress1[Trusses];
Real safety[Trusses];
Real dis[3];
Real Str[3];
 
protected
parameter Integer N=3*Points;
Real q1[3], q2[3], g[N,N], G[N,N], G_star[N,N], id[N,N]=identity(N), cx, cy, cz, L, X[3,3];
Real err=10e-10, ers=10e-4;

algorithm
//Creating Global Matrix
G:=id;
for i in 1:Trusses loop
 for j in 1:3 loop
  q1[j]:=P[C[i,1],j];
  q2[j]:=P[C[i,2],j];
 end for;
      
   //Solving Matrix
   L:=Modelica.Math.Vectors.length(q2-q1);
   cx:=(q2[1]-q1[1])/L;
   cy:=(q2[2]-q1[2])/L;
   cz:=(q2[3]-q1[3])/L; 
   X:=(Area*Elas/L)*[cx^2,cx*cy,cx*cz;
                     cy*cx,cy^2,cy*cz;
                     cz*cx,cz*cy,cz^2];

   //Transforming to global matrix
   g:=zeros(N,N); 
   for m,n in 1:3 loop
     g[3*(C[i,1]-1)+m,3*(C[i,1]-1)+n]:=X[m,n];
     g[3*(C[i,2]-1)+m,3*(C[i,2]-1)+n]:=X[m,n];
     g[3*(C[i,2]-1)+m,3*(C[i,1]-1)+n]:=-X[m,n];
     g[3*(C[i,1]-1)+m,3*(C[i,2]-1)+n]:=-X[m,n];
   end for;  

 G_star:=G+g;
 G:=G_star;
end for;

//Implementing boundary
for x in 1:Points loop
 if P[x,4] <> 0 then
   for a in 1:Points*3 loop
     G[(x*3)-2,a]:=0;
     G[(x*3)-2,(x*3)-2]:=1;
   end for;
 end if;
 if P[x,5] <> 0 then
   for a in 1:Points*3 loop
     G[(x*3)-1,a]:=0;
     G[(x*3)-1,(x*3)-1]:=1;
   end for;
 end if;
 if P[x,6] <> 0 then
   for a in 1:Points*3 loop
     G[x*3,a]:=0;
     G[x*3,x*3]:=1;
   end for;
 end if;
end for;

//Solving displacement
displacement:=Modelica.Math.Matrices.solve(G,F);

//Solving reaction
reaction:=(G_star*displacement)-F;

//Eliminating float error
for i in 1:N loop
 reaction[i]:=if abs(reaction[i])<=err then 0 else reaction[i];
 displacement[i]:=if abs(displacement[i])<=err then 0 else displacement[i];
end for;

//Checking Force
check[1]:=sum({reaction[i] for i in (1:3:(N-2))})+sum({F[i] for i in (1:3:(N-2))});
check[2]:=sum({reaction[i] for i in (2:3:(N-1))})+sum({F[i] for i in (2:3:(N-1))});
check[3]:=sum({reaction[i] for i in (3:3:N)})+sum({F[i] for i in (3:3:N)});
  
for i in 1:3 loop
 check[i] := if abs(check[i])<=ers then 0 else check[i];
end for;

//Calculating stress in each truss
for i in 1:Trusses loop
for j in 1:3 loop
  q1[j]:=P[C[i,1],j];
  q2[j]:=P[C[i,2],j];
  dis[j]:=abs(displacement[3*(C[i,1]-1)+j]-displacement[3*(C[i,2]-1)+j]);
end for;
      
   //Solving Matrix
   L:=Modelica.Math.Vectors.length(q2-q1);
   cx:=(q2[1]-q1[1])/L;
   cy:=(q2[2]-q1[2])/L;
   cz:=(q2[3]-q1[3])/L; 
   X:=(Elas/L)*[cx^2,cx*cy,cx*cz;
                cy*cx,cy^2,cy*cz;
                cz*cx,cz*cy,cz^2];
   
   Str:=(X*dis);
   stress1[i]:=Modelica.Math.Vectors.length(Str);
end for;

//Safety factor
for i in 1:Trusses loop
 if stress1[i]>0 then
   safety[i]:=Yield/stress1[i];
 else
   safety[i]:=0;
 end if; 
end for;

end Trusses_3D_Tugas_Besar_Safety;

Berikut adalah variasi 6 luas area untuk material tetap yaitu SS304 dan variasi 4 material untuk luas area yang sama yaitu 0,000201 m^2

Data irul.jpg

Berdasarkan hasil data yang telah diperoleh, bisa didapatkan Luas area dan material yang optimal digunakan pada rangka yang akan dibuat dengan menggunakan optimasi dengan curve fitting dan golden section

  • Untuk membuat kurva curve fitting:
function Curve_Fitting

input Real X[:];
input Real Y[size(X,1)];
input Integer order=2;
output Real Coe[order+1];

protected
Real Z[size(X,1),order+1];
Real ZTr[order+1,size(X,1)];
Real A[order+1,order+1];
Real B[order+1];

algorithm

for i in 1:size(X,1) loop
 for j in 1:(order+1) loop
 Z[i,j]:=X[i]^(order+1-j);
 end for;
end for;
ZTr:=transpose(Z);

A:=ZTr*Z;
B:=ZTr*Y;
Coe:=Modelica.Math.Matrices.solve(A,B);

end Curve_Fitting;
  • Untuk golden section material tetap:
model Opt_Gold
parameter Real xd[:]={0.000144,0.000171,0.000184,0.000201,0.000224,0.000231};
parameter Real yd[size(xd,1)]={845155,985330,1053955,1144809,1269736,1308215};
parameter Real xlo=144e-6;
parameter Real xhi=231e-6; 
parameter Integer N=10; // maximum iteration
parameter Real es=0.0001; // maximum error
Real f1[N], f2[N], x1[N], x2[N], ea[N], y[3];
Real xopt,  fx;
protected
Real d, xl, xu, xint, R=(5^(1/2)-1)/2;
algorithm
xl := xlo; 
xu := xhi;
y  := Curve_Fitting(xd,yd);

for i in 1:N loop
d:= R*(xu-xl);
x1[i]:=xl+d;
x2[i]:=xu-d;
f1[i]:=y[1]*x1[i]^2+y[2]*x1[i]+y[3];
f2[i]:=y[1]*x2[i]^2+y[2]*x2[i]+y[3];
xint:=xu-xl;

if f1[i]>f2[i] then
  xl:=x2[i];
  xopt:=x1[i];
  fx:=f1[i];
  else
    xu:=x1[i];
    xopt:=x2[i];
    fx:=f2[i];
end if;

ea[i]:=(1-R)*abs((xint)/xopt);
if ea[i]<es then
  break;
end if;
end for;
end Opt_Gold;
  • Untuk golden section luas area tetap:
model Opt_Gold
parameter Real xd[:]={193000000000,195000000000,197000000000,200000000000};
parameter Real yd[size(xd,1)]={1109361,732878,531151,538340};
parameter Real xlo=193e9;
parameter Real xhi=200e9; 
parameter Integer N=10; // maximum iteration
parameter Real es=0.0001; // maximum error
Real f1[N], f2[N], x1[N], x2[N], ea[N], y[3];
Real xopt,  fx;
protected
Real d, xl, xu, xint, R=(5^(1/2)-1)/2;
algorithm
xl := xlo; 
xu := xhi;
y  := Curve_Fitting(xd,yd);

for i in 1:N loop
d:= R*(xu-xl);
x1[i]:=xl+d;
x2[i]:=xu-d;
f1[i]:=y[1]*x1[i]^2+y[2]*x1[i]+y[3];
f2[i]:=y[1]*x2[i]^2+y[2]*x2[i]+y[3];
xint:=xu-xl;

if f1[i]>f2[i] then
  xl:=x2[i];
  xopt:=x1[i];
  fx:=f1[i];
  else
    xu:=x1[i];
    xopt:=x2[i];
    fx:=f2[i];
end if;

ea[i]:=(1-R)*abs((xint)/xopt);
if ea[i]<es then
  break;
end if;
end for;
end Opt_Gold;
  • Hasil Perhitungan dan Kesimpulan
Hasil opt area irul.jpg

Nilai luas area penampang paling optimum untuk material SS304 adalah 230,563 mm^2

Hasil opt material irul.jpg

Material yang paling optimum yang dapat digunakan untuk luas penampang 201 mm^2 adalah material dengan nilai elastisitas 193035000000 N/m^2 yaitu material yang paling mendekati adalah SS304.


UAS

Berikut adalah hasil jawaban UAS saya:

No 1irul.jpg


No 2irul.jpg


No 3irul.jpg


No 4.jpg


No 5n6irul.jpg


No 7irul.jpg

Berikut adalah codingan yang digunakan untuk soal no 7

Coding no 7 irul(1).png


Coding no 7 irul(2).png


Coding no 7 irul(3).png