Difference between revisions of "Diyas Prawara Mahdi"
(21 intermediate revisions by the same user not shown) | |||
Line 426: | Line 426: | ||
− | [[File:Soal_Trusses_2 Diyas.jpg| | + | [[File:Soal_Trusses_2 Diyas.jpg|500px|thumb|center]] |
− | [[File:Soal_Trusses_2 Displacement_Diyas.jpg| | + | [[File:Soal_Trusses_2 Displacement_Diyas.jpg|500px|thumb|center|Grafik Displacement]] |
− | [[File:Soal_Trusses_2 Reaction_Diyas.jpg| | + | [[File:Soal_Trusses_2 Reaction_Diyas.jpg|500px|thumb|center|Grafik Reaction Forces]] |
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | == Minggu 4 02-12-2020 Metode Numerik == | ||
+ | Pada pertemuan hari ini, diawali dengan Pak Dai memberikan motivasi bahwa kita dalam mempelajari metode numerik harus sampai memahami tentang hal-halnya. Setelah itu kami melakukan diskusi tentang bagaimana pengerjaannya dari hasil kerja kami tentang tugas sebelumnya. Kemudian dilanjutkan dengan kami mengerjakan kuis tentang flowchart dengan waktu pengerjaan selama satu jam. | ||
+ | |||
+ | '''KUIS FLOWCHART DAN CLASS DIAGRAM''' | ||
+ | |||
+ | [[File:778086.jpg|400px|thumb|center|Kuis Flow Chart]] | ||
+ | [[File:781017.jpg|400px|thumb|center|Kuis Flow Chart]] | ||
+ | [[File:781018.jpg|400px|thumb|center|Kuis Flow Chart]] | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | == Tugas Week 4 == | ||
+ | Pada minggu ke 4, kami tidak melakukan kegiatan belajar mengajar dikarenakan adanya hari libur sehingga digantikan dengan mengerjakan tugas yang diberikan yaitu membuat flowchart, diagram class, dan coding openmodelica dari soal di bawah. | ||
+ | |||
+ | [[File:1607498641008.jpg|400px|thumb|center|Tugas Week 4]] | ||
+ | |||
+ | |||
+ | Pertama-tama, saya membuat terlebih dahulu Class Diagram dan Flowchart | ||
+ | |||
+ | [[File:791844.jpg|400px|thumb|center|Class Diagram]] | ||
+ | [[File:791845.jpg|400px|thumb|center|Flow Chart]] | ||
+ | |||
+ | |||
+ | Kemudian saya melanjutkan dengan membuat FBD | ||
+ | |||
+ | [[File:791846.jpg|400px|thumb|center|FBD]] | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | | style='border-style: none none solid solid;' | | ||
+ | |||
+ | 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; | ||
+ | |||
+ | |||
+ | |} | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | | style='border-style: none none solid solid;' | | ||
+ | |||
+ | 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; | ||
+ | |||
+ | |||
+ | |} | ||
+ | |||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | | style='border-style: none none solid solid;' | | ||
+ | |||
+ | 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; | ||
+ | |||
+ | |||
+ | |} | ||
+ | |||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | | style='border-style: none none solid solid;' | | ||
+ | |||
+ | 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; | ||
+ | |||
+ | |||
+ | |} | ||
+ | |||
+ | |||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | | style='border-style: none none solid solid;' | | ||
+ | |||
+ | 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; | ||
+ | |||
+ | |||
+ | |} | ||
+ | |||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | | style='border-style: none none solid solid;' | | ||
+ | |||
+ | 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; | ||
+ | |||
+ | |||
+ | |} | ||
+ | |||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | | style='border-style: none none solid solid;' | | ||
+ | |||
+ | class TugasWeek4 | ||
+ | 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 TugasWeek4; | ||
+ | |||
+ | |||
+ | |} | ||
+ | |||
+ | |||
+ | |||
+ | Setelah disimulate, kita mendapatkan nilai displacement (U) dan R | ||
+ | [[File:1607500518690.jpg|500px|thumb|center]] | ||
+ | |||
+ | Video penjelasan dapat dilihat melalui link [https://youtu.be/911X2UlA3_8 Video Penjelasan Tugas Week 4] atau dari video di bawah ini | ||
+ | [[File:TugasWeek4DiyasPrawara.mp4|720px|center]] | ||
+ | |||
+ | |||
+ | |||
+ | == Minggu 5 14-12-2020 == | ||
+ | Pertemuan week 5 dilakukan pada hari Senin, 14-12-2020 dikarenakan pada tanggal 11-12-2020 merupakan hari libur nasional dalam rangka pilkada | ||
+ | |||
+ | == Minggu 6 16-12-2020 == | ||
+ | Pada pertemuan minggu ini, kami terlebih dahulu menonton video yang diberikan oleh Bu Chandra tentang Kasus Optimasi menggunakan metode ''bracket''.. Setelah menonton video tersebut, saya mencoba untuk membuat perhitungan optimasi tesebut dengan referensi dari video Bu Chandra sehingga saya mendapatkan hasil sebagai berikut: | ||
+ | |||
+ | untuk fungsi: | ||
+ | [[File:FungsiKasusOptimasiDiyas.png|500px|thumb|center]] | ||
+ | |||
+ | untuk bracket: | ||
+ | [[File:BracketKasusOptimasiDiyas.png|500px|thumb|center]] | ||
+ | |||
+ | |||
+ | sehingga dari fungsi dan model yang sudah saya buat, saya mendapatkan hasil yaitu: | ||
+ | |||
+ | [[File:HasilJawabanKasusOptimasiDiyas.png|500px|thumb|center]] | ||
+ | |||
+ | Aplikasi Metode Numerik Dalam Kasus Optimasi | ||
+ | |||
+ | |||
+ | == Progress Tugas Besar == | ||
+ | Kami mendapat tugas besar yang diberikan untuk kelas Metode Numerik 02 dan 03 yaitu untuk menghitung dengan menggunakan untuk rangka batang sederhana dengan soal: | ||
+ | [[File:SoalTugasBesarDiyas.jpg|500px|thumb|center]] | ||
+ | |||
+ | dengan spesifikasi: | ||
+ | |||
+ | [[File:DataTugasBesarDiyas.jpg|500px|thumb|center]] | ||
+ | |||
+ | Dari soal di ataas, kita mendesign rangka batang dengan harga yang terjangkau dan optimal dengan faktor-faktor (variabel) bebas yaitu harga, material, dan cross section | ||
+ | |||
+ | |||
+ | Pada proses pengerjaan Tugas Besar, kelas Metode Numerik 02 dan 03 melakukan dua kali diskusi menggunakan platform Zoom dan Google Meets. Diskusi dilakukan pada tanggal 29 Desember 2020 dan 3 Januari 2021. | ||
+ | Hasil dari diskusi pertama yaitu saya dapat mulai paham tentang program modelling yang akan digunakan untuk mengerjakan soal Tugas Besar seperti bagaimana input yang dapat disesuaikan dengan analisis yang akan dipakai yaitu: | ||
+ | |||
+ | 1. Parameter Elastisitas, berhubungan dengan pemilihan jenis material yang akan digunakan (saya menggunakan material Stainless Steel SS304) | ||
+ | |||
+ | 2. Parameter Luas Penampang, berhubungan dengan bentuk rangka yang akan diubah menjadi parameter no point, trusses, dan definisi koordinat dan connection | ||
+ | Pada saat mendeklarasikan, kita mendefinisikan point sambungan dan jumlah trusses karena point dan trusses akan seiring dengan bentuk design yang akan dibuat. Saya membuat model menggunakan aplikasi Autodesk Inventor terlebih dahulu untuk mempermudah pengerjaan karena bisa melihat bentuk aslinya secara 3D. Kemudian diberikan element area yang satuan luas. Setelah itu diberikan parameter elastisitas sesuai dengan material yang akan digunakan. Bentuk permodelan dalam aplikasi OpenModelica saat melakukan deklarasi adalah sebagai berikut: | ||
+ | |||
+ | //define initial variable | ||
+ | parameter Integer Points=size(P,1); //Number of Points | ||
+ | parameter Integer Trusses=size(C,1); //Number of Trusses | ||
+ | parameter Real Yield=215000000; //Yield Strength (Pa) | ||
+ | parameter Real Area=0.000375; //Area L Profile (Dimension=0.04, Thickness=0,005) (m2) | ||
+ | parameter Real Elas=193000000000; //Elasticity of SS304 | ||
+ | |||
+ | |||
+ | Setelah melakukan deklarasi kepada komponen-komponen dasar permodelan, dilakukan juga pendefisian terhadap Connection dan Koordinat Trusses. Pada saat membuat define connection dibuat kumpulan matriks 1x2 yang berisi 2 nama truss yang dihubungkan. Untuk mempermudah pemahaman, susunan koneksi rangka dibangun berdasarkan tingkatan rangka pada desain, seperti lantai 1, 2 , 3 dll. koneksi-koneksi yang ada akan bervariasi sesuai dengan desain dari rangka nya. | ||
+ | |||
+ | Berikut contoh pemodelan Connection yang ada pada program: | ||
+ | |||
+ | |||
+ | //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 | ||
+ | |||
+ | Setelah kita membuat define connection, kita menuliskan koordinat dari tiap point connection di atas. Karena model yang dibuat dalam 3D, pada saat pendefisian ditulis dalam bentuk matrix 1x3 yang tiap nilainya menunjukkan jarak terhadap titik referensi (0,0,0). Pemograman OpenModelica sebagai berikut: | ||
+ | |||
+ | |||
+ | |||
+ | //define coordinates | ||
+ | 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 | ||
+ | |||
+ | |||
+ | |||
+ | Langkah selanjutnya adalah menuliskan definisi terhadap beban yang diberikan. Saya memasukkan beban sesuai dengan soal yaitu 1000N dan 2000N ada tepat di tengah kedua rangka paling atas seperti pada gambar soal. Namun karena analisa yang dibuat menggunakan point connection, maka tiap beban dibagi dua karena beban yang ditulis adalah beban yang diterima oleh point sehingga masing-masing beban menjadi 500, 1000, 1000, dan 500. Beban saya tuliskan dalam bentuk matrix 1x3 untuk tiap truss dari lantai 1 ke lantai 3. Pemograman Open Modelica sebagai berikut: | ||
+ | |||
+ | |||
+ | |||
+ | //define external force | ||
+ | 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}; | ||
+ | |||
+ | |||
+ | Langkah pendeklarasian terakhir yaitu memasukkan komponen-komponen displacement, reaction, stress, safety, dan lainnya sebagai komponen perhitungan dengan pemograman Open Modelica sebagai berikut: | ||
+ | |||
+ | |||
+ | //solution | ||
+ | Real displacement[N], reaction[N]; | ||
+ | Real check[3]; | ||
+ | |||
+ | Real stress1[Trusses]; | ||
+ | Real safety[Trusses]; | ||
+ | Real dis[3]; | ||
+ | Real Str[3]; | ||
+ | |||
+ | |||
+ | |||
+ | Kemudian masuk ke tahap perhitungan sehingga harus mendeklarasikan notasi-notasi yang akan digunakan. Saat membuat Global Matrix diperlukan notasi-notasi baru sehingga aka nada matrix X ((matrix 3x3 hasil kali A*Elastisitas/L) x matrix). Lalu ada notasi cx. cy, dan cz untuk membantu perhitungan matrix global dan matrix q1 dan q2 [1x3] yang menjadi variable untuk mempermudah perhitungan matrix global. Tambahkan juga error sebagai validasinya. Jangan lupa untuk menambahkan Protected di awal coding. Pemograman Open Modelica adalah sebagai berikut: | ||
+ | |||
+ | |||
+ | |||
+ | 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; | ||
+ | |||
+ | |||
+ | Kemudian kita memulai algoritma tentang pembentukkan Global Matrix dengan notasi G sehingga terjadi proses looping notasi i dan j yang akan mengisi variable q1 dan q2. Perbedaan loop i dan j adalah loop i akan memanggil matriks trusses (connection) pada kolom 1, sedangkan loop j akan melakukan looping untuk angka 1-3 hingga q berada dalam fungsi j, q[j] | ||
+ | |||
+ | |||
+ | |||
+ | 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]; | ||
+ | |||
+ | |||
+ | L dicari dengan menentukan jarak vector. Notasi cx, cy, dan cz dibuat untuk memudahkan saat membuat matriks u. Notasi cx seperti menjadi shortcut untuk dibentuknya matriks stiffness. Perhitungan selanjutnya menggunakan pemograman di bawah ini: | ||
+ | |||
+ | |||
+ | //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_TugasBesarDiyas; | ||
+ | |||
+ | |||
+ | Sehingga dari hasil simulasi didapatkan nilai Displacement, Reaction Force, Stress, dan Safety Factor (yield/stress) sebagai berikut: | ||
+ | |||
+ | [[File:DisplacementDiyas1.jpg|500px|thumb|center]] | ||
+ | [[File:DisplacementDiyas2.jpg|500px|thumb|center]] | ||
+ | [[File:ReactionDiyas1.jpg|500px|thumb|center]] | ||
+ | [[File:ReactionDiyas2.jpg|500px|thumb|center]] | ||
+ | [[File:SafetyDiyas.jpg|500px|thumb|center]] | ||
+ | [[File:StressDiyas.jpg|500px|thumb|center]] | ||
+ | |||
+ | |||
+ | Langkah selanjutnya adalah saya melakukan Optimasi. Optimasi adalah metode yang digunakan untuk mendapatkan suatu nilai yang maksimal dari berbagai rasio yang ada. Pada Tugas Besar ini rasio yang dibuat adalah rasio antar Safety Factor dengan Harga Material dengan cara membuat Curve Fitting. Pemograman Open Modelica adalah sebagai berikut: | ||
+ | |||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | | style='border-style: none none solid solid;' | | ||
+ | |||
+ | |||
+ | 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; | ||
+ | |||
+ | |} | ||
+ | |||
+ | |||
+ | Selanjutnya saya melakukan tahap optimasi dengan variable panjang, tebal, jenis material, dan harga. | ||
+ | |||
+ | Material yang digunakan adalah material Stainless Steel dengan kode SS304. Profil yang digunakan adalah profil siku. Harga dalam satuan 6m. Sumber harga saya mencari dari website wijayamakmur.com/siku. | ||
+ | |||
+ | Pemograman Open Modelica untuk golden section material tetap yaitu: | ||
+ | |||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | | style='border-style: none none solid solid;' | | ||
+ | model Opt_Gold | ||
+ | parameter Real xd[:]={0.000144,0.000171,0.000184,0.000201,0.000224,0.000231}; | ||
+ | parameter Real yd[size(xd,1)]={845155,985330,1053955,1144809,1269736,1308215}; | ||
+ | parameter Real xlo=144e-6; | ||
+ | parameter Real xhi=231e-6; | ||
+ | parameter Integer N=10; // maximum iteration | ||
+ | parameter Real es=0.0001; // maximum error | ||
+ | Real f1[N], f2[N], x1[N], x2[N], ea[N], y[3]; | ||
+ | Real xopt, fx; | ||
+ | protected | ||
+ | Real d, xl, xu, xint, R=(5^(1/2)-1)/2; | ||
+ | algorithm | ||
+ | xl := xlo; | ||
+ | xu := xhi; | ||
+ | y := Curve_Fitting(xd,yd); | ||
+ | |||
+ | for i in 1:N loop | ||
+ | d:= R*(xu-xl); | ||
+ | x1[i]:=xl+d; | ||
+ | x2[i]:=xu-d; | ||
+ | f1[i]:=y[1]*x1[i]^2+y[2]*x1[i]+y[3]; | ||
+ | f2[i]:=y[1]*x2[i]^2+y[2]*x2[i]+y[3]; | ||
+ | xint:=xu-xl; | ||
+ | |||
+ | if f1[i]>f2[i] then | ||
+ | xl:=x2[i]; | ||
+ | xopt:=x1[i]; | ||
+ | fx:=f1[i]; | ||
+ | else | ||
+ | xu:=x1[i]; | ||
+ | xopt:=x2[i]; | ||
+ | fx:=f2[i]; | ||
+ | end if; | ||
+ | |||
+ | ea[i]:=(1-R)*abs((xint)/xopt); | ||
+ | if ea[i]<es then | ||
+ | break; | ||
+ | end if; | ||
+ | end for; | ||
+ | end Opt_Gold; | ||
+ | |||
+ | |||
+ | |||
+ | |} | ||
+ | |||
+ | |||
+ | dan pemograman untuk golden section luas area tetap yaitu: | ||
+ | |||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | | style='border-style: none none solid solid;' | | ||
+ | |||
+ | model Opt_Gold | ||
+ | parameter Real xd[:]={193000000000,195000000000,197000000000,200000000000}; | ||
+ | parameter Real yd[size(xd,1)]={1109361,732878,531151,538340}; | ||
+ | parameter Real xlo=193e9; | ||
+ | parameter Real xhi=200e9; | ||
+ | parameter Integer N=10; // maximum iteration | ||
+ | parameter Real es=0.0001; // maximum error | ||
+ | Real f1[N], f2[N], x1[N], x2[N], ea[N], y[3]; | ||
+ | Real xopt, fx; | ||
+ | protected | ||
+ | Real d, xl, xu, xint, R=(5^(1/2)-1)/2; | ||
+ | algorithm | ||
+ | xl := xlo; | ||
+ | xu := xhi; | ||
+ | y := Curve_Fitting(xd,yd); | ||
+ | |||
+ | for i in 1:N loop | ||
+ | d:= R*(xu-xl); | ||
+ | x1[i]:=xl+d; | ||
+ | x2[i]:=xu-d; | ||
+ | f1[i]:=y[1]*x1[i]^2+y[2]*x1[i]+y[3]; | ||
+ | f2[i]:=y[1]*x2[i]^2+y[2]*x2[i]+y[3]; | ||
+ | xint:=xu-xl; | ||
+ | |||
+ | if f1[i]>f2[i] then | ||
+ | xl:=x2[i]; | ||
+ | xopt:=x1[i]; | ||
+ | fx:=f1[i]; | ||
+ | else | ||
+ | xu:=x1[i]; | ||
+ | xopt:=x2[i]; | ||
+ | fx:=f2[i]; | ||
+ | end if; | ||
+ | |||
+ | ea[i]:=(1-R)*abs((xint)/xopt); | ||
+ | if ea[i]<es then | ||
+ | break; | ||
+ | end if; | ||
+ | end for; | ||
+ | end Opt_Gold; | ||
+ | |||
+ | |||
+ | |} | ||
+ | |||
+ | |||
+ | |||
+ | Hasil nilai rasio dari safety factor dengan harga dan kesimpulan: | ||
+ | |||
+ | [[File:HasilExcelDiyas.jpg|500px|thumb|center]] | ||
+ | [[File:HasilRatioDiyas.jpg|500px|thumb|center]] | ||
+ | [[File:HasilOptimumDiyas.jpg|500px|thumb|center]] | ||
+ | |||
+ | |||
+ | Matrial yang paling optimum yang dapat digunakan untuk luas penampang 375mm^2 adalah material dengan nilai elastisitas 193000000000N/m^2 dan material yang paling mendekati yaitu material SS304 | ||
+ | |||
+ | |||
+ | |||
+ | == UAS 13-01-2021 == | ||
+ | [[File:UASDIYAS1.jpg|500px|thumb|center]] | ||
+ | [[File:UASDIYAS3.jpg|500px|thumb|center]] | ||
+ | |||
+ | Dengan pemograman untuk nomor 7 adalah berikut | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | | style='border-style: none none solid solid;' | | ||
+ | |||
+ | model UASDIYAS | ||
+ | //define initial variable | ||
+ | parameter Integer Points = size(P, 1); | ||
+ | //Number of Points | ||
+ | parameter Integer Trusses = size(C, 1); | ||
+ | //Number of Trusses | ||
+ | parameter Real Yield = 214e6; | ||
+ | //Yield Strength (Pa) | ||
+ | parameter Real Area = 50; | ||
+ | //Area L Profile | ||
+ | parameter Real Elas = 68.9e9; | ||
+ | //Elasticity Al 6061 (Pa) | ||
+ | //define connection | ||
+ | parameter Integer C[:, 2] = [1, 2; 1, 3; 1, 4]; | ||
+ | //define coordinates (please put orderly) | ||
+ | parameter Real P[:, 6] = [0, 0, 0, 1, 1, 1; //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; | ||
+ | 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]; | ||
+ | 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; | ||
+ | //Solving Matrix | ||
+ | //Transforming to global matrix | ||
+ | //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; | ||
+ | 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; | ||
+ | //Solving Matrix | ||
+ | //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 UASDIYAS; | ||
+ | |||
+ | |} | ||
+ | |||
+ | [[File:UASDIYAS4.jpg|500px|thumb|center]] |
Latest revision as of 18:27, 13 January 2021
السَّلاَمُ عَلَيْكُمْ وَرَحْمَةُ اللهِ وَبَرَكَاتُهُ
Contents
- 1 Data Pribadi
- 2 Perkenalan Singkat
- 3 Pengalaman Pemograman
- 4 Minggu 1 11-11-2020 Metode Numerik
- 5 Tugas Minggu 1
- 6 Minggu 2 18-11-2020 Metode Numerik
- 7 Minggu 3 25-11-2020 Metode Numerik
- 8 Minggu 4 02-12-2020 Metode Numerik
- 9 Tugas Week 4
- 10 Minggu 5 14-12-2020
- 11 Minggu 6 16-12-2020
- 12 Progress Tugas Besar
- 13 UAS 13-01-2021
Data Pribadi
Nama: Diyas Prawara Mahdi
NPM: 1906301173
TTL: Jakarta, 5 April 2002
Jurusan: Teknik Mesin
Angkatan: 2019
Email: diyas.prawara@ui.ac.id
Perkenalan Singkat
Nama saya Diyas Prawara Mahdi mahasiswa Teknik Mesin Universitas Indonesia 2019 dan saya adalah salah satu ciptaan terbaik dari Tuhan Yang Maha Esa karena pada prinsipnya Tuhan Yang Maha Esa itu mendesain manusia dengan sebaik-baiknya makhluk.
Saya memilih jurusan teknik mesin dikarenakan saya memiliki ketertarikan di bidang otomotif dan juga powerplant. Alasan lainnya adalah ayah saya yang juga merupakan lulusan teknik mesin ui dan Prof. Indra juga mungkin mengenalnya karena merupakan anak bimbingan Bapak dahulu sehingga menjadi motivasi saya.
Pengalaman Pemograman
Sebelumnya saya belum pernah mempelajari tentang pemograman secara serius namun saya senang membaca-baca buku tentang tutorial menggunakan bahasa pemograman seperti pyton dan lainnya walaupun tidak sampai ke level paham sepenuhnya sehingga saya sudah mendapat gambaran kedepannya akan mempelajari hal apa saja.
Minggu 1 11-11-2020 Metode Numerik
Pada tanggal 11-11-2020, Bapak Dr. Ir. Ahmad Indra Siswantara memberikan penjelasan terlebih dahulu tentang apa itu metode numerik dan apa pentingnya metode numerik. Beliau juga menjelaskan bagaimana cara menggunakan Wiki AIR (Ahmad Indra Research Group). Kemudian kami diajak berdiskusi tentang apa saja manfaat dari mempelajari metode numerik untuk kehidupan dan dunia kerja. Lalu, beliau menjabarkan tentang 4 poin penting penilaian dari beliau yaitu:
1. Matching dengan tujuan belajar: memahami konsep dan prinsip dasar di dalam metnum
2. Dapat menerapkan pemahaman terhadap konsep di dalam permodelan numerik (skill)
3. Mampu menerapkan metnum di dalam persoalan keteknikan (skill)
4. Untuk mencapai poin 1,2,3, harus memiliki hal terpenting, yaitu dengan cara moral value (adab)
Setelah itu, beliau memberikan gambaran penggunaan aplikasi OpenModelica dan mengingatkan kepada kita semua bahwa komputer hanyalah sebuah dummy dan kita (manusia) yang dapat mengatur bagaimana komputer itu bekerja. Sebelum kelas berakhir, beliau memberikan kita dua tugas untuk minggu depan, yaitu:
1. Mempelajari Modelica dari Youtube
2. Membuat video bagaimana kita mempelajari Modelica kemudian diupload ke channel youtube dan cantumkan link nya di wiki air masing masing
Tugas Minggu 1
Dari tugas yang diberikan yaitu mempelajari bagaimana menggunakan aplikasi OpenModelica. OpenModelica adalah aplikasi yang dapat melakukan simulation dan modeling. Sumber ajar yang saya gunakan yaitu melalui platform youtube dan dapat diakses melalui link:
- https://www.youtube.com/watch?v=SW5Eclf1tRs
- https://www.youtube.com/watch?v=m0Ahs8fEN28
- https://www.youtube.com/watch?v=GhtBMIlO70w
Setelah saya mempelajari bagaimana cara kerja dari OpenModelica, saya lalu mencoba menggunakan aplikasi tersebut sekaligus mencoba mengerjakan perhitungan sederhana yang dapat diakses melalui link:
Minggu 2 18-11-2020 Metode Numerik
Pada minggu kedua, Pak Dai mengawali pertemuan dengan memberikan kata-kata bahwa kita sebagai manusia harus selalu berusaha agar membuat hari ini lebih baik dibanding hari sebelumnya. Kemudian Pak Dai meminta kepada kami untuk memberikan review tentang apa saja manfaat yang dapat diambil dari mempelajari materi aljabar linear. Lalu kita diminta untuk menghubungkan manfaat tersebut dengan metode numerik. Kemudian kami diminta untuk menayangkan hasil pembuatan tugas 1 di OpenModelica kemudian bebas menceritakan atau bertanya tentang hal yang kurang dipahami. Setelah itu, Pak Dai menjelaskan tentang alasan mengajarkan kepada kami aplikasi OpenModelica yaitu karena lisensinya gratis, memiliki fitur yang lengkap, dan mudah digunakan karena aplikasi OpenModelica itu sendiri lebih ke arah bahasa pemodelan sehingga memiliki interface yang lebih mudah digunakan.
Pak Dai kemudian mengajarkan kepada kami salah satu fitur yang ada di OpenModelica, yaitu fitur yang dapan menghubungkan Function dengan Class sehingga dapat memudahkan kami dalam menggunakan OpenModelica. Setelah itu, kami diberikan tugas yaitu membuat sebuah fungsi persamaan aljabar simultan dengan variabel array lalu membuat Class dan memanggil Class ke dalam fungsi tersebut. Hasil pembuatan tugas ini dapat dilihat pada video berikut:
Minggu 3 25-11-2020 Metode Numerik
Pada minggu ketiga, Pak Dai mengajak kita untuk membahas apa saja maanfaat aplikasi metode numerik dalam permasalahan di lingkup teknik. Pak Dai juga menjelaskan software yang dapat digunakan untuk menghitung aplikasi metode numerik di lingkup teknik seperti CFD. Stokastik, dan FEA. Saat kita akan melakukan operasi perhitungan pada masalah teknik, ada urutan agar hasil sesuai, yaitu
1. Melakukan analisis
2. Membuat model matematis
3. Menggunakan software untuk melakukan perhitungan metode numerik berbasis permasalahan teknik
4. Hasil dari perhitungan keluar
Pada minggu ini, ada dua tugas yang diberikan. Yang pertama adalah tugas sebelum kelas dimulai dan tugas homework. Keduanya menggunakan permasalahan Truss.
TUGAS SEBELUM KELAS
Persamaan
model Trusses parameter Integer N=10; //Global matrice = 2*points connected parameter Real A=8; parameter Real E=1.9e6; Real G[N,N]; //global Real Ginitial[N,N]; //global Real Sol[N]; //global dispplacement Real X[N]={0,0,0,0,0,0,0,-500,0,-500}; Real R[N]; //global reaction force Real SolMat[N,1]; Real XMat[N,1]; //boundary coundition Integer b1=1; Integer b2=3; //truss 1 parameter Real X1=0; //degree between truss Real k1=A*E/36; Real K1[4,4]; //stiffness matrice Integer p1a=1; Integer p1b=2; Real G1[N,N]; //truss 2 parameter Real X2=135; //degree between truss Real k2=A*E/50.912; Real K2[4,4]; //stiffness matrice Integer p2a=2; Integer p2b=3; Real G2[N,N]; //truss 3 parameter Real X3=0; //degree between truss Real k3=A*E/36; Real K3[4,4]; //stiffness matrice Integer p3a=3; Integer p3b=4; Real G3[N,N]; //truss 4 parameter Real X4=90; //degree between truss Real k4=A*E/36; Real K4[4,4]; //stiffness matrice Integer p4a=2; Integer p4b=4; Real G4[N,N]; //truss 5 parameter Real X5=45; //degree between truss Real k5=A*E/50.912; Real K5[4,4]; //stiffness matrice Integer p5a=2; Integer p5b=5; Real G5[N,N]; //truss 6 parameter Real X6=0; //degree between truss Real k6=A*E/36; Real K6[4,4]; //stiffness matrice Integer p6a=4; Integer p6b=5; Real G6[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); K6:=Stiffness_Matrices(X6); G6:=k6*Local_Global(K6,N,p6a,p6b); G:=G1+G2+G3+G4+G5+G6; Ginitial:=G; //implementing boundary condition for i in 1:N loop G[2*b1-1,i]:=0; G[2*b1,i]:=0; G[2*b2-1,i]:=0; G[2*b2,i]:=0; end for; G[2*b1-1,2*b1-1]:=1; G[2*b1,2*b1]:=1; G[2*b2-1,2*b2-1]:=1; G[2*b2,2*b2]:=1; //solving displacement Sol:=Gauss_Jordan(N,G,X); //solving reaction force SolMat:=matrix(Sol); XMat:=matrix(X); R:=Reaction_Trusses(N,Ginitial,SolMat,XMat); end Trusses;
|}
Trusses Problem 2 (Homework)
Persamaan class Trusses_PR_Week3 parameter Integer N=8; //Global matrice = 2*points connected parameter Real A=0.001; //Area m2 parameter Real E=200e9; //Pa Real G[N,N]; //global Real Ginitial[N,N]; //global Real Sol[N]; //global dispplacement Real X[N]={0,0,-1035.2762,-3863.7033,0,0,-1035.2762,-3863.7033}; Real R[N]; //global reaction force Real SolMat[N,1]; Real XMat[N,1]; //boundary condition Integer b1=1; Integer b2=3; //truss 1 parameter Real X1=0; //degree between truss Real k1=A*E/1; Real K1[4,4]; //stiffness matrice Integer p1a=1; Integer p1b=2; Real G1[N,N]; //truss 2 parameter Real X2=0; //degree between truss Real k2=A*E/1; Real K2[4,4]; //stiffness matrice Integer p2a=2; Integer p2b=3; Real G2[N,N]; //truss 3 parameter Real X3=90; //degree between truss Real k3=A*E/1.25; Real K3[4,4]; //stiffness matrice Integer p3a=2; Integer p3b=4; Real G3[N,N]; //truss 4 parameter Real X4=90+38.6598; //degree between truss Real k4=A*E/1.6; Real K4[4,4]; //stiffness matrice Integer p4a=1; Integer p4b=4; Real G4[N,N]; //truss 5 parameter Real X5=90-38.6598; //degree between truss Real k5=A*E/1.6; Real K5[4,4]; //stiffness matrice Integer p5a=3; Integer p5b=4; Real G5[N,N]; /* for each truss, please ensure pXa is lower then pXb (X represents truss element number) */ algorithm //creating global matrice K1:=Stiffness_Matrices(X1); G1:=k1*Local_Global(K1,N,p1a,p1b); K2:=Stiffness_Matrices(X2); G2:=k2*Local_Global(K2,N,p2a,p2b); K3:=Stiffness_Matrices(X3); G3:=k3*Local_Global(K3,N,p3a,p3b); K4:=Stiffness_Matrices(X4); G4:=k4*Local_Global(K4,N,p4a,p4b); K5:=Stiffness_Matrices(X5); G5:=k5*Local_Global(K5,N,p5a,p5b); G:=G1+G2+G3+G4+G5; Ginitial:=G; //implementing boundary condition for i in 1:N loop G[2*b1-1,i]:=0; G[2*b1,i]:=0; G[2*b2-1,i]:=0; G[2*b2,i]:=0; end for; G[2*b1-1,2*b1-1]:=1; G[2*b1,2*b1]:=1; G[2*b2-1,2*b2-1]:=1; G[2*b2,2*b2]:=1; //solving displacement Sol:=Gauss_Jordan(N,G,X); //solving reaction force SolMat:=matrix(Sol); XMat:=matrix(X); R:=Reaction_Trusses(N,Ginitial,SolMat,XMat); end Trusses_PR_Week_3; |
Fungsi Panggil
Matrice Transformation 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; |
Minggu 4 02-12-2020 Metode Numerik
Pada pertemuan hari ini, diawali dengan Pak Dai memberikan motivasi bahwa kita dalam mempelajari metode numerik harus sampai memahami tentang hal-halnya. Setelah itu kami melakukan diskusi tentang bagaimana pengerjaannya dari hasil kerja kami tentang tugas sebelumnya. Kemudian dilanjutkan dengan kami mengerjakan kuis tentang flowchart dengan waktu pengerjaan selama satu jam.
KUIS FLOWCHART DAN CLASS DIAGRAM
Tugas Week 4
Pada minggu ke 4, kami tidak melakukan kegiatan belajar mengajar dikarenakan adanya hari libur sehingga digantikan dengan mengerjakan tugas yang diberikan yaitu membuat flowchart, diagram class, dan coding openmodelica dari soal di bawah.
Pertama-tama, saya membuat terlebih dahulu Class Diagram dan Flowchart
Kemudian saya melanjutkan dengan membuat FBD
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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
class TugasWeek4 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 TugasWeek4;
|
Setelah disimulate, kita mendapatkan nilai displacement (U) dan R
Video penjelasan dapat dilihat melalui link Video Penjelasan Tugas Week 4 atau dari video di bawah ini
Minggu 5 14-12-2020
Pertemuan week 5 dilakukan pada hari Senin, 14-12-2020 dikarenakan pada tanggal 11-12-2020 merupakan hari libur nasional dalam rangka pilkada
Minggu 6 16-12-2020
Pada pertemuan minggu ini, kami terlebih dahulu menonton video yang diberikan oleh Bu Chandra tentang Kasus Optimasi menggunakan metode bracket.. Setelah menonton video tersebut, saya mencoba untuk membuat perhitungan optimasi tesebut dengan referensi dari video Bu Chandra sehingga saya mendapatkan hasil sebagai berikut:
untuk fungsi:
untuk bracket:
sehingga dari fungsi dan model yang sudah saya buat, saya mendapatkan hasil yaitu:
Aplikasi Metode Numerik Dalam Kasus Optimasi
Progress Tugas Besar
Kami mendapat tugas besar yang diberikan untuk kelas Metode Numerik 02 dan 03 yaitu untuk menghitung dengan menggunakan untuk rangka batang sederhana dengan soal:
dengan spesifikasi:
Dari soal di ataas, kita mendesign rangka batang dengan harga yang terjangkau dan optimal dengan faktor-faktor (variabel) bebas yaitu harga, material, dan cross section
Pada proses pengerjaan Tugas Besar, kelas Metode Numerik 02 dan 03 melakukan dua kali diskusi menggunakan platform Zoom dan Google Meets. Diskusi dilakukan pada tanggal 29 Desember 2020 dan 3 Januari 2021.
Hasil dari diskusi pertama yaitu saya dapat mulai paham tentang program modelling yang akan digunakan untuk mengerjakan soal Tugas Besar seperti bagaimana input yang dapat disesuaikan dengan analisis yang akan dipakai yaitu:
1. Parameter Elastisitas, berhubungan dengan pemilihan jenis material yang akan digunakan (saya menggunakan material Stainless Steel SS304)
2. Parameter Luas Penampang, berhubungan dengan bentuk rangka yang akan diubah menjadi parameter no point, trusses, dan definisi koordinat dan connection Pada saat mendeklarasikan, kita mendefinisikan point sambungan dan jumlah trusses karena point dan trusses akan seiring dengan bentuk design yang akan dibuat. Saya membuat model menggunakan aplikasi Autodesk Inventor terlebih dahulu untuk mempermudah pengerjaan karena bisa melihat bentuk aslinya secara 3D. Kemudian diberikan element area yang satuan luas. Setelah itu diberikan parameter elastisitas sesuai dengan material yang akan digunakan. Bentuk permodelan dalam aplikasi OpenModelica saat melakukan deklarasi adalah sebagai berikut:
//define initial variable parameter Integer Points=size(P,1); //Number of Points parameter Integer Trusses=size(C,1); //Number of Trusses parameter Real Yield=215000000; //Yield Strength (Pa) parameter Real Area=0.000375; //Area L Profile (Dimension=0.04, Thickness=0,005) (m2) parameter Real Elas=193000000000; //Elasticity of SS304
Setelah melakukan deklarasi kepada komponen-komponen dasar permodelan, dilakukan juga pendefisian terhadap Connection dan Koordinat Trusses. Pada saat membuat define connection dibuat kumpulan matriks 1x2 yang berisi 2 nama truss yang dihubungkan. Untuk mempermudah pemahaman, susunan koneksi rangka dibangun berdasarkan tingkatan rangka pada desain, seperti lantai 1, 2 , 3 dll. koneksi-koneksi yang ada akan bervariasi sesuai dengan desain dari rangka nya.
Berikut contoh pemodelan Connection yang ada pada program:
//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
Setelah kita membuat define connection, kita menuliskan koordinat dari tiap point connection di atas. Karena model yang dibuat dalam 3D, pada saat pendefisian ditulis dalam bentuk matrix 1x3 yang tiap nilainya menunjukkan jarak terhadap titik referensi (0,0,0). Pemograman OpenModelica sebagai berikut:
//define coordinates 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
Langkah selanjutnya adalah menuliskan definisi terhadap beban yang diberikan. Saya memasukkan beban sesuai dengan soal yaitu 1000N dan 2000N ada tepat di tengah kedua rangka paling atas seperti pada gambar soal. Namun karena analisa yang dibuat menggunakan point connection, maka tiap beban dibagi dua karena beban yang ditulis adalah beban yang diterima oleh point sehingga masing-masing beban menjadi 500, 1000, 1000, dan 500. Beban saya tuliskan dalam bentuk matrix 1x3 untuk tiap truss dari lantai 1 ke lantai 3. Pemograman Open Modelica sebagai berikut:
//define external force 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};
Langkah pendeklarasian terakhir yaitu memasukkan komponen-komponen displacement, reaction, stress, safety, dan lainnya sebagai komponen perhitungan dengan pemograman Open Modelica sebagai berikut:
//solution Real displacement[N], reaction[N]; Real check[3];
Real stress1[Trusses]; Real safety[Trusses]; Real dis[3]; Real Str[3];
Kemudian masuk ke tahap perhitungan sehingga harus mendeklarasikan notasi-notasi yang akan digunakan. Saat membuat Global Matrix diperlukan notasi-notasi baru sehingga aka nada matrix X ((matrix 3x3 hasil kali A*Elastisitas/L) x matrix). Lalu ada notasi cx. cy, dan cz untuk membantu perhitungan matrix global dan matrix q1 dan q2 [1x3] yang menjadi variable untuk mempermudah perhitungan matrix global. Tambahkan juga error sebagai validasinya. Jangan lupa untuk menambahkan Protected di awal coding. Pemograman Open Modelica adalah sebagai berikut:
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;
Kemudian kita memulai algoritma tentang pembentukkan Global Matrix dengan notasi G sehingga terjadi proses looping notasi i dan j yang akan mengisi variable q1 dan q2. Perbedaan loop i dan j adalah loop i akan memanggil matriks trusses (connection) pada kolom 1, sedangkan loop j akan melakukan looping untuk angka 1-3 hingga q berada dalam fungsi j, q[j]
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];
L dicari dengan menentukan jarak vector. Notasi cx, cy, dan cz dibuat untuk memudahkan saat membuat matriks u. Notasi cx seperti menjadi shortcut untuk dibentuknya matriks stiffness. Perhitungan selanjutnya menggunakan pemograman di bawah ini:
//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_TugasBesarDiyas;
Sehingga dari hasil simulasi didapatkan nilai Displacement, Reaction Force, Stress, dan Safety Factor (yield/stress) sebagai berikut:
Langkah selanjutnya adalah saya melakukan Optimasi. Optimasi adalah metode yang digunakan untuk mendapatkan suatu nilai yang maksimal dari berbagai rasio yang ada. Pada Tugas Besar ini rasio yang dibuat adalah rasio antar Safety Factor dengan Harga Material dengan cara membuat Curve Fitting. Pemograman Open Modelica adalah sebagai berikut:
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; |
Selanjutnya saya melakukan tahap optimasi dengan variable panjang, tebal, jenis material, dan harga.
Material yang digunakan adalah material Stainless Steel dengan kode SS304. Profil yang digunakan adalah profil siku. Harga dalam satuan 6m. Sumber harga saya mencari dari website wijayamakmur.com/siku.
Pemograman Open Modelica untuk golden section material tetap yaitu:
model Opt_Gold parameter Real xd[:]={0.000144,0.000171,0.000184,0.000201,0.000224,0.000231}; parameter Real yd[size(xd,1)]={845155,985330,1053955,1144809,1269736,1308215}; parameter Real xlo=144e-6; parameter Real xhi=231e-6; parameter Integer N=10; // maximum iteration parameter Real es=0.0001; // maximum error Real f1[N], f2[N], x1[N], x2[N], ea[N], y[3]; Real xopt, fx; protected Real d, xl, xu, xint, R=(5^(1/2)-1)/2; algorithm xl := xlo; xu := xhi; y := Curve_Fitting(xd,yd); for i in 1:N loop d:= R*(xu-xl); x1[i]:=xl+d; x2[i]:=xu-d; f1[i]:=y[1]*x1[i]^2+y[2]*x1[i]+y[3]; f2[i]:=y[1]*x2[i]^2+y[2]*x2[i]+y[3]; xint:=xu-xl; if f1[i]>f2[i] then xl:=x2[i]; xopt:=x1[i]; fx:=f1[i]; else xu:=x1[i]; xopt:=x2[i]; fx:=f2[i]; end if; ea[i]:=(1-R)*abs((xint)/xopt); if ea[i]<es then break; end if; end for; end Opt_Gold;
|
dan pemograman untuk golden section luas area tetap yaitu:
model Opt_Gold parameter Real xd[:]={193000000000,195000000000,197000000000,200000000000}; parameter Real yd[size(xd,1)]={1109361,732878,531151,538340}; parameter Real xlo=193e9; parameter Real xhi=200e9; parameter Integer N=10; // maximum iteration parameter Real es=0.0001; // maximum error Real f1[N], f2[N], x1[N], x2[N], ea[N], y[3]; Real xopt, fx; protected Real d, xl, xu, xint, R=(5^(1/2)-1)/2; algorithm xl := xlo; xu := xhi; y := Curve_Fitting(xd,yd); for i in 1:N loop d:= R*(xu-xl); x1[i]:=xl+d; x2[i]:=xu-d; f1[i]:=y[1]*x1[i]^2+y[2]*x1[i]+y[3]; f2[i]:=y[1]*x2[i]^2+y[2]*x2[i]+y[3]; xint:=xu-xl; if f1[i]>f2[i] then xl:=x2[i]; xopt:=x1[i]; fx:=f1[i]; else xu:=x1[i]; xopt:=x2[i]; fx:=f2[i]; end if; ea[i]:=(1-R)*abs((xint)/xopt); if ea[i]<es then break; end if; end for; end Opt_Gold;
|
Hasil nilai rasio dari safety factor dengan harga dan kesimpulan:
Matrial yang paling optimum yang dapat digunakan untuk luas penampang 375mm^2 adalah material dengan nilai elastisitas 193000000000N/m^2 dan material yang paling mendekati yaitu material SS304
UAS 13-01-2021
Dengan pemograman untuk nomor 7 adalah berikut
model UASDIYAS //define initial variable parameter Integer Points = size(P, 1); //Number of Points parameter Integer Trusses = size(C, 1); //Number of Trusses parameter Real Yield = 214e6; //Yield Strength (Pa) parameter Real Area = 50; //Area L Profile parameter Real Elas = 68.9e9; //Elasticity Al 6061 (Pa) //define connection parameter Integer C[:, 2] = [1, 2; 1, 3; 1, 4]; //define coordinates (please put orderly) parameter Real P[:, 6] = [0, 0, 0, 1, 1, 1; //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; 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]; 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; //Solving Matrix //Transforming to global matrix //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; 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; //Solving Matrix //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 UASDIYAS; |