Difference between revisions of "Yogi Gunawan Atmawijaya"

From ccitonlinewiki
Jump to: navigation, search
(Tugas 1)
 
(109 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 +
=Biodata=
 +
 +
[[File:Foto_Yogi.jpg|200px|thumb|left|Yogi Gunawan Atmawijaya]]
 +
Nama          : Yogi Gunawan Atmawijaya
 +
 +
NPM S1        : 1806201005
 +
 +
NPM S2        : 2406468690
 +
 +
Tanggal Lahir  : 27 Maret 2000
 +
 +
Tempat Tinggal : Tangerang
 +
 +
 +
S1
 +
 
Saya adalah mahasiswa FTUI angkatan 2018 jurusan Teknik Mesin.  
 
Saya adalah mahasiswa FTUI angkatan 2018 jurusan Teknik Mesin.  
  
 
Saya memilih jurusan teknik mesin karena setelah melihat pelajaran-pelajaran di jurusan ini cocok dengan minat saya dan saya yakin saya bisa kuliah dengan baik di Teknik Mesin
 
Saya memilih jurusan teknik mesin karena setelah melihat pelajaran-pelajaran di jurusan ini cocok dengan minat saya dan saya yakin saya bisa kuliah dengan baik di Teknik Mesin
  
Pelajaran yang sudah saya pelajari di setengah semester pertama pada mata kuliah metode numerik adalah mengenai macam-macam error, turunan numerik, 3 metode untuk mencari akar yaitu metode bisection, metode newton-raphson dan metode secant. saya juga mempelajari tentang deret mc laurint.
 
  
 +
 +
 +
 +
 +
S2
 +
 +
Saya menlanjutkan studi S2 di Universitas Indonesia jurusan Manufaktur dan Otomasi. Setelah menyelesaikan S1, saya tertarik dengan topik otomasi yang semakin lama semakin terpakai di Dunia.
 +
 +
 +
__TOC__
 +
 +
=S1=
 +
==Metode Numerik==
 +
Pelajaran yang sudah saya pelajari di setengah semester pertama pada mata kuliah metode numerik yang diajar oleh Dr. Ir. Engkos Achmad Kosasih M.T. adalah :
 +
*macam-macam error
 +
*turunan numerik
 +
*metode bisection
 +
*metode newton-raphson 
 +
*metode secant
 +
*deret mc laurint.
 +
 +
== Minggu 1 (Rabu, 11 November 2020) ==
 
Ada 4 tujuan metode numerik
 
Ada 4 tujuan metode numerik
 
*1. memahami konsep dengan dengan baik tentang dasar-dasar metode numerik. bila dasarnya tidak paham konsep dengan baik, maka tidak akan mengerti.
 
*1. memahami konsep dengan dengan baik tentang dasar-dasar metode numerik. bila dasarnya tidak paham konsep dengan baik, maka tidak akan mengerti.
Line 12: Line 49:
  
 
Pada diskusi hari ini, Rabu, 11 Nov 2020, saya mempelejari bahwa komputer walaupun bisa memudahkan pekerjaan kita tetapi komputer juga mempunyai keterbatasan. Jadi sejatinya kita tidak dapat mengandalkan komputer sepenuhnya. Dan sebagai manusia kita juga tidak luput dari ketidaktahuan karena sejatinya hanya Tuhan yang Maha Tahu
 
Pada diskusi hari ini, Rabu, 11 Nov 2020, saya mempelejari bahwa komputer walaupun bisa memudahkan pekerjaan kita tetapi komputer juga mempunyai keterbatasan. Jadi sejatinya kita tidak dapat mengandalkan komputer sepenuhnya. Dan sebagai manusia kita juga tidak luput dari ketidaktahuan karena sejatinya hanya Tuhan yang Maha Tahu
 +
 +
 +
===Tugas 1===
 +
Untuk tugas minggu 1 kami diminta untuk melihat tutorial Open Modelica dari youtube. Setelah melihat tutorial tersebut kami membuat video tutorial singkat. Berikut ini adalah video tutorial OpenModelica Basic
 +
 +
<youtube width="200" height="100">YNEHUeH5FsQ</youtube>
 +
 +
== Minggu 2 (Rabu, 18 November 2020) ==
 +
Sebelum dijelaskan materi, kami diminta mereview hal-hal apa saja yang sudah kami pelajari diminggu 1 dan apa saja hal yang sudah dicoba untuk tugas 1 yaitu memepelajari dasar dari Open Modelica. Pak Dai menjelaskan kenapa Pak Dai memilih aplikasi open modelica dibandingkan program lain untuk tools belajar kami. Pak Dai menjelaskan bahwa aplikasi Open Modelica ini sebenarnya bukan aplikasi programing, melainkan aplikasi untuk modelling. Open Modelica tidak mempunyai bahasa program sendiri, itu kenapa proses dari simulasi Open Modelica ini lebih lama dibandingkan aplikasi lain. Open modelica memproses data lebih lama dikarenakan Open Modelica harus menerjemahkan perintah yang kita tulis menjadi bahasa C++, setelah itu baru data bisa diproses.
 +
 +
Setelah itu kami diminta mencoba membuat suatu file class yang digunakan untuk "memanggil" suatu fungsi dari file function. Kami membuat file function sebagai berikut :
 +
 +
'''FungsiTambahX1.mo'''
 +
 +
function FungsiTambahX1
 +
 +
input Real x;
 +
output Real y;
 +
 +
algorithm
 +
y:=x+10;
 +
 +
end FungsiTambahX1;
 +
 +
Setelah itu kami membuat  file class untuk "memanggil" fungsi dari file function diatas. Pseudocodenya sebagai berikut :
 +
 +
'''Panggil.mo'''
 +
 +
class Panggil
 +
 +
parameter Real x1=5;
 +
Real hasil10tambahx1;
 +
 +
equation
 +
hasil10tambahx1=FungsiTambahX1(x1);
 +
 +
end Panggil;
 +
 +
Dijelaskan dengan memanggil file function diatas, maka pada saat di file class, inputnya menjadi x1 dimana x1 tersebut mempunyai nilai dan nilai tersebut akan menjadi input dari persamaan yang masukan di file FungsiTambahX1.mo
 +
 +
===Tugas 2===
 +
Untuk tugas 2, kami diminta untuk membuat suatu fungsi panggil seperti yang dicontohkan pada saat kelas menggunakan persamaan aljabar simultan dan variable array. Persamaan Aljabar Simultan sendiri adalah persamaan yang kompleks karena memiliki banyak variable yang perlu dicari nilainya. Variable array adalah variable yang didalamnya memiliki beberapa data nilai. Pada tugas ini saya mencoba membuatnya menggunakan 3 persamaan sederhana yang memiliki 3 variable yang harus dicari nilainya. persamaannya adalah sebagai berikut :
 +
 +
[[File:GaussContoh.jpg]]
 +
 +
Lalu saya buat file function sebagai berikut :
 +
 +
'''Gauss_Function.mo'''
 +
 +
function Gauss_Function
 +
 +
input Real P[3,3];
 +
input Real Q[3];
 +
output Real R[3];
 +
 +
algorithm
 +
 +
R:=Modelica.Math.Matrices.solve(P,Q);
 +
 +
end Gauss_Function;
 +
 +
Dan saya membuat file class sebagai berikut :
 +
 +
'''Gauss_Class.mo'''
 +
 +
class Gauss_Class
 +
 +
parameter Real A[3,3]=[2,5,3;3,4,2;1,3,1];
 +
parameter Real B[3]={1,-3,2};
 +
Real X[3];
 +
 +
equation
 +
 +
X=Gauss_Function(A,B);
 +
 +
end Gauss_Class;
 +
 +
 +
Berikut adalah video penjelasan tentang pembuatan 2 file diatas :
 +
 +
<youtube width="200" height="100">OFHBY0FXyvg</youtube>
 +
 +
 +
==Minggu 3 (Rabu, 25 November 2020)==
 +
Pada minggu ketiga, kami dijelaskan tentang pseudocode gauss elimination secara manual. Pak Dai menginginkan kami bisa membuat pseudocode sendiri tanpa menggunakan fungsi yang sudah disediakan dari OpenModelica itu sendiri. Jadi pada saat dikelas kami dijelaskan oleh Christo. Christo adalah salah satu mahasiswa yang juga mengambil mata kuliah metode numerik yang diajar oleh pak Dai. Christo menjelaskan dengan sangat jelas psudocode untuk gauss. Pseudocode dari gauss jordan berdasarkan apa yang sudah Christo jelaskan adalah sebagai berikut :
 +
 +
'''GaussJordan.mo'''
 +
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;
 +
 +
 +
Lalu kami diminta untuk membuat pseudocode open modelica dari suatu pseudocode matlab yang ada dibuku yaitu Fig. 9.4 :
 +
[[File:HIkaru 9.4.png|720px|center]]
 +
 +
Pseudocodenya adalah sebagai berikut :
 +
 +
'''NaiveGauss.mo'''
 +
function NaiveGauss
 +
 +
input Real [3,3] A;
 +
input Real [3] B; 
 +
output Real [3] x; 
 +
 +
protected
 +
Real [3,3] a;
 +
Real [3] b;
 +
Integer m = size(A,1); // kolom
 +
Integer n = size(A,2); // baris
 +
Real k = 1;     
 +
Real i = 1;     
 +
Real j = 1;     
 +
Real factor = 1;
 +
Real sum = 1;   
 +
algorithm
 +
 +
// Transfer input matrix (A,B) into variables (a,b)
 +
a := A;
 +
b := B;
 +
 +
// Forward Elimination
 +
for k in 1:(n-1) loop
 +
  for i in (k+1):n loop
 +
    factor := a[i,k] / a[k,k];
 +
    for j in (k+1):n loop
 +
      a[i,j] := a[i,j] - (factor * a[k,j]);
 +
    end for;
 +
    b[i] := b[i] - (factor * b[k]);
 +
  end for;
 +
end for;
 +
 +
// Back Substitution
 +
x[n] := b[n] / a[n,n];
 +
for i in (n-1):(-1) loop
 +
  sum := b[i];
 +
  for j in (i+1):n loop
 +
    sum := sum - (a[i,j] * x[j]);
 +
  end for;
 +
  x[i] := sum / a[i,i];
 +
end for;
 +
 +
end NaiveGauss;
 +
 +
Lalu pseudocode tersebut digunakan untuk menyelesaikan persamaan example 9.5 dan penyelesaiannya adalah sebagai berikut :
 +
 +
'''Ex9_5.mo'''
 +
class Ex9_5
 +
 +
parameter Real A[3,3]=[3,-0.1,-0.2;
 +
                        0.1,7,-0.3;
 +
                        0.3,-0.2,10];
 +
parameter Real B[3]={7.85,-19.3,71.4};
 +
Real x[3];
 +
 +
equation
 +
x=NaiveGauss(A,B);     
 +
                       
 +
 +
end Ex9_5;
 +
 +
Dari class tersebut disimulate dan didapatkan hasil sebagai berikut :
 +
[[File:95.jpg|720px|center]]
 +
 +
===Tugas 3===
 +
Pada tugas kali ini, Pak Dai memberikan tugas mengenai materi Truss yang harus diselesaikan menggunakan Open Modelica. Soalnya adalah sebagai berikut :
 +
 +
[[File:pr3-1.png|720px|center]]
 +
 +
Langkah pertama saya membuat matriks sesuai aturan yang sudah dijelaskan didalam buku. Lalu matriks tersebut diselesaikan didalam open modelica dengan psudocode sebagai berikut :
 +
 +
'''Tugas3Truss.mo'''
 +
class Tugas3Truss
 +
 +
Real [8] U;
 +
Real [8] R;
 +
 +
Real E = 200e9;
 +
Real A = 0.001;
 +
 +
Real L1 = 1;
 +
Real L2 = 1;
 +
Real L3 = 1.6;
 +
Real L4 = 1.25;
 +
Real L5 = L3;
 +
 +
Real teta1 = degtorad(0);
 +
Real teta2 = degtorad(0);
 +
Real teta3 = degtorad(231.34);
 +
Real teta4 = degtorad(270);
 +
Real teta5 = degtorad(308.66);
 +
 +
Real [8,8] K1 =
 +
[(E*A/L1)*(cos(teta1))^2,(E*A/L1)*cos(teta1)*sin(teta1),(E*A/L1)*(-(cos(teta1))^2),(E*A/L1)*(-cos(teta1)*sin(teta1)),0,0,0,0;
 +
(E*A/L1)*cos(teta1)*sin(teta1),(E*A/L1)*(sin(teta1))^2,(E*A/L1)*(-cos(teta1)*sin(teta1)),(E*A/L1)*(-(sin(teta1))^2),0,0,0,0;
 +
(E*A/L1)*(-(cos(teta1))^2),(E*A/L1)*(-cos(teta1)*sin(teta1)),(E*A/L1)*(cos(teta1))^2,(E*A/L1)*cos(teta1)*sin(teta1),0,0,0,0;
 +
(E*A/L1)*(-cos(teta1)*sin(teta1)),(E*A/L1)*(-(sin(teta1))^2),(E*A/L1)*cos(teta1)*sin(teta1),(E*A/L1)*(sin(teta1))^2,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];
 +
 +
Real [8,8] K2 =
 +
[0,0,0,0,0,0,0,0;
 +
0,0,0,0,0,0,0,0;
 +
0,0,(E*A/L2)*(cos(teta2))^2,(E*A/L2)*cos(teta2)*sin(teta2),(E*A/L2)*(-(cos(teta2))^2),(E*A/L2)*(-cos(teta2)*sin(teta2)),0,0;
 +
0,0,(E*A/L2)*cos(teta2)*sin(teta2),(E*A/L2)*(sin(teta2))^2,(E*A/L2)*(-cos(teta2)*sin(teta2)),(E*A/L2)*(-(sin(teta2))^2),0,0;
 +
0,0,(E*A/L2)*(-(cos(teta2))^2),(E*A/L2)*(-cos(teta2)*sin(teta2)),(E*A/L2)*(cos(teta2))^2,(E*A/L2)*cos(teta2)*sin(teta2),0,0;
 +
0,0,(E*A/L2)*(-cos(teta2)*sin(teta2)),(E*A/L2)*(-(sin(teta2))^2),(E*A/L2)*cos(teta2)*sin(teta2),(E*A/L2)*(sin(teta2))^2,0,0;
 +
0,0,0,0,0,0,0,0;
 +
0,0,0,0,0,0,0,0];
 +
 +
Real [8,8] K3 =
 +
[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,(E*A/L3)*(cos(teta3))^2,(E*A/L3)*cos(teta3)*sin(teta3),(E*A/L3)*(-(cos(teta3))^2),(E*A/L3)*(-cos(teta3)*sin(teta3));
 +
0,0,0,0,(E*A/L3)*cos(teta3)*sin(teta3),(E*A/L3)*(sin(teta3))^2,(E*A/L3)*(-cos(teta3)*sin(teta3)),(E*A/L3)*(-(sin(teta3))^2);
 +
0,0,0,0,(E*A/L3)*(-(cos(teta3))^2),(E*A/L3)*(-cos(teta3)*sin(teta3)),(E*A/L3)*(cos(teta3))^2,(E*A/L3)*cos(teta3)*sin(teta3);
 +
0,0,0,0,(E*A/L3)*(-cos(teta3)*sin(teta3)),(E*A/L3)*(-(sin(teta3))^2),(E*A/L3)*cos(teta3)*sin(teta3),(E*A/L3)*(sin(teta3))^2];
 +
 +
Real [8,8] K4 =
 +
[0,0,0,0,0,0,0,0;
 +
0,0,0,0,0,0,0,0;
 +
0,0,(E*A/L4)*(cos(teta4))^2,(E*A/L4)*cos(teta4)*sin(teta4),0,0,(E*A/L4)*(-(cos(teta4))^2),(E*A/L4)*(-cos(teta4)*sin(teta4));
 +
0,0,(E*A/L4)*cos(teta4)*sin(teta4),(E*A/L4)*(sin(teta4))^2,0,0,(E*A/L4)*(-cos(teta4)*sin(teta4)),(E*A/L4)*(-(sin(teta4))^2);
 +
0,0,0,0,0,0,0,0;
 +
0,0,0,0,0,0,0,0;
 +
0,0,(E*A/L4)*(-(cos(teta4))^2),(E*A/L4)*(-cos(teta4)*sin(teta4)),0,0,(E*A/L4)*(cos(teta4))^2,(E*A/L4)*cos(teta4)*sin(teta4);
 +
0,0,(E*A/L4)*(-cos(teta4)*sin(teta4)),(E*A/L4)*(-(sin(teta4))^2),0,0,(E*A/L4)*cos(teta4)*sin(teta4),(E*A/L4)*(sin(teta4))^2];
 +
 +
Real [8,8] K5 =
 +
[(E*A/L5)*(cos(teta5))^2,(E*A/L5)*cos(teta5)*sin(teta5),0,0,0,0,(E*A/L5)*(-(cos(teta5))^2),(E*A/L5)*(-cos(teta5)*sin(teta5));
 +
(E*A/L5)*cos(teta5)*sin(teta5),(E*A/L5)*(sin(teta5))^2,0,0,0,0,(E*A/L5)*(-cos(teta5)*sin(teta5)),(E*A/L5)*(-(sin(teta5))^2);
 +
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;
 +
(E*A/L5)*(-(cos(teta5))^2),(E*A/L5)*(-cos(teta5)*sin(teta5)),0,0,0,0,(E*A/L5)*(cos(teta5))^2,(E*A/L5)*cos(teta5)*sin(teta5);
 +
(E*A/L5)*(-cos(teta5)*sin(teta5)),(E*A/L5)*(-(sin(teta5))^2),0,0,0,0,(E*A/L5)*cos(teta5)*sin(teta5),(E*A/L5)*(sin(teta5))^2];
 +
 +
Real KG[8,8]=K1+K2+K3+K4+K5;
 +
 +
Real KGB[8,8] = [10^6,0,0,0,0,0,0,0;
 +
                  0,10^6,0,0,0,0,0,0;
 +
                  -2e7,0,4e7,38223.5,-2e7,0,-91.3155,-38223.5;
 +
                  0,0,38223.5,1.5e7,0,0,-38223.5,-1e7;
 +
                  0,0,0,0,10^6,0,0,0;
 +
                  0,0,0,0,0,10^6,0,0;
 +
                  -4e6,-6e6,-91.3155,-38223.5,-4e6,-6e6,9.7e6,51373.2;
 +
                  6e6,-7e6,-38223.5,-1e7,-6e6,-7e6,51373.2,3.1e7];
 +
 +
Real F[8] = {0,0,-1035.276,3863.703,0,0,-1035.276,3863.703};
 +
 +
equation
 +
 +
U = GaussJordan(KGB,F);
 +
 +
R = KG * U - F;
 +
 +
end Tugas3Truss;
 +
 +
Setelah disimulate, didapatkan hasil sebagai berikut :
 +
 +
[[File:Hasiltruss.jpg|center]]
 +
 +
==Minggu 4 (Rabu, 2 Desember 2020)==
 +
===Kuis 01, Diagram Class dan Flowchart===
 +
'''Flowchart'''
 +
 +
[[File:Kuis1yogia.jpg|720px|center]]
 +
 +
'''Class Diagram'''
 +
 +
[[File:Kuis1yogib.jpg|720px|center]]
 +
 +
===Tugas 4===
 +
Melanjutkan tugas 3, pada tugas 4 kali ini, kami diminta untuk menyelesaikan permasalahan truss 3 dimensi.
 +
 +
[[File:Soaly.jpeg|center]]
 +
 +
Lalu pertama-tama saya membuat FBD dari sistem truss tersebut dan mencari semua data untuk semua truss pada sistem tersebut.
 +
 +
[[File:Penjelasany.jpg|720px|center]]
 +
 +
Lalu proses semua data berdasarkan rumus yang ada didalam open modelica
 +
 +
'''StiffnessMatrixElement.mo'''
 +
function StiffnessMatrixElement
 +
 +
  input Real [:,9] inisiasi_mat;
 +
  output Real [size(inisiasi_mat,1),6,6] Ke_mat;
 +
 +
  protected
 +
    Real cos_x;
 +
    Real cos_y;
 +
    Real cos_z;
 +
    Real [6] StiffTrig;
 +
    Real [6,6] StiffTrans;
 +
    Real [size(inisiasi_mat,1)] k_vec;
 +
 +
algorithm
 +
  k_vec := {(inisiasi_mat[i,7] * inisiasi_mat[i,8] / inisiasi_mat[i,9]) for i in 1:size(inisiasi_mat,1)};
 +
 +
  // Finding stiffness matrix of each element member
 +
  for i in 1:size(inisiasi_mat,1) loop
 +
 +
  // Clearing the matrices
 +
  StiffTrig := zeros(6);
 +
  StiffTrans := zeros(6,6);
 +
 
 +
  // Converting degrees to radians
 +
  cos_x := inisiasi_mat[i,4];
 +
  cos_y := inisiasi_mat[i,5];
 +
  cos_z := inisiasi_mat[i,6];
 +
 +
  // {cos^2, sin^2, sincos}
 +
  StiffTrig := {(cos_x)^2,
 +
                (cos_y)^2,
 +
                (cos_z)^2,
 +
                (cos_x*cos_y),
 +
                (cos_x*cos_z),
 +
                (cos_y*cos_z)};
 +
 
 +
  // Construct stiffness transformation matrix
 +
  StiffTrans := [  StiffTrig[1],    StiffTrig[4],    StiffTrig[5], -1*StiffTrig[1], -1*StiffTrig[4], -1*StiffTrig[5];
 +
                  StiffTrig[4],    StiffTrig[2],    StiffTrig[6], -1*StiffTrig[4], -1*StiffTrig[2], -1*StiffTrig[6];
 +
                  StiffTrig[5],    StiffTrig[6],    StiffTrig[3], -1*StiffTrig[5], -1*StiffTrig[6], -1*StiffTrig[3];
 +
                -1*StiffTrig[1], -1*StiffTrig[4], -1*StiffTrig[5],    StiffTrig[1],    StiffTrig[4],    StiffTrig[5];
 +
                -1*StiffTrig[4], -1*StiffTrig[2], -1*StiffTrig[6],    StiffTrig[4],    StiffTrig[2],    StiffTrig[6];
 +
                -1*StiffTrig[5], -1*StiffTrig[6], -1*StiffTrig[3],    StiffTrig[5],    StiffTrig[6],    StiffTrig[3]];
 +
               
 +
  // Multiply in stiffness constant of element, add final stiffness matrix to Ke_mat
 +
  for m in 1:6 loop
 +
    for n in 1:6 loop
 +
      Ke_mat[i,m,n] := k_vec[i] * StiffTrans[m,n];
 +
    end for;
 +
  end for;
 +
 +
end for;
 +
end StiffnessMatrixElement;
 +
 +
Setelah itu dibuat matriks K global 12x12 dari masing-masing element
 +
 +
'''StiffnessMatrixGlobal.mo'''
 +
function StiffnessMatrixGlobal
 +
  input Integer [:,2] n;
 +
  input Integer x;
 +
  input Integer y;
 +
  input Real [y,6,6] Ke_mat;
 +
  output Real [y,x,x] Kg_mat;
 +
 
 +
algorithm
 +
  for i in 1:y loop
 +
    for a in 1:x loop
 +
      for b in 1:x loop
 +
        Kg_mat[i,a,b]:=0;
 +
      end for;
 +
    end for;
 +
  end for;
 +
 
 +
  for i in 1:y loop
 +
    Kg_mat[i,3*n[i,1],3*n[i,1]]:=Ke_mat[i,3,3];
 +
    Kg_mat[i,3*n[i,1],3*n[i,1]-1]:=Ke_mat[i,3,2];
 +
    Kg_mat[i,3*n[i,1],3*n[i,1]-2]:=Ke_mat[i,3,1];
 +
    Kg_mat[i,3*n[i,1]-1,3*n[i,1]]:=Ke_mat[i,2,3];
 +
    Kg_mat[i,3*n[i,1]-1,3*n[i,1]-1]:=Ke_mat[i,2,2];
 +
    Kg_mat[i,3*n[i,1]-1,3*n[i,1]-2]:=Ke_mat[i,2,1];
 +
    Kg_mat[i,3*n[i,1]-2,3*n[i,1]]:=Ke_mat[i,1,3];
 +
    Kg_mat[i,3*n[i,1]-2,3*n[i,1]-1]:=Ke_mat[i,1,2];
 +
    Kg_mat[i,3*n[i,1]-2,3*n[i,1]-2]:=Ke_mat[i,1,1];
 +
 +
    Kg_mat[i,3*n[i,2],3*n[i,2]]:=Ke_mat[i,6,6];
 +
    Kg_mat[i,3*n[i,2],3*n[i,2]-1]:=Ke_mat[i,6,5];
 +
    Kg_mat[i,3*n[i,2],3*n[i,2]-2]:=Ke_mat[i,6,4];
 +
    Kg_mat[i,3*n[i,2]-1,3*n[i,2]]:=Ke_mat[i,5,6];
 +
    Kg_mat[i,3*n[i,2]-1,3*n[i,2]-1]:=Ke_mat[i,5,5];
 +
    Kg_mat[i,3*n[i,2]-1,3*n[i,2]-2]:=Ke_mat[i,5,4];
 +
    Kg_mat[i,3*n[i,2]-2,3*n[i,2]]:=Ke_mat[i,4,6];
 +
    Kg_mat[i,3*n[i,2]-2,3*n[i,2]-1]:=Ke_mat[i,4,5];
 +
    Kg_mat[i,3*n[i,2]-2,3*n[i,2]-2]:=Ke_mat[i,4,4];
 +
 +
    Kg_mat[i,3*n[i,2],3*n[i,1]]:=Ke_mat[i,6,3];
 +
    Kg_mat[i,3*n[i,2],3*n[i,1]-1]:=Ke_mat[i,6,2];
 +
    Kg_mat[i,3*n[i,2],3*n[i,1]-2]:=Ke_mat[i,6,1];
 +
    Kg_mat[i,3*n[i,2]-1,3*n[i,1]]:=Ke_mat[i,5,3];
 +
    Kg_mat[i,3*n[i,2]-1,3*n[i,1]-1]:=Ke_mat[i,5,2];
 +
    Kg_mat[i,3*n[i,2]-1,3*n[i,1]-2]:=Ke_mat[i,5,1];
 +
    Kg_mat[i,3*n[i,2]-2,3*n[i,1]]:=Ke_mat[i,4,3];
 +
    Kg_mat[i,3*n[i,2]-2,3*n[i,1]-1]:=Ke_mat[i,4,2];
 +
    Kg_mat[i,3*n[i,2]-2,3*n[i,1]-2]:=Ke_mat[i,4,1];
 +
 +
    Kg_mat[i,3*n[i,1],3*n[i,2]]:=Ke_mat[i,3,6];
 +
    Kg_mat[i,3*n[i,1],3*n[i,2]-1]:=Ke_mat[i,3,5];
 +
    Kg_mat[i,3*n[i,1],3*n[i,2]-2]:=Ke_mat[i,3,4];
 +
    Kg_mat[i,3*n[i,1]-1,3*n[i,2]]:=Ke_mat[i,2,6];
 +
    Kg_mat[i,3*n[i,1]-1,3*n[i,2]-1]:=Ke_mat[i,2,5];
 +
    Kg_mat[i,3*n[i,1]-1,3*n[i,2]-2]:=Ke_mat[i,2,4];
 +
    Kg_mat[i,3*n[i,1]-2,3*n[i,2]]:=Ke_mat[i,1,6];
 +
    Kg_mat[i,3*n[i,1]-2,3*n[i,2]-1]:=Ke_mat[i,1,5];
 +
    Kg_mat[i,3*n[i,1]-2,3*n[i,2]-2]:=Ke_mat[i,1,4];
 +
  end for;
 +
end StiffnessMatrixGlobal;
 +
 +
Setelah itu semua matriks global dari masing-masing element akan dijumlahkan
 +
 +
'''SumStiffnessMatrixGlobal.mo'''
 +
function SumStiffnessMatrixGlobal
 +
  input Integer x;
 +
  input Integer y;
 +
  input Real [y,x,x] Kg_mat;
 +
  output Real [x,x] KgTot_mat;
 +
 
 +
algorithm
 +
  for a in 1:x loop
 +
    for b in 1:x loop
 +
      KgTot_mat[a,b] := sum(Kg_mat [:,a,b]);
 +
    end for;
 +
    end for;
 +
 +
end SumStiffnessMatrixGlobal;
 +
 +
Setelah itu tentukan juga boundaries yang ada
 +
 +
'''BoundaryStiffnessMatrixGlobal.mo'''
 +
function BoundaryStiffnessMatrixGlobal
 +
  input Integer x;
 +
  input Integer z;
 +
  input Real [x,x] KgTot_met;
 +
  input Integer[z] Boundary_met;
 +
  output Real [x,x] KgB_met;
 +
 
 +
algorithm
 +
  for a in 1:x loop
 +
    for b in 1:x loop
 +
    KgB_met[a,b] := KgTot_met [a,b];
 +
    end for;
 +
  end for;
 +
 
 +
  for i in 1:x loop
 +
  for a in 1:z loop
 +
    for b in 0:2 loop
 +
      KgB_met[3*(Boundary_met[a])-b,i]:=0;
 +
    end for;
 +
  end for;
 +
  end for;
 +
 +
  for a in 1:z loop
 +
    for b in 0:2 loop
 +
      KgB_met[3*Boundary_met[a]-b,3*Boundary_met[a]-b]:=1;
 +
    end for;
 +
  end for;
 +
   
 +
end BoundaryStiffnessMatrixGlobal;
 +
 +
Untuk mencari displacement-nya digunakan gauss jordan untuk menyelesaikan matriks
 +
 +
'''GaussJordan.mo'''
 +
function GaussJordan
 +
  input Integer x;
 +
  input Real [x,x] KgB_met;
 +
  input Real [x] load_met;
 +
  output Real [x] U_met;
 +
 
 +
  protected
 +
  Real float_error = 10e-10;
 +
 +
algorithm
 +
  U_met:=Modelica.Math.Matrices.solve(KgB_met,load_met);
 +
 +
  for i in 1:x loop
 +
    if abs(U_met[i]) <= float_error then
 +
    U_met[i] := 0;
 +
    end if;
 +
  end for;
 +
 +
end GaussJordan;
 +
 +
Dan untuk melihat reaction nya digunakan code sebagai berikut :
 +
 +
'''ReactionForce.mo'''
 +
function ReactionForce
 +
  input Integer x;
 +
  input Real [x,x] KgTot_met;
 +
  input Real [x] U_met;
 +
  input Real [x] load_met;
 +
  output Real [x] R_met;
 +
 +
algorithm
 +
  R_met := (KgTot_met*U_met)-load_met;
 +
end ReactionForce;
 +
 +
Terakhir dibuat Class untuk memproses data yang sudah dibuat dan melihat hasil U dan R
 +
 +
'''Tugas4TrussNo8.mo'''
 +
class Tugas4TrussNo8
 +
 +
parameter Real [:,9] inisiasi = [1, 1, 2, -0.8,    0, -0.6, 15e-4, 70e9, 2.5;
 +
                                  2, 1, 3, -0.8, -0.6,    0, 15e-4, 70e9, 2.5;
 +
                                  3, 1, 4, -0.8,    0,  0.6, 15e-4, 70e9, 2.5];
 +
                                   
 +
  parameter Integer [:,2] node = [1, 2;
 +
                                  1, 3;
 +
                                  1, 4];
 +
                                 
 +
  parameter Integer y = size(node,1);
 +
 
 +
  parameter Integer x = 3*(size(node_load,1));
 +
 
 +
  parameter Integer z = size(Boundary,1);
 +
 
 +
  parameter Integer [:] Boundary = {2,3,4};
 +
                               
 +
  parameter Real [:,4] node_load = [1, 0, -5000, 0;
 +
                                    2, 0,    0, 0;
 +
                                    3, 0,    0, 0;
 +
                                    4, 0,    0, 0];
 +
                                   
 +
  parameter Real [x] load = {0,-5000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 +
                                   
 +
  Real [y] k;
 +
 +
  Real [y,6,6] Ke;
 +
 
 +
  Real [y,x,x] Kg;
 +
 
 +
  Real [x,x] KgTot;
 +
 
 +
  Real [x,x] KgB;
 +
 
 +
  Real [x] U;
 +
 
 +
  Real [x] R;
 +
 
 +
equation
 +
  k = {(inisiasi[i,7] * inisiasi[i,8] / inisiasi[i,9]) for i in 1:y};
 +
 +
  Ke = StiffnessMatrixElement(inisiasi);
 +
 
 +
  Kg = StiffnessMatrixGlobal(node, x, y, Ke);
 +
 
 +
  KgTot = SumStiffnessMatrixGlobal(x, y, Kg);
 +
 
 +
  KgB = BoundaryStiffnessMatrixGlobal(x, z, KgTot, Boundary);
 +
 
 +
  U = GaussJordan(x, KgB, load);
 +
 
 +
  R = ReactionForce(x, KgTot, U, load);
 +
end Tugas4TrussNo8;
 +
 +
Setelah disimulate, didapatkan hasil dari displacement (U) dan Reaction force (R)
 +
 +
                                                            [[File:Uy.jpg|240px]][[File:Ry.jpg|240px]]
 +
 +
Berikut ini adalah video penjelasan singkat tentang penyelesaian soal diatas
 +
 +
<youtube width="200" height="100">NcbfBrUyNvM</youtube>
 +
 +
==Minggu 5 (Rabu, 16 Desember 2020)==
 +
Pada awal kelas, kami diberikan penjelasan bahwa kita belajar tidak hanya dari buku, tetapi kita juga bisa mendapatkan ilmu dari lingkungan sekitar dan praktik sendiri. Maka dari itu, kita harus selalu memperhatikan lingkungan sekitar kita untuk mendapatkan ilmu yang lebih banyak. Ilmu yang sudah kita dapatkan juga sebaiknya kita terapkan/aplikasikan dalam kehidupan kita.
 +
 +
Untuk topik minggu ini, kami dijelaskan tentang optimasi sistem menggunakan Open Modelica. Dijelaskan sistem adalah susunan komponen yang bekerja sama untuk menghasilkan suatu tujuan. Sebelum kelas, kami diberikan video penjelasan tentang contoh kasus optimasi beserta pesudocode nya oleh Bu Candra. Contoh kasus tersebut adalah optimasi menggunakan metode Bracket. Kami diminta untuk mencoba membuat sendiri sebelum memulai kelas dan di kelas kami melakukan diskusi. Saya sudah mencoba membuat code di open modelica. Berikut adalah open modelica yang saya coba buat :
 +
 +
'''FungsiObjek.mo'''
 +
function FungsiObjek
 +
 
 +
input Real x;
 +
output Real y;
 +
 +
algorithm
 +
 +
y:= 2*Modelica.Math.sin(x)-x^2/10;
 +
 +
end FungsiObjek;
 +
 +
Fungsi tersebut akan dipanggil di suatu file model
 +
 +
'''BracketOptimal.mo'''
 +
model BracketOptimal
 +
 +
parameter Integer n = 8;
 +
Real x1[n];
 +
Real x2[n];
 +
Real xup;
 +
Real xlow;
 +
Real f1[n];
 +
Real f2[n];
 +
Real xopt;
 +
Real yopt;
 +
Real d;
 +
 +
algorithm
 +
xup := 4;
 +
xlow := 0;
 +
 +
for i in 1:n loop
 +
  d:=((5^(1/2)-1)/2) * (xup-xlow);
 +
  x1[i] := xlow+d;
 +
  x2[i] := xup-d;
 +
  f1[i] := FungsiObjek(x1[i]);
 +
  f2[i] := FungsiObjek(x2[i]);
 +
 
 +
  if f1[i]>f2[i] then
 +
    xup := xup;
 +
    xlow := x2[i];
 +
    xopt := xup;
 +
    yopt := f1[i];
 +
    else
 +
      xlow :=xlow;
 +
      xup := x1[i];
 +
      xopt := xup;
 +
  end if;
 +
end for;
 +
 
 +
 +
end BracketOptimal;
 +
 +
Dan hasilnya adalah sebagai berikut :
 +
 +
[[File:Optimasiy.jpg|center]]
 +
 +
==Tugas Besar==
 +
Sebagai tugas besar, kami diberikan sebuah studi kasus berupa desain rangka suatu lemari. Ketentuan kasus tersebut adalah sebagai berikut :
 +
 +
[[File:Soaltubesy.jpg|540px|center]]
 +
 +
Tujuan dari studi kasus ini adalah mencari titik optimal untuk pembuatan rangka tersebut. Adapun faktor-faktor yang mempengaruhi optimasi antara lain : jenis material, luas penampang, dan harga. Pada tugas ini, kami diminta untuk menentukan material yang optimal, menentukan luas penampang yang optimal, mencari nilai displacement, reaction force, dan mencari stress.
 +
 +
===Perhitungan reaction, displacement, dan stress===
 +
 +
Data yang akan dipakai adalah sebgai berikut :
 +
 +
[[File:Datay.jpg|540px|center]]
 +
 +
Diasumsikan rangka menggunakan siku material SS400 dengan luas penampang sebesar 111 mm^2.
 +
Displacement dan Reaction Force yang akan didapatkan adalah sebagai berikut :
 +
 +
            [[File:Disy.jpg|540px]] [[File:Reacty.jpg|540px]]
 +
 +
Dan berikut ini adalah stress yang didapatkan :
 +
 +
[[File:Stressy.jpg|540px|center]]
 +
 +
===Optimasi===
 +
 +
Untuk melakukan optimasi ada 2 pendekatan, yaitu
 +
 +
1. Jenis material ditentukan diawal (SS400) dan luas penampang divariasikan
 +
 +
2. Luas penampang ditentukan diawal (0.000111 m^2) dan mencari material yang sesuai.
 +
 +
Proses yang dilakukan untuk mengolah data adalah mencari total harga, safety factor, dan rasio SF terhadap Cost. Kemudian dilakukan juga curve fitting.
 +
 +
'''1. Elasticity Locked'''
 +
 +
Berikut adalah data yang digunakan :
 +
 +
[[File:Areay.jpg|960px|center]]
 +
 +
Kemudian dilakukan optimasi dan didapatkan hasil :
 +
 +
[[File:Optareay.jpg|540px|center]]
 +
 +
Kesimpulan : Maka luas area yang optimal untuk rangka tersebut jika menggunakan material SS400 adalah sebesar 0,00013 m^2 atau 130 mm^2.
 +
 +
 +
'''2. Area Locked'''
 +
 +
Berikut ini adalah data yang digunakan :
 +
 +
[[File:Elasy.jpg|960px|center]]
 +
 +
Kemudian dilakukan optimasi dan didapatkan hasil :
 +
 +
[[File:Optelasy.jpg|540px|center]]
 +
 +
Kesimpulan : Maka dengan luas area 111 mm^2, material yang paling optimal untuk digunakan adalah material yang memiliki nilai elastisitas sebesar 203x10^9 Pa atau 203 GPa.
 +
Material yang paling cocok adalah SS400 karena mempunyai nilai elastisitas yang lebih besar dari nilai optimalnya yaitu sebesar 215 GPa.
 +
 +
'''Lampiran : Program Open Modelica'''
 +
 +
'''TugasBesar.mo'''
 +
 +
model TugasBesar
 +
 +
//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.000111;  //Area L Profile  (m2)
 +
parameter Real Elas=245e9;    //Elasticity SS 400  (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,  0,  0,1,1,1;    //1
 +
                          0,0.75,  0,1,1,1;    //2
 +
                        0.6,0.75,  0,1,1,1;    //3
 +
                        0.6,  0,  0,1,1,1;    //4
 +
                             
 +
                          0,  0,  0.4,0,0,0;  //5
 +
                          0,0.75,  0.4,0,0,0;  //6
 +
                        0.6,0.75,  0.4,0,0,0;  //7
 +
                        0.6,  0,  0.4,0,0,0;    //8
 +
                           
 +
                          0,  0,  1.1,0,0,0;  //9
 +
                          0,0.75,  1.1,0,0,0;  //10 
 +
                        0.6,0.75,  1.1,0,0,0;  //11
 +
                        0.6,  0,  1.1,0,0,0;    //12
 +
                           
 +
                          0,  0,  1.8,0,0,0;  //13
 +
                          0,0.75,  1.8,0,0,0;  //14
 +
                        0.6,0.75,  1.8,0,0,0;  //15
 +
                        0.6,  0,  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,-1000,
 +
                            0,0,-500,
 +
                            0,0,-500,
 +
                            0,0,-1000}; 
 +
 +
//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 TugasBesar;
 +
 +
'''curvefitting.mo'''
 +
 +
class curvefitting
 +
 +
parameter Real X[''jumlah plot'']={''plot''};
 +
parameter Real Y[''jumlah plot'']={''plot''};
 +
Real Coe[3];
 +
 
 +
algorithm
 +
Coe:=Curve_Fitting(X,Y,2);
 +
 +
end curvefitting;
 +
 +
'''Curve_Fitting.mo'''
 +
 +
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;
 +
 +
'''Golden Section'''
 +
 +
model Opt_Gold
 +
 +
parameter Real xd[:];
 +
parameter Real yd[size(xd,1)];
 +
parameter Real xlo=87e-6;
 +
parameter Real xhi=504e-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;
 +
 +
==UAS (Rabu, 13 Januari 2021==
 +
'''Jawaban UAS'''
 +
*'''Nomor 1'''
 +
[[File:Satuy.jpg|540px|center]]
 +
*'''Nomor 2'''
 +
[[File:Duay.jpg|540px|center]]
 +
*'''Nomor 3'''
 +
[[File:Tigay.jpg|540px|center]]
 +
*'''Nomor 4,5,6, dan Hasil Nomor 7'''
 +
[[File:Empaty.jpg|540px|center]]
 +
 +
'''Pseudocode pada OpenModelica'''
 +
'''uas.mo'''
 +
model uas 
 +
 +
//define initial variable
 +
parameter Integer Points=4; //Number of Points
 +
parameter Integer Trusses=3; //Number of Trusses
 +
parameter Real Yield=215e6; //Yield Strength (Pa)
 +
parameter Real Area=25;  //Area L Profile
 +
parameter Real Elas=245e9;   
 +
 +
//define connection
 +
parameter Integer C[:,2]=[1,2;
 +
                          1,3;
 +
                          1,4];
 +
         
 +
//define coordinates (please put orderly)
 +
parameter Real P[:,6]=[  0,  0,  0,0,0,0;    //1
 +
                        6.5,6.5,  36.5,1,1,1;    //2
 +
                        6.5,6.5,  36.5,1,1,1;    //3
 +
                        6.5,6.5,  36.5,1,1,1];    //4
 +
                           
 +
//define external force (please put orderly)
 +
parameter Real F[Points * 3] = {0,0,0,0,3708180,0,0,3708180,0,0,3708180,0};
 +
 +
//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 uas;
 +
 +
 +
 +
= S2 =
 +
 +
Nama          : Yogi Gunawan Atmawijaya
 +
 +
NPM            : 2406468690
 +
 +
 +
== Minggu 1, Selasa 29 Oktober 2024 ==
 +
 +
DAI5 adalah sebuah pendekatan inovatif yang dikembangkan oleh Bapak Ahmad Indra Siswantara untuk proses pemecahan masalah. DAI5 terdiri dari 4 komponen utama yang membantu dalam proses pemecahan masalah. Komponennya adalah:
 +
 +
1. Intention: menetapkan tujuan dan maksud dari pemecahan masalah.
 +
 +
2. Initial Thinking: melakukan pemikiran awal untuk merancang solusi awal.
 +
 +
3. Idealization: membuat model atau representasi yang mendekati kondisi sebenarnya dengan asumsi yang relevan.
 +
 +
4. Instruction Set: Menyusun langkah-langkah atau instruksi yang harus diikuti untuk mencapai solusi yang diinginkan.
 +
 +
Setiap komponen ini bekerja secara terintegrasi untuk memastikan pemecahan masalah yang efektif dan efisien.
 +
 +
 +
===Tugas 1===
 +
 +
Pada tugas 1 ini saya mencoba sendiri mengetahui finite element equation dari 1D PDE. Untuk mempelajarinya saya menggunakan ChatGPT sebagaimana arahan dari Pak DAI. Prompt yang saya gunakan juga menggunakan prompt yang diberikan oleh Pak DAI.
 +
 +
Setelah ChatGPT menjawab semua pertanyaan saya tentang finite element, saya arahkan ChatGPT untuk merangkumnya dan menjelaskan dengan DAI5 Framework. ChatGPT mengetahui DAI5 Framework dengan cukup baik.
 +
 +
 +
Saya bertanya:
 +
 +
Can you restructure all of your above explanation using DAI5
 +
Framework with intention step as fundamental step as you also
 +
mentioned in the following : Free will naturally ties into the
 +
DAI5 framework because both free will and consciousness play
 +
vital roles in the intention-setting and decision-making
 +
processes that drive each step in DAI5. With conscious intention
 +
as a central element in DAI5, free will could be seen as the
 +
"engine" that enables individuals to choose how to direct that
 +
consciousness. This conscious choice—the exercise of free will—
 +
could then influence each step, from problem understanding to
 +
creating solutions that align with one’s ultimate goals.
 +
 +
 +
ChatGPT menjawab:
 +
 +
[[File:Tugas_1_Yogi_1.png|540px|center]]
 +
 +
[[File:Tugas_1_Yogi_2.png|540px|center]]
 +
 +
[[File:Tugas_1_Yogi_3.png|540px|center]]
 +
 +
[[File:Tugas_1_Yogi_4.png|540px|center]]

Latest revision as of 15:56, 4 November 2024

Biodata

Yogi Gunawan Atmawijaya

Nama  : Yogi Gunawan Atmawijaya

NPM S1  : 1806201005

NPM S2  : 2406468690

Tanggal Lahir  : 27 Maret 2000

Tempat Tinggal : Tangerang


S1

Saya adalah mahasiswa FTUI angkatan 2018 jurusan Teknik Mesin.

Saya memilih jurusan teknik mesin karena setelah melihat pelajaran-pelajaran di jurusan ini cocok dengan minat saya dan saya yakin saya bisa kuliah dengan baik di Teknik Mesin




S2

Saya menlanjutkan studi S2 di Universitas Indonesia jurusan Manufaktur dan Otomasi. Setelah menyelesaikan S1, saya tertarik dengan topik otomasi yang semakin lama semakin terpakai di Dunia.


S1

Metode Numerik

Pelajaran yang sudah saya pelajari di setengah semester pertama pada mata kuliah metode numerik yang diajar oleh Dr. Ir. Engkos Achmad Kosasih M.T. adalah :

  • macam-macam error
  • turunan numerik
  • metode bisection
  • metode newton-raphson
  • metode secant
  • deret mc laurint.

Minggu 1 (Rabu, 11 November 2020)

Ada 4 tujuan metode numerik

  • 1. memahami konsep dengan dengan baik tentang dasar-dasar metode numerik. bila dasarnya tidak paham konsep dengan baik, maka tidak akan mengerti.
  • 2. mampu menerapkan pemahaman konsep tersebut didalam permodelan numerik
  • 3. mampu menerapkan metode numerik dipersoalan keteknikan
  • 4. untuk mendapat nilai tambah membuat kita menajadi manusia yang beradab

Pada diskusi hari ini, Rabu, 11 Nov 2020, saya mempelejari bahwa komputer walaupun bisa memudahkan pekerjaan kita tetapi komputer juga mempunyai keterbatasan. Jadi sejatinya kita tidak dapat mengandalkan komputer sepenuhnya. Dan sebagai manusia kita juga tidak luput dari ketidaktahuan karena sejatinya hanya Tuhan yang Maha Tahu


Tugas 1

Untuk tugas minggu 1 kami diminta untuk melihat tutorial Open Modelica dari youtube. Setelah melihat tutorial tersebut kami membuat video tutorial singkat. Berikut ini adalah video tutorial OpenModelica Basic

Minggu 2 (Rabu, 18 November 2020)

Sebelum dijelaskan materi, kami diminta mereview hal-hal apa saja yang sudah kami pelajari diminggu 1 dan apa saja hal yang sudah dicoba untuk tugas 1 yaitu memepelajari dasar dari Open Modelica. Pak Dai menjelaskan kenapa Pak Dai memilih aplikasi open modelica dibandingkan program lain untuk tools belajar kami. Pak Dai menjelaskan bahwa aplikasi Open Modelica ini sebenarnya bukan aplikasi programing, melainkan aplikasi untuk modelling. Open Modelica tidak mempunyai bahasa program sendiri, itu kenapa proses dari simulasi Open Modelica ini lebih lama dibandingkan aplikasi lain. Open modelica memproses data lebih lama dikarenakan Open Modelica harus menerjemahkan perintah yang kita tulis menjadi bahasa C++, setelah itu baru data bisa diproses.

Setelah itu kami diminta mencoba membuat suatu file class yang digunakan untuk "memanggil" suatu fungsi dari file function. Kami membuat file function sebagai berikut :

FungsiTambahX1.mo

function FungsiTambahX1

input Real x;
output Real y;

algorithm
y:=x+10;

end FungsiTambahX1;

Setelah itu kami membuat file class untuk "memanggil" fungsi dari file function diatas. Pseudocodenya sebagai berikut :

Panggil.mo

class Panggil

parameter Real x1=5;
Real hasil10tambahx1;

equation
hasil10tambahx1=FungsiTambahX1(x1);

end Panggil;

Dijelaskan dengan memanggil file function diatas, maka pada saat di file class, inputnya menjadi x1 dimana x1 tersebut mempunyai nilai dan nilai tersebut akan menjadi input dari persamaan yang masukan di file FungsiTambahX1.mo

Tugas 2

Untuk tugas 2, kami diminta untuk membuat suatu fungsi panggil seperti yang dicontohkan pada saat kelas menggunakan persamaan aljabar simultan dan variable array. Persamaan Aljabar Simultan sendiri adalah persamaan yang kompleks karena memiliki banyak variable yang perlu dicari nilainya. Variable array adalah variable yang didalamnya memiliki beberapa data nilai. Pada tugas ini saya mencoba membuatnya menggunakan 3 persamaan sederhana yang memiliki 3 variable yang harus dicari nilainya. persamaannya adalah sebagai berikut :

GaussContoh.jpg

Lalu saya buat file function sebagai berikut :

Gauss_Function.mo

function Gauss_Function

input Real P[3,3];
input Real Q[3];
output Real R[3];

algorithm

R:=Modelica.Math.Matrices.solve(P,Q);

end Gauss_Function;

Dan saya membuat file class sebagai berikut :

Gauss_Class.mo

class Gauss_Class

parameter Real A[3,3]=[2,5,3;3,4,2;1,3,1];
parameter Real B[3]={1,-3,2};
Real X[3];

equation

X=Gauss_Function(A,B);

end Gauss_Class;


Berikut adalah video penjelasan tentang pembuatan 2 file diatas :


Minggu 3 (Rabu, 25 November 2020)

Pada minggu ketiga, kami dijelaskan tentang pseudocode gauss elimination secara manual. Pak Dai menginginkan kami bisa membuat pseudocode sendiri tanpa menggunakan fungsi yang sudah disediakan dari OpenModelica itu sendiri. Jadi pada saat dikelas kami dijelaskan oleh Christo. Christo adalah salah satu mahasiswa yang juga mengambil mata kuliah metode numerik yang diajar oleh pak Dai. Christo menjelaskan dengan sangat jelas psudocode untuk gauss. Pseudocode dari gauss jordan berdasarkan apa yang sudah Christo jelaskan adalah sebagai berikut :

GaussJordan.mo

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;


Lalu kami diminta untuk membuat pseudocode open modelica dari suatu pseudocode matlab yang ada dibuku yaitu Fig. 9.4 :

HIkaru 9.4.png

Pseudocodenya adalah sebagai berikut :

NaiveGauss.mo

function NaiveGauss

input Real [3,3] A; 
input Real [3] B;   
output Real [3] x;  

protected
Real [3,3] a;
Real [3] b;
Integer m = size(A,1); // kolom 
Integer n = size(A,2); // baris
Real k = 1;      
Real i = 1;       
Real j = 1;       
Real factor = 1; 
Real sum = 1;     
algorithm

// Transfer input matrix (A,B) into variables (a,b)
a := A;
b := B;

// Forward Elimination
for k in 1:(n-1) loop
  for i in (k+1):n loop
    factor := a[i,k] / a[k,k];
    for j in (k+1):n loop
      a[i,j] := a[i,j] - (factor * a[k,j]);
    end for;
    b[i] := b[i] - (factor * b[k]);
  end for;
end for;

// Back Substitution
x[n] := b[n] / a[n,n];
for i in (n-1):(-1) loop
  sum := b[i];
  for j in (i+1):n loop
    sum := sum - (a[i,j] * x[j]);
  end for;
  x[i] := sum / a[i,i];
end for;

end NaiveGauss;

Lalu pseudocode tersebut digunakan untuk menyelesaikan persamaan example 9.5 dan penyelesaiannya adalah sebagai berikut :

Ex9_5.mo

class Ex9_5

parameter Real A[3,3]=[3,-0.1,-0.2;
                       0.1,7,-0.3;
                       0.3,-0.2,10];
parameter Real B[3]={7.85,-19.3,71.4};
Real x[3];

equation
x=NaiveGauss(A,B);       
                       

end Ex9_5;

Dari class tersebut disimulate dan didapatkan hasil sebagai berikut :

95.jpg

Tugas 3

Pada tugas kali ini, Pak Dai memberikan tugas mengenai materi Truss yang harus diselesaikan menggunakan Open Modelica. Soalnya adalah sebagai berikut :

Pr3-1.png

Langkah pertama saya membuat matriks sesuai aturan yang sudah dijelaskan didalam buku. Lalu matriks tersebut diselesaikan didalam open modelica dengan psudocode sebagai berikut :

Tugas3Truss.mo

class Tugas3Truss

Real [8] U;
Real [8] R;

Real E = 200e9;
Real A = 0.001;

Real L1 = 1;
Real L2 = 1;
Real L3 = 1.6;
Real L4 = 1.25;
Real L5 = L3;

Real teta1 = degtorad(0);
Real teta2 = degtorad(0);
Real teta3 = degtorad(231.34);
Real teta4 = degtorad(270);
Real teta5 = degtorad(308.66);

Real [8,8] K1 = 
[(E*A/L1)*(cos(teta1))^2,(E*A/L1)*cos(teta1)*sin(teta1),(E*A/L1)*(-(cos(teta1))^2),(E*A/L1)*(-cos(teta1)*sin(teta1)),0,0,0,0;
(E*A/L1)*cos(teta1)*sin(teta1),(E*A/L1)*(sin(teta1))^2,(E*A/L1)*(-cos(teta1)*sin(teta1)),(E*A/L1)*(-(sin(teta1))^2),0,0,0,0;
(E*A/L1)*(-(cos(teta1))^2),(E*A/L1)*(-cos(teta1)*sin(teta1)),(E*A/L1)*(cos(teta1))^2,(E*A/L1)*cos(teta1)*sin(teta1),0,0,0,0;
(E*A/L1)*(-cos(teta1)*sin(teta1)),(E*A/L1)*(-(sin(teta1))^2),(E*A/L1)*cos(teta1)*sin(teta1),(E*A/L1)*(sin(teta1))^2,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];

Real [8,8] K2 =
[0,0,0,0,0,0,0,0;
0,0,0,0,0,0,0,0;
0,0,(E*A/L2)*(cos(teta2))^2,(E*A/L2)*cos(teta2)*sin(teta2),(E*A/L2)*(-(cos(teta2))^2),(E*A/L2)*(-cos(teta2)*sin(teta2)),0,0;
0,0,(E*A/L2)*cos(teta2)*sin(teta2),(E*A/L2)*(sin(teta2))^2,(E*A/L2)*(-cos(teta2)*sin(teta2)),(E*A/L2)*(-(sin(teta2))^2),0,0;
0,0,(E*A/L2)*(-(cos(teta2))^2),(E*A/L2)*(-cos(teta2)*sin(teta2)),(E*A/L2)*(cos(teta2))^2,(E*A/L2)*cos(teta2)*sin(teta2),0,0;
0,0,(E*A/L2)*(-cos(teta2)*sin(teta2)),(E*A/L2)*(-(sin(teta2))^2),(E*A/L2)*cos(teta2)*sin(teta2),(E*A/L2)*(sin(teta2))^2,0,0;
0,0,0,0,0,0,0,0;
0,0,0,0,0,0,0,0];

Real [8,8] K3 =
[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,(E*A/L3)*(cos(teta3))^2,(E*A/L3)*cos(teta3)*sin(teta3),(E*A/L3)*(-(cos(teta3))^2),(E*A/L3)*(-cos(teta3)*sin(teta3));
0,0,0,0,(E*A/L3)*cos(teta3)*sin(teta3),(E*A/L3)*(sin(teta3))^2,(E*A/L3)*(-cos(teta3)*sin(teta3)),(E*A/L3)*(-(sin(teta3))^2);
0,0,0,0,(E*A/L3)*(-(cos(teta3))^2),(E*A/L3)*(-cos(teta3)*sin(teta3)),(E*A/L3)*(cos(teta3))^2,(E*A/L3)*cos(teta3)*sin(teta3);
0,0,0,0,(E*A/L3)*(-cos(teta3)*sin(teta3)),(E*A/L3)*(-(sin(teta3))^2),(E*A/L3)*cos(teta3)*sin(teta3),(E*A/L3)*(sin(teta3))^2];

Real [8,8] K4 = 
[0,0,0,0,0,0,0,0;
0,0,0,0,0,0,0,0;
0,0,(E*A/L4)*(cos(teta4))^2,(E*A/L4)*cos(teta4)*sin(teta4),0,0,(E*A/L4)*(-(cos(teta4))^2),(E*A/L4)*(-cos(teta4)*sin(teta4));
0,0,(E*A/L4)*cos(teta4)*sin(teta4),(E*A/L4)*(sin(teta4))^2,0,0,(E*A/L4)*(-cos(teta4)*sin(teta4)),(E*A/L4)*(-(sin(teta4))^2);
0,0,0,0,0,0,0,0;
0,0,0,0,0,0,0,0;
0,0,(E*A/L4)*(-(cos(teta4))^2),(E*A/L4)*(-cos(teta4)*sin(teta4)),0,0,(E*A/L4)*(cos(teta4))^2,(E*A/L4)*cos(teta4)*sin(teta4);
0,0,(E*A/L4)*(-cos(teta4)*sin(teta4)),(E*A/L4)*(-(sin(teta4))^2),0,0,(E*A/L4)*cos(teta4)*sin(teta4),(E*A/L4)*(sin(teta4))^2];

Real [8,8] K5 = 
[(E*A/L5)*(cos(teta5))^2,(E*A/L5)*cos(teta5)*sin(teta5),0,0,0,0,(E*A/L5)*(-(cos(teta5))^2),(E*A/L5)*(-cos(teta5)*sin(teta5));
(E*A/L5)*cos(teta5)*sin(teta5),(E*A/L5)*(sin(teta5))^2,0,0,0,0,(E*A/L5)*(-cos(teta5)*sin(teta5)),(E*A/L5)*(-(sin(teta5))^2);
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;
(E*A/L5)*(-(cos(teta5))^2),(E*A/L5)*(-cos(teta5)*sin(teta5)),0,0,0,0,(E*A/L5)*(cos(teta5))^2,(E*A/L5)*cos(teta5)*sin(teta5);
(E*A/L5)*(-cos(teta5)*sin(teta5)),(E*A/L5)*(-(sin(teta5))^2),0,0,0,0,(E*A/L5)*cos(teta5)*sin(teta5),(E*A/L5)*(sin(teta5))^2];

Real KG[8,8]=K1+K2+K3+K4+K5;

Real KGB[8,8] = [10^6,0,0,0,0,0,0,0;
                 0,10^6,0,0,0,0,0,0;
                 -2e7,0,4e7,38223.5,-2e7,0,-91.3155,-38223.5;
                 0,0,38223.5,1.5e7,0,0,-38223.5,-1e7;
                 0,0,0,0,10^6,0,0,0;
                 0,0,0,0,0,10^6,0,0;
                 -4e6,-6e6,-91.3155,-38223.5,-4e6,-6e6,9.7e6,51373.2;
                 6e6,-7e6,-38223.5,-1e7,-6e6,-7e6,51373.2,3.1e7];

Real F[8] = {0,0,-1035.276,3863.703,0,0,-1035.276,3863.703};

equation

U = GaussJordan(KGB,F);

R = KG * U - F;

end Tugas3Truss;

Setelah disimulate, didapatkan hasil sebagai berikut :

Hasiltruss.jpg

Minggu 4 (Rabu, 2 Desember 2020)

Kuis 01, Diagram Class dan Flowchart

Flowchart

Kuis1yogia.jpg

Class Diagram

Kuis1yogib.jpg

Tugas 4

Melanjutkan tugas 3, pada tugas 4 kali ini, kami diminta untuk menyelesaikan permasalahan truss 3 dimensi.

Soaly.jpeg

Lalu pertama-tama saya membuat FBD dari sistem truss tersebut dan mencari semua data untuk semua truss pada sistem tersebut.

Penjelasany.jpg

Lalu proses semua data berdasarkan rumus yang ada didalam open modelica

StiffnessMatrixElement.mo
function StiffnessMatrixElement

 input Real [:,9] inisiasi_mat;
 output Real [size(inisiasi_mat,1),6,6] Ke_mat;

 protected
   Real cos_x;
   Real cos_y;
   Real cos_z;
   Real [6] StiffTrig;
   Real [6,6] StiffTrans;
   Real [size(inisiasi_mat,1)] k_vec;

algorithm
 k_vec := {(inisiasi_mat[i,7] * inisiasi_mat[i,8] / inisiasi_mat[i,9]) for i in 1:size(inisiasi_mat,1)};

 // Finding stiffness matrix of each element member
 for i in 1:size(inisiasi_mat,1) loop

 // Clearing the matrices
 StiffTrig := zeros(6);
 StiffTrans := zeros(6,6);
  
 // Converting degrees to radians
 cos_x := inisiasi_mat[i,4];
 cos_y := inisiasi_mat[i,5];
 cos_z := inisiasi_mat[i,6];

 // {cos^2, sin^2, sincos}
 StiffTrig := {(cos_x)^2,
               (cos_y)^2,
               (cos_z)^2,
               (cos_x*cos_y),
               (cos_x*cos_z),
               (cos_y*cos_z)};
  
 // Construct stiffness transformation matrix
 StiffTrans := [  StiffTrig[1],    StiffTrig[4],    StiffTrig[5], -1*StiffTrig[1], -1*StiffTrig[4], -1*StiffTrig[5];
                  StiffTrig[4],    StiffTrig[2],    StiffTrig[6], -1*StiffTrig[4], -1*StiffTrig[2], -1*StiffTrig[6];
                  StiffTrig[5],    StiffTrig[6],    StiffTrig[3], -1*StiffTrig[5], -1*StiffTrig[6], -1*StiffTrig[3];
               -1*StiffTrig[1], -1*StiffTrig[4], -1*StiffTrig[5],    StiffTrig[1],    StiffTrig[4],    StiffTrig[5];
               -1*StiffTrig[4], -1*StiffTrig[2], -1*StiffTrig[6],    StiffTrig[4],    StiffTrig[2],    StiffTrig[6];
               -1*StiffTrig[5], -1*StiffTrig[6], -1*StiffTrig[3],    StiffTrig[5],    StiffTrig[6],    StiffTrig[3]];
                
 // Multiply in stiffness constant of element, add final stiffness matrix to Ke_mat
 for m in 1:6 loop
   for n in 1:6 loop
     Ke_mat[i,m,n] := k_vec[i] * StiffTrans[m,n];
   end for;
 end for;

end for;
end StiffnessMatrixElement;

Setelah itu dibuat matriks K global 12x12 dari masing-masing element

StiffnessMatrixGlobal.mo
function StiffnessMatrixGlobal
 input Integer [:,2] n;
 input Integer x;
 input Integer y;
 input Real [y,6,6] Ke_mat; 
 output Real [y,x,x] Kg_mat;
  
algorithm
 for i in 1:y loop
   for a in 1:x loop
     for b in 1:x loop
       Kg_mat[i,a,b]:=0;
     end for;
   end for;
  end for;
 
 for i in 1:y loop
   Kg_mat[i,3*n[i,1],3*n[i,1]]:=Ke_mat[i,3,3];
   Kg_mat[i,3*n[i,1],3*n[i,1]-1]:=Ke_mat[i,3,2];
   Kg_mat[i,3*n[i,1],3*n[i,1]-2]:=Ke_mat[i,3,1];
   Kg_mat[i,3*n[i,1]-1,3*n[i,1]]:=Ke_mat[i,2,3];
   Kg_mat[i,3*n[i,1]-1,3*n[i,1]-1]:=Ke_mat[i,2,2];
   Kg_mat[i,3*n[i,1]-1,3*n[i,1]-2]:=Ke_mat[i,2,1];
   Kg_mat[i,3*n[i,1]-2,3*n[i,1]]:=Ke_mat[i,1,3];
   Kg_mat[i,3*n[i,1]-2,3*n[i,1]-1]:=Ke_mat[i,1,2];
   Kg_mat[i,3*n[i,1]-2,3*n[i,1]-2]:=Ke_mat[i,1,1];

   Kg_mat[i,3*n[i,2],3*n[i,2]]:=Ke_mat[i,6,6];
   Kg_mat[i,3*n[i,2],3*n[i,2]-1]:=Ke_mat[i,6,5];
   Kg_mat[i,3*n[i,2],3*n[i,2]-2]:=Ke_mat[i,6,4];
   Kg_mat[i,3*n[i,2]-1,3*n[i,2]]:=Ke_mat[i,5,6];
   Kg_mat[i,3*n[i,2]-1,3*n[i,2]-1]:=Ke_mat[i,5,5];
   Kg_mat[i,3*n[i,2]-1,3*n[i,2]-2]:=Ke_mat[i,5,4];
   Kg_mat[i,3*n[i,2]-2,3*n[i,2]]:=Ke_mat[i,4,6];
   Kg_mat[i,3*n[i,2]-2,3*n[i,2]-1]:=Ke_mat[i,4,5];
   Kg_mat[i,3*n[i,2]-2,3*n[i,2]-2]:=Ke_mat[i,4,4];

   Kg_mat[i,3*n[i,2],3*n[i,1]]:=Ke_mat[i,6,3];
   Kg_mat[i,3*n[i,2],3*n[i,1]-1]:=Ke_mat[i,6,2];
   Kg_mat[i,3*n[i,2],3*n[i,1]-2]:=Ke_mat[i,6,1];
   Kg_mat[i,3*n[i,2]-1,3*n[i,1]]:=Ke_mat[i,5,3];
   Kg_mat[i,3*n[i,2]-1,3*n[i,1]-1]:=Ke_mat[i,5,2];
   Kg_mat[i,3*n[i,2]-1,3*n[i,1]-2]:=Ke_mat[i,5,1];
   Kg_mat[i,3*n[i,2]-2,3*n[i,1]]:=Ke_mat[i,4,3];
   Kg_mat[i,3*n[i,2]-2,3*n[i,1]-1]:=Ke_mat[i,4,2];
   Kg_mat[i,3*n[i,2]-2,3*n[i,1]-2]:=Ke_mat[i,4,1];

   Kg_mat[i,3*n[i,1],3*n[i,2]]:=Ke_mat[i,3,6];
   Kg_mat[i,3*n[i,1],3*n[i,2]-1]:=Ke_mat[i,3,5];
   Kg_mat[i,3*n[i,1],3*n[i,2]-2]:=Ke_mat[i,3,4];
   Kg_mat[i,3*n[i,1]-1,3*n[i,2]]:=Ke_mat[i,2,6];
   Kg_mat[i,3*n[i,1]-1,3*n[i,2]-1]:=Ke_mat[i,2,5];
   Kg_mat[i,3*n[i,1]-1,3*n[i,2]-2]:=Ke_mat[i,2,4];
   Kg_mat[i,3*n[i,1]-2,3*n[i,2]]:=Ke_mat[i,1,6];
   Kg_mat[i,3*n[i,1]-2,3*n[i,2]-1]:=Ke_mat[i,1,5];
   Kg_mat[i,3*n[i,1]-2,3*n[i,2]-2]:=Ke_mat[i,1,4];
 end for;
end StiffnessMatrixGlobal;

Setelah itu semua matriks global dari masing-masing element akan dijumlahkan

SumStiffnessMatrixGlobal.mo
function SumStiffnessMatrixGlobal
 input Integer x;
 input Integer y;
 input Real [y,x,x] Kg_mat;
 output Real [x,x] KgTot_mat;
  
algorithm
  for a in 1:x loop
   for b in 1:x loop
     KgTot_mat[a,b] := sum(Kg_mat [:,a,b]);
    end for;
   end for;

end SumStiffnessMatrixGlobal;

Setelah itu tentukan juga boundaries yang ada

BoundaryStiffnessMatrixGlobal.mo
function BoundaryStiffnessMatrixGlobal
 input Integer x;
 input Integer z;
 input Real [x,x] KgTot_met;
 input Integer[z] Boundary_met;
 output Real [x,x] KgB_met;
  
algorithm
 for a in 1:x loop
   for b in 1:x loop
    KgB_met[a,b] := KgTot_met [a,b];
   end for;
  end for; 
  
 for i in 1:x loop
  for a in 1:z loop
   for b in 0:2 loop
     KgB_met[3*(Boundary_met[a])-b,i]:=0;
   end for;
  end for;
 end for;

 for a in 1:z loop
   for b in 0:2 loop
     KgB_met[3*Boundary_met[a]-b,3*Boundary_met[a]-b]:=1;
   end for;
 end for;
   
end BoundaryStiffnessMatrixGlobal;

Untuk mencari displacement-nya digunakan gauss jordan untuk menyelesaikan matriks

GaussJordan.mo
function GaussJordan
 input Integer x;
 input Real [x,x] KgB_met;
 input Real [x] load_met;
 output Real [x] U_met;
  
 protected
 Real float_error = 10e-10;

algorithm
 U_met:=Modelica.Math.Matrices.solve(KgB_met,load_met);

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

end GaussJordan;

Dan untuk melihat reaction nya digunakan code sebagai berikut :

ReactionForce.mo
function ReactionForce
 input Integer x;
 input Real [x,x] KgTot_met;
 input Real [x] U_met;
 input Real [x] load_met;
 output Real [x] R_met;

algorithm
 R_met := (KgTot_met*U_met)-load_met;
end ReactionForce;

Terakhir dibuat Class untuk memproses data yang sudah dibuat dan melihat hasil U dan R

Tugas4TrussNo8.mo
class Tugas4TrussNo8

parameter Real [:,9] inisiasi = [1, 1, 2, -0.8,    0, -0.6, 15e-4, 70e9, 2.5;
                                  2, 1, 3, -0.8, -0.6,    0, 15e-4, 70e9, 2.5;
                                  3, 1, 4, -0.8,    0,  0.6, 15e-4, 70e9, 2.5];
                                   
 parameter Integer [:,2] node = [1, 2;
                                 1, 3;
                                 1, 4];
                                  
 parameter Integer y = size(node,1);
  
 parameter Integer x = 3*(size(node_load,1));
  
 parameter Integer z = size(Boundary,1);
  
 parameter Integer [:] Boundary = {2,3,4};
                               
 parameter Real [:,4] node_load = [1, 0, -5000, 0;
                                   2, 0,     0, 0;
                                   3, 0,     0, 0;
                                   4, 0,     0, 0];
                                    
 parameter Real [x] load = {0,-5000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
                                   
 Real [y] k;

 Real [y,6,6] Ke;
  
 Real [y,x,x] Kg;
  
 Real [x,x] KgTot;
  
 Real [x,x] KgB;
  
 Real [x] U;
  
 Real [x] R;
  
equation
 k = {(inisiasi[i,7] * inisiasi[i,8] / inisiasi[i,9]) for i in 1:y};

 Ke = StiffnessMatrixElement(inisiasi);
 
 Kg = StiffnessMatrixGlobal(node, x, y, Ke);
 
 KgTot = SumStiffnessMatrixGlobal(x, y, Kg);
 
 KgB = BoundaryStiffnessMatrixGlobal(x, z, KgTot, Boundary);
 
 U = GaussJordan(x, KgB, load);
 
 R = ReactionForce(x, KgTot, U, load);
end Tugas4TrussNo8;

Setelah disimulate, didapatkan hasil dari displacement (U) dan Reaction force (R)

                                                           Uy.jpgRy.jpg

Berikut ini adalah video penjelasan singkat tentang penyelesaian soal diatas

Minggu 5 (Rabu, 16 Desember 2020)

Pada awal kelas, kami diberikan penjelasan bahwa kita belajar tidak hanya dari buku, tetapi kita juga bisa mendapatkan ilmu dari lingkungan sekitar dan praktik sendiri. Maka dari itu, kita harus selalu memperhatikan lingkungan sekitar kita untuk mendapatkan ilmu yang lebih banyak. Ilmu yang sudah kita dapatkan juga sebaiknya kita terapkan/aplikasikan dalam kehidupan kita.

Untuk topik minggu ini, kami dijelaskan tentang optimasi sistem menggunakan Open Modelica. Dijelaskan sistem adalah susunan komponen yang bekerja sama untuk menghasilkan suatu tujuan. Sebelum kelas, kami diberikan video penjelasan tentang contoh kasus optimasi beserta pesudocode nya oleh Bu Candra. Contoh kasus tersebut adalah optimasi menggunakan metode Bracket. Kami diminta untuk mencoba membuat sendiri sebelum memulai kelas dan di kelas kami melakukan diskusi. Saya sudah mencoba membuat code di open modelica. Berikut adalah open modelica yang saya coba buat :

FungsiObjek.mo
function FungsiObjek
 
input Real x;
output Real y;

algorithm

y:= 2*Modelica.Math.sin(x)-x^2/10;

end FungsiObjek; 

Fungsi tersebut akan dipanggil di suatu file model

BracketOptimal.mo
model BracketOptimal

parameter Integer n = 8;
Real x1[n];
Real x2[n];
Real xup;
Real xlow;
Real f1[n];
Real f2[n];
Real xopt;
Real yopt;
Real d;

algorithm
xup := 4;
xlow := 0;

for i in 1:n loop
  d:=((5^(1/2)-1)/2) * (xup-xlow);
  x1[i] := xlow+d;
  x2[i] := xup-d;
  f1[i] := FungsiObjek(x1[i]);
  f2[i] := FungsiObjek(x2[i]);
  
  if f1[i]>f2[i] then
    xup := xup;
    xlow := x2[i];
    xopt := xup;
    yopt := f1[i];
    else
      xlow :=xlow;
      xup := x1[i];
      xopt := xup;
  end if;
end for;
 

end BracketOptimal;

Dan hasilnya adalah sebagai berikut :

Optimasiy.jpg

Tugas Besar

Sebagai tugas besar, kami diberikan sebuah studi kasus berupa desain rangka suatu lemari. Ketentuan kasus tersebut adalah sebagai berikut :

Soaltubesy.jpg

Tujuan dari studi kasus ini adalah mencari titik optimal untuk pembuatan rangka tersebut. Adapun faktor-faktor yang mempengaruhi optimasi antara lain : jenis material, luas penampang, dan harga. Pada tugas ini, kami diminta untuk menentukan material yang optimal, menentukan luas penampang yang optimal, mencari nilai displacement, reaction force, dan mencari stress.

Perhitungan reaction, displacement, dan stress

Data yang akan dipakai adalah sebgai berikut :

Datay.jpg

Diasumsikan rangka menggunakan siku material SS400 dengan luas penampang sebesar 111 mm^2. Displacement dan Reaction Force yang akan didapatkan adalah sebagai berikut :

            Disy.jpg Reacty.jpg

Dan berikut ini adalah stress yang didapatkan :

Stressy.jpg

Optimasi

Untuk melakukan optimasi ada 2 pendekatan, yaitu

1. Jenis material ditentukan diawal (SS400) dan luas penampang divariasikan

2. Luas penampang ditentukan diawal (0.000111 m^2) dan mencari material yang sesuai.

Proses yang dilakukan untuk mengolah data adalah mencari total harga, safety factor, dan rasio SF terhadap Cost. Kemudian dilakukan juga curve fitting.

1. Elasticity Locked

Berikut adalah data yang digunakan :

Areay.jpg

Kemudian dilakukan optimasi dan didapatkan hasil :

Optareay.jpg
Kesimpulan : Maka luas area yang optimal untuk rangka tersebut jika menggunakan material SS400 adalah sebesar 0,00013 m^2 atau 130 mm^2.


2. Area Locked

Berikut ini adalah data yang digunakan :

Elasy.jpg

Kemudian dilakukan optimasi dan didapatkan hasil :

Optelasy.jpg
Kesimpulan : Maka dengan luas area 111 mm^2, material yang paling optimal untuk digunakan adalah material yang memiliki nilai elastisitas sebesar 203x10^9 Pa atau 203 GPa. 
Material yang paling cocok adalah SS400 karena mempunyai nilai elastisitas yang lebih besar dari nilai optimalnya yaitu sebesar 215 GPa.

Lampiran : Program Open Modelica

TugasBesar.mo
model TugasBesar 

//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.000111;   //Area L Profile  (m2)
parameter Real Elas=245e9;     //Elasticity SS 400  (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,   0,  0,1,1,1;     //1
                         0,0.75,  0,1,1,1;     //2
                       0.6,0.75,  0,1,1,1;     //3
                       0.6,   0,  0,1,1,1;     //4
                              
                         0,   0,  0.4,0,0,0;   //5
                         0,0.75,  0.4,0,0,0;  //6
                       0.6,0.75,  0.4,0,0,0;   //7
                       0.6,   0,  0.4,0,0,0;    //8
                            
                         0,   0,  1.1,0,0,0;   //9
                         0,0.75,  1.1,0,0,0;  //10  
                       0.6,0.75,  1.1,0,0,0;   //11
                       0.6,   0,  1.1,0,0,0;    //12
                            
                         0,   0,  1.8,0,0,0;   //13
                         0,0.75,  1.8,0,0,0;  //14
                       0.6,0.75,  1.8,0,0,0;   //15
                       0.6,   0,  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,-1000, 
                            0,0,-500, 
                            0,0,-500, 
                            0,0,-1000};  

//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 TugasBesar;

curvefitting.mo

class curvefitting

parameter Real X[jumlah plot]={plot};
parameter Real Y[jumlah plot]={plot};
Real Coe[3];
 
algorithm
Coe:=Curve_Fitting(X,Y,2);

end curvefitting;
Curve_Fitting.mo

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;
Golden Section

model Opt_Gold

parameter Real xd[:];
parameter Real yd[size(xd,1)];
parameter Real xlo=87e-6;
parameter Real xhi=504e-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;

UAS (Rabu, 13 Januari 2021

Jawaban UAS

  • Nomor 1
Satuy.jpg
  • Nomor 2
Duay.jpg
  • Nomor 3
Tigay.jpg
  • Nomor 4,5,6, dan Hasil Nomor 7
Empaty.jpg

Pseudocode pada OpenModelica

uas.mo
model uas  

//define initial variable
parameter Integer Points=4; //Number of Points
parameter Integer Trusses=3; //Number of Trusses
parameter Real Yield=215e6; //Yield Strength (Pa)
parameter Real Area=25;   //Area L Profile
parameter Real Elas=245e9;     

//define connection
parameter Integer C[:,2]=[1,2; 
                          1,3;
                          1,4];
         
//define coordinates (please put orderly)
parameter Real P[:,6]=[  0,   0,  0,0,0,0;     //1
                       6.5,6.5,  36.5,1,1,1;     //2
                       6.5,6.5,  36.5,1,1,1;     //3
                       6.5,6.5,  36.5,1,1,1];     //4
                            
//define external force (please put orderly)
parameter Real F[Points * 3] = {0,0,0,0,3708180,0,0,3708180,0,0,3708180,0}; 

//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 uas;


S2

Nama  : Yogi Gunawan Atmawijaya

NPM  : 2406468690


Minggu 1, Selasa 29 Oktober 2024

DAI5 adalah sebuah pendekatan inovatif yang dikembangkan oleh Bapak Ahmad Indra Siswantara untuk proses pemecahan masalah. DAI5 terdiri dari 4 komponen utama yang membantu dalam proses pemecahan masalah. Komponennya adalah:

1. Intention: menetapkan tujuan dan maksud dari pemecahan masalah.

2. Initial Thinking: melakukan pemikiran awal untuk merancang solusi awal.

3. Idealization: membuat model atau representasi yang mendekati kondisi sebenarnya dengan asumsi yang relevan.

4. Instruction Set: Menyusun langkah-langkah atau instruksi yang harus diikuti untuk mencapai solusi yang diinginkan.

Setiap komponen ini bekerja secara terintegrasi untuk memastikan pemecahan masalah yang efektif dan efisien.


Tugas 1

Pada tugas 1 ini saya mencoba sendiri mengetahui finite element equation dari 1D PDE. Untuk mempelajarinya saya menggunakan ChatGPT sebagaimana arahan dari Pak DAI. Prompt yang saya gunakan juga menggunakan prompt yang diberikan oleh Pak DAI.

Setelah ChatGPT menjawab semua pertanyaan saya tentang finite element, saya arahkan ChatGPT untuk merangkumnya dan menjelaskan dengan DAI5 Framework. ChatGPT mengetahui DAI5 Framework dengan cukup baik.


Saya bertanya:

Can you restructure all of your above explanation using DAI5 
Framework with intention step as fundamental step as you also 
mentioned in the following : Free will naturally ties into the 
DAI5 framework because both free will and consciousness play 
vital roles in the intention-setting and decision-making 
processes that drive each step in DAI5. With conscious intention 
as a central element in DAI5, free will could be seen as the 
"engine" that enables individuals to choose how to direct that 
consciousness. This conscious choice—the exercise of free will— 
could then influence each step, from problem understanding to 
creating solutions that align with one’s ultimate goals.


ChatGPT menjawab:

Tugas 1 Yogi 1.png
Tugas 1 Yogi 2.png
Tugas 1 Yogi 3.png
Tugas 1 Yogi 4.png