Muhammad Helmy Yusuf
السَّلاَمُ عَلَيْكُمْ وَرَحْمَةُ اللهِ وَبَرَكَاتُهُ
Muhammad Helmy Yusuf | |
---|---|
Nama Lengkap | Muhammad Helmy Yusuf |
NPM | 1906301236 |
Jurusan | Teknik Mesin |
Alamat Surel | muhammad.helmy@ui.ac.id |
Muhammad Helmy Yusuf (lahir di Kebumen, 13 Juni 2001; umur 19 tahun) adalah seorang mahasiswa Teknik Mesin Universitas Indonesia angkatan 2019. Selain menjalankan tugas utama menjadi mahasiswa, Helmy dikenal aktif dalam berorganisasi dan aktif melakukan kegiatan sosial yang dapat bermanfaat dan berdampak untuk orang lain.
Contents
- 1 Mukadimah
- 2 Metode Numerik
- 3 Pertemuan Perkuliahan
- 3.1 Pertemuan Pertama (Rabu, 11 November 2020)
- 3.2 Pertemuan Kedua (Rabu, 18 November 2020)
- 3.3 Pertemuan Ketiga (Rabu, 25 November 2020)
- 3.4 Pertemuan Keempat (Rabu, 02 Desember 2020)
- 3.5 Pertemuan Kelima/Kelas Pengganti (Senin, 14 Desember 2020)
- 3.6 Pertemuan Keenam (Senin, 16 Desember 2020)
- 3.7 Tugas Besar
Mukadimah
Helmy lahir di Kebumen, Jawa Tengah. Saat sebelum dilahirkan, orang tuanya mengubah namanya hingga 5 kali. Mereka akhirnya memberi nama Helmy, yang Yusuf diberi oleh ibunya dengan harapan menjadi pribadi penyabar dan tumbuh menjadi laki - laki pemaaf dan setampan Nabi Yusuf AS serta memiliki kepribadian luhur seperti Nabi Muhammad SAW.
Helmy menjalani proses pendidikan dasar hingga SMA di Kota Depok. Semasa pendidikannya, Helmy juga aktif dalam berbagai kegiatan ekstrakulikuler sekolah seperti mengikuti Futsal maupun rohani Islam di sekolahnya dan berhasil menjuarai berbagai macam turnamen olahraga maupun akademis. Sehabis menyelesaikan pendidikan SMA-nya di SMAN 2 Depok, pada tahun 2019 ia mengambil jurusan Teknik Mesin di Universitas Indonesia.
Selama berkuliah, Helmy juga mengikuti beberapa organisasi, kepanitiaan, bahkan kegiatan sosial pun pernah diikuti. Saat ini ia menjabat sebagai Badan Pengurus Penelitian dan Pengembangan (LITBANG) di IMM FTUI dan TIS FTUI. Tak hanya di lingkup kampus, ia juga mengikuti organisasi kepemudaan di Indonesia bernama Young On Top dan pernah menjadi Project Officer dalam acara organisasi tersebut. Di TIS FTUI, ia juga menjadi kesatria pengajar dimana mengajar anak-anak di lapak pemulung daerah karang pola, Pasar Minggu, Jakarta Selatan. Melalui hal-hal yang diikutinya membuat Helmy memiliki skill dalam mengolah data, menganalis, mengevaluasi suatu hal berdasarkan data yang diperoleh, dan skill manajemen personal yang baik. Selain itu juga tumbuh kepedulian terhadap sesama dalam dirinya.
Metode Numerik
Metode numerik merupapakan teknik dalam penyelesaian permsalahan yang diformulasikan secara matematis dengan menggunakan operasi hitungan (aritmatik) yaitu operasi tambah, kurang, kali, dan bagi. Metode ini digunakan karena banyak permasalahan matematis tidak dapat diselesaikan menggunakan metode analitik.
Pada kelas Metode Numerik-02 semester gasal 20120/2021, perkuliahan pekan pertama sampai UTS diisi oleh Bapak Dr. Ir. Engkos A. Kosasih, M.T. Dimana telah membahas materi seperti:
- Pseudocode
- Sistem Persamaan
- Turunan Numerik
- Metode Newton Rhapson, Secant, dan Bisection
- Regresi Linear
- Interpolasi
Barulah sehabis UTS proses pembelajaran diisi oleh Bapak Dr. Ir. Ahmad Indra Siswantara
Pertemuan Perkuliahan
Pertemuan Pertama (Rabu, 11 November 2020)
Pada pertemuan pertama setelah UTS diisi oleh Bapak Dr. Ir. Ahmad Indra Siswantara. Dimana dijelaskan terkait esensi atau tujuan pembelajaran metode numerik, yaitu:
1. Memahami konsep-konsep dan prinsip-prinsip dasar dalam metode numerik seperti:Persamaan algoritma, aljabar, pencocokan kurva, persamaan diferensial parsial, dan lainnya
2. Mengerti dan mampu menerapkan pemahaman atau aplikasi terhadap konsep metode numerik
3. Mampu menerapkan metode numerik dalam hal terkait persoalan keteknikan
4. Mendapat nilai tambah/adab sehingga kita menjadi orang yang lebih beradab
Selain empat poin tersebut, kami juga mendapat pelajaran terkait awalan memakai OpenModelica. Dimana kami diperlihatkan praktek sederhana penggunaan OpenModelica ini. Hingga kami tahu bila komputer selain dapat membantu dalam menyelesaikan permasalahan namun juga memiliki batasan atau limit tertentu seperti tidak mampu menentukan nilai 1/0 yang hanya Tuhan yang tahu nilainya. Pelajaran yang dapat dipetik dari kejadian ini ialah kita sebagai manusia haruslah beriman dan jangan pernah melupakan Tuhan yang mengetahui segalanya.
Tugas 1
Pada pertemuan pertama setelah UTS pada tanggal 11 November 2020, kami diminta untuk mempelajari dan memahami penggunaan OpenModelica. Dimana OpenModelica ini merupakan suatu software yang menggunakan bahasa program modelica untuk melakukan simulasi dan perhitungan lainnya. Untuk mempelejarinya saya belajar dari beberapa sumber di YouTube, saya menonton beberapa video dari youtube dalam proses pembelajarannya. Berikut adalah yang telah saya tonton:
Selain itu kami diminta membuat video hasil pembelajaran dan pada video kali ini, saya akan menjelaskan terkait apa yang sudah saya pelajari tentang open modelica dan juga penerapan atau simulasi sederhananya. Berikut rekaman videonya:
pengalaman perdana saya setelah mencobanya, saya merasakan disini menyediakan beberapa fitur yang ramah pengguna untuk membuat, menjelajah, mengedit, dan mensimulasikan model.
Pertemuan Kedua (Rabu, 18 November 2020)
Pada pertemuan kedua ini diawali dengan penjelasan pak Dai tentang orang yang beruntung itu adalah orang yang menjalani hari ini lebih baik dari hari kemarin, dimana memiliki gradien hidup positif. sedangkan apabila masih sama saja berarti gradiennya 0. Bila lebih buruk dari hari kemarin gradiennya negatif. Jadi usahakan untuk lebih baik dari hari sebelumnya dan terus bersikap positif. Kami juga dijelaskan bahwa setiap bahasa ada compilernya, compiler biasa digunakan untuk program komputer yang menerjemahkan program yang ditulis dalam bahasa pemograman tingkat tinggi seperti fortran, pascal, basic, c++ itu diterjemahkan kedalam bahasa mesinnya. Compiler juga berpengaruh ke kecepatan pemrosesannya karena kodingnya akan berbeda beda yang dihasilkan meskipun prinsipnya sama. Compiler biasanya untuk mahasiswa engineering diantaranya fortran dan c karena engineering sangat penting untuk kecepatan perhitungan itu.
Modelica ,singkatnya adalah sebuah bahasa, namun bukan bahasa pemograman/koding. sebenernya koding hanya saja lebih ke bahasa pemodelan. Modelica dibuat dan di desain untuk bahasa pemodelan, dan bukan semata mata untuk bahasa koding seperti python, c, c++ dsb. klo modelica itu bahasa pemodelan. Namun dalam melakukan perhitungannya, sebelom melakukan perhitungan, kode kita yg dituliskan di modelica itu diterjemahkan dulu dalam bahasa c. setelah itu baru dikompilasi ke dalam bahasa mesin baru dapat executable file nya. Kemudian ketika klik simulate lama karena butuh waktu menerjemahkan bahasa modelica ke bahasa c kemudian juga mencompile ke bahasa mesinnya/komputer. sehingga dapat file yg dapat dieksekusi. kalau mau cepat menggunakan parameter-parameter yang dirubah itu dalam bentuk syntaxnya itu parameter, sehingga kita bisa merubah nilainya kemudian tanpa mensimulate ulang.
Di dalam OpenModelica juga memiliki nilai plus. yaitu : *(+) Bukan semata - mata bahasa koding, namun dia bahasa pemodelan. Dimana kita seorang engineering yang memang bukan khusus membuat koding, tapi kita membuat model dan cocok untuk insiyur, juga perhitungannya lumayan cepat juga banyak penggunanya. dan banyak aplikasi2 yg dikembangkan disini *(+) Memudahkan kita untuk cross function atau mempelajari berbagai dasar ilmu dalam 1 software *(+) Open teknologi dan free. beda dengan mathlab dan lainnya yg berbayar
Selanjutnya, Pak Dai juga memerintahkan kami untuk ikut mencoba membuat sebuah function dan class yang nantinya akan dihubungkan. Lewat Share screen yang dipandu oleh Pak Dai, saya mulai mencoba dan mendapatkan hasil yang sama. Ilustrasinya sebagai berikut:
Fungsi yang dibuat yaitu "Fungsi Tambah X1" dengan X sebagai input, Y sebagai output, dan Fungsi yang dibuat adalah Y=10+X. Setelah itu membuat class "Panggil" dimana berfungsi untuk memanggil fungsi tambah X1 yang tadi dibuat. Untuk mendapatkan nilai output Y maka dimasukkanlah nilai input X1. Contohnya saat dibimbing oleh Pak Dai, kami memasukkan X1 sebesar 5. Sehingga didapatkan Hasil yang sesuai yaitu 15. serta dapat diubah-ubah X1 nya dengan re-simulate untuk mendapatkan nilai outputnya.
Tugas 2
Kami diminta untuk mengerjakan aljabar simultan dengan menggunakan variabel array di open modelica. Aljabar simultan adalah metode penyelesaian persoalan matematik yang melibatkan kekompleksan yang sangat rumit sehingga memerlukan cara penyelesaian yang membuatnya simple dengan menggunakan tools yang ada, seperti komputer dengan program visual basic, matlab atau lainnya.
beberapa metode yang terdapat pada aljabar simultan ialah :
1. metode Eliminasi Gauss
2. Metode Cramer
3. Gauss seidel
4. Gauss – jordan.
Sementara itu, variable array adalah variabel yang didalamnya memiliki beberapa data nilai. Contohnya, bila ada data X1, X2, X3 ,dan X4, makadengan menggunakan variabel array cukup dituliskan X[4] saja. Pada tugas 2 ini saya mencoba membuatnya menggunakan 3 persamaan yang sederhana dan memiliki 3 variabel yang harus dicari sebagai berikut :
function
function Gauss_Jordan input Real P[3,3]; input Real Q[3]; output Real X[3]; algorithm X:=Modelica.Math.Matrices.solve(P,Q); end Gauss_Jordan;
class
class SPL parameter Real P[3,3]=[1,1,2; -1,-2,3; 3,-7,4]; parameter Real Q[3]={8,1,10}; Real X[3]; equation X=Gauss_Jordan(P,Q); end SPL;
Berikut adalah rekaman Video dari tugas 2:
Pertemuan Ketiga (Rabu, 25 November 2020)
Pada pertemuan ketiga kali ini diawali dengan menanyakan kabar dan juga kami diperintahkan untuk membagi/melakukan share screen terkait progress belajar metode numerik dan pemahaman tentang penggunaan OpenModelica. Kemudian dilakukan juga pembahasan tentang penggunaan OpenModelica pada permasalahan engineering. Pada permasalahan engineering, metode numerik dapat membantu menyelesaikan persoalan agar lebih cepat. Beberapa contoh metode numerik yang dapat membantu menyelesaikan permasalaha engineering diantaranya CFD(Computation fluid dynamics, Metode Stokastik, dan FEA ( FInite Element Analaysis). Tahapan untuk menyelesaikan masalah engineering menggunakan metode numerik:
- 1. Melakukan analisis terhadap masalah engineering
- 2. Melakukan pemodelan matematis dari masalah yang sudah dianalisis
- 3. Menerjemahkan pemodelan matematis yang sudah dibuat menjadi metode numerik agar bisa dhitung oleh komputer
- 4. Melakukan perhitungan metode numerik menggunakan software dan dihasilkanlah solusi dari masalah engineering tersebut
Ketika kelas kami juga mendapat penjabaran menarik mengenai aljabar simultan, variable array, dan metode Gauss. Kemudian ketika sedang membahas hal ini, saudara Christo yang diminta menjelaskan hasil tugasnya pun menjelaskan terkait apa yang sudah ia buat dan kami turut mendengarkan pemaparannya sembari mencatat hal-hal tersebut. Berikut adalah code modelica untuk Gauss Jordan :
function GaussJordan input Real [:,:] A;//matriks awal output Real [:,:] B;//matriks tereduksi protected Integer h = 1; //pivot row Integer k = 1; //pivot coloumn Integer m = size(A,1); //jumlah baris Integer n = size(A,2); //jumlah kolom 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 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}; //Baris terbawah yang mempunyai dengan 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; //pindah ke pivot kolom dan row selanjutnya h := h+1; k := k+1; end if; end while; // proses dari kanan atas h :=m; k :=n; while h >=1 and k>=1 loop //dealing with error for i in 1:m loop for j in 1:n loop if abs(B[i,j]) <=float_error then B[i,j]:=0; end if; end for; end for; //finding pivot pivot_row := {B[h,i] for i in 1:k}; //Get position index k of pivot c := 0; for element in pivot_row loop c := c+1; if element <> 0 then break; end if; end for; k:= c; // no pivot in this row, move to next row if B[h,k] == 0 then h:= h-1; else //perform row operatation for i in 1:(h-1) loop r := B[i,k]; B[i] := B[i] - B[h] *r; end for; //move to next pivot row dan column h:=h+1; k:=k+1; end if; end while; end GaussJordan;
Tugas 3
Persamaan
class TrussesTugas 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 TrussesTugas;
Transformasi Matriks
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;
Global Element Matrice
function Local_Global
input Real Y[4,4];
input Integer B;
input Integer p1;
input Integer p2;
output Real G[B,B];
algorithm
for i in 1:B loop
for j in 1:B loop
G[i,j]:=0;
end for;
end for;
G[2*p1,2*p1]:=Y[2,2];
G[2*p1-1,2*p1-1]:=Y[1,1];
G[2*p1,2*p1-1]:=Y[2,1];
G[2*p1-1,2*p1]:=Y[1,2];
G[2*p2,2*p2]:=Y[4,4];
G[2*p2-1,2*p2-1]:=Y[3,3];
G[2*p2,2*p2-1]:=Y[4,3];
G[2*p2-1,2*p2]:=Y[3,4];
G[2*p2,2*p1]:=Y[4,2];
G[2*p2-1,2*p1-1]:=Y[3,1];
G[2*p2,2*p1-1]:=Y[4,1];
G[2*p2-1,2*p1]:=Y[3,2];
G[2*p1,2*p2]:=Y[2,4];
G[2*p1-1,2*p2-1]:=Y[1,3];
G[2*p1,2*p2-1]:=Y[2,3];
G[2*p1-1,2*p2]:=Y[1,4];
end Local_Global;
Reaction Matrice Equation
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;
Gauss Jordan
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 (Rabu, 02 Desember 2020)
Pada pertemuan keempat pada tanggal 2 Desember diawali dengan mendiskusikan terkait tugas yang diberikan pada pekan sebelumnya. Disaat teman-teman memaparkan tugas yang dibuatnya ternyata terdapat perbedaan dalam penyelesaiannya, sehingga setelah itu dibahas lebih lanjut agar dapat menemukan penyelesaian yang lebih efektif
Kuis Class Diagram dan Flowchart
Pada pekan ke 4 kami juga diberikan kuis untuk membuat class diagram dan flowchart. kedua hal tersebut berasal dari coding penyelesaian trusses milik josiah enrico. Disini terdapat 5 coding seperti : class tusses, stiffness matrices, local global, gauss-jordan, dan reaction trusses berdasarkan yang josiah buat.
Terlebih dahulu kami diberi instruksi oleh pak dai untuk mendahulukan membuat class diagram dan dilanjutkan membuat flowchartnya.
Tugas 4
Pada PR keempat, kami diperintahkan untuk membuat class diagram, flowchart, dan coding OpenModelica
Pertama, saya membuat terlebih dahulu class diagram dan Flowchartnya sebagai berikut :
Dalam pengerjaan soal ini, saya membuat FBD terlebih dahulu untuk mencari data-data yang diperlukan, yaitu node, sudut, luas, modulus elastisitas, dan panjang dari tiap batang. Karena ini merupakan permasalahan 3D, maka sudut akan ada pada arah x, y, dan z.
StiffnessMatrixElement 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 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 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 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 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
Tugas4TrussNomor8 class Tugas4TrussNomor8 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 Tugas4TrussNomor8;
Sehingga dalam persoalan tersebut didapatkan hasil dari displacement (U) dan Reaction force (R) sebagai berikut :
berikut adalah video terkait penyelesaian 3D Truss menggunakan OpenModelica :
Pertemuan Kelima/Kelas Pengganti (Senin, 14 Desember 2020)
Pada kelas pengganti ini, kami berdiskusi bersama terkait apa yang sudah dipelajari di dalam OpenModelica, lalu kami juga membahas mengenai sistem truss berupa diskusi juga dengan kelas MetNum-03. Kemudian kami diminta pak pak Dai untuk muhasabah diri dan juga memberi penilaian terhadap diri sendiri terkait seberapa jauh pemahaman mengenai mata kuliah Metode Numerik.
Pertemuan Keenam (Senin, 16 Desember 2020)
Pada pertemuan keenam kelas Metnum-02 sebagian besar diisi oleh Bu Chandra yang mempresentasikan dan melakukan pembahasan terkait "One-Dimensional Unconstrained Optimization Using OpenModelica".
Optimasi ialah : -Suatu cara mendapatkan nilai maksimum atau minimum dari suatu permasalahan -Ada fungsi objektif -Ada konstrain
Namun dalam topik yang dibahas pada pertemuan saat ini ialah optimasi fungsi grafik tanpa konstrain. Kami juga di jelaskan mengenai Bracket Optimization Using Golden Ratio Method, yang mana ada satu grafik yang memiliki nilai f(x) global maksimu dan lokal maksimum serta f(x) global minimum dan lokal minimum.
kemudian contoh pengaplikasian optimasi di dalam OpenModelica juga disampaikan di dalam kelas. Kemudian saya turut memncoba menggunakan OpenModelica sebagai berikut :
membuat fungsi yang akan dipanggil
function f_obj3 import Modelica.Math; input Real x; output Real y; algorithm y:= 2*Math.sin(x)-x^2/10; end f_obj3;
kemudian membuat model yang memanggi fungsi dan merupakan alur proses dari penyelesaian metode optimasi yang sudah dibahas
model bracket_optimation3 parameter Integer n=8; Real x1[n]; Real x2[n]; Real xup; Real xlow; Real d; Real f1[n]; Real f2[n]; Real xopt; Real yopt; 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]:= f_obj3(x1[i]); f2[i]:= f_obj3(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 bracket_optimation3;
Hasil yag diperoleh :
Tugas Besar
Tugas besar yang diberikan untuk kelas metnum 02 dan 03 adalah optimasi untuk rangka batang. Kami diminta untuk mendesain rangka yang baik dengan pengeluaran cost yang optimum (serendah mungkin).
Diberikan struktur rangka seperti pada gambar, dengan data yang diberikan seperti berikut:
Diharapkan dari soal tersebut dapat mendesain rangka batang dengan harga terjangkau dan optimal untuk fungsinya.
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:
- Beban akan terdistribusi hanya pada node (karena bersifat trusses).
- 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.
Metodologi
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 171 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.
coding yang digunakan
- Untuk perhitungan displacement, reaction force, stress, dan safety factor:
model Trusses_3D_Tugas_Besar //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.000171; //Area L Profile (Dimension=0.03, 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;
- 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:
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;
Hasil Perhitungan
Displacement
Reaction Force
Safety dan Stress