Difference between revisions of "Metnum03 Edward Joshua Patrianus Mendrofa"
(34 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
__TOC__ | __TOC__ | ||
− | + | Pertemuan Metode Numerik 03 | |
− | + | =Pertemuan 1= | |
Metode Numerik adalah salah satu mata kuliah yang sangat banyak penerapannya dalam dunia keteknikan. Mata kuliah ini salah satu mata kuliah yang cukup menarik karena penerapannya sangat luas dan bermanfaat. Sejauh ini yang telah saya pelajari sebelum UTS mencakup 3 materi besar yaitu mencari akar-akar, regresi linier, dan turunan numerik. | Metode Numerik adalah salah satu mata kuliah yang sangat banyak penerapannya dalam dunia keteknikan. Mata kuliah ini salah satu mata kuliah yang cukup menarik karena penerapannya sangat luas dan bermanfaat. Sejauh ini yang telah saya pelajari sebelum UTS mencakup 3 materi besar yaitu mencari akar-akar, regresi linier, dan turunan numerik. | ||
Line 9: | Line 9: | ||
Pada materi ini, saya mempelajari metode-metode untuk mencari akar secara numerik. Beberapa metode yang saya pelajari adalah metode pencarian akar menggunakan Closed methods (Bracketing Method) dan Open Methods. | Pada materi ini, saya mempelajari metode-metode untuk mencari akar secara numerik. Beberapa metode yang saya pelajari adalah metode pencarian akar menggunakan Closed methods (Bracketing Method) dan Open Methods. | ||
− | ''Metode Closed Methods'' merupakan metode pencarian akar-akar dengan menggunakan batas atas dan batas bawah untuk mencari akar dan mengukur persentasi error yang didapat untuk mendapat tingkat akurasi dari iterasi. Metode yang saya pelajari ada 3 yaitu Graphical Methods, Bisection Methods, dan False-Position Methods. | + | {|class="wikitable" |
+ | |''Metode Closed Methods'' merupakan metode pencarian akar-akar dengan menggunakan batas atas dan batas bawah untuk mencari akar dan mengukur persentasi error yang didapat untuk mendapat tingkat akurasi dari iterasi. Metode yang saya pelajari ada 3 yaitu Graphical Methods, Bisection Methods, dan False-Position Methods. | ||
− | + | '''Graphical Methods''' | |
Sebuah metode sederhana yang menggunakan grafik untuk memperkirakan akar-akar suatu fungsi. Metode ini dilakukan dengan melakukan plotting dari suatu fungsi ke dalam bentuk grafik. | Sebuah metode sederhana yang menggunakan grafik untuk memperkirakan akar-akar suatu fungsi. Metode ini dilakukan dengan melakukan plotting dari suatu fungsi ke dalam bentuk grafik. | ||
− | + | '''Bisection Methods''' | |
Metode ini merupakan salah satu jenis metode incremental search method yang menggunakan batas atas dan batas bawah untuk mempersempit area pencarian akar-akar. | Metode ini merupakan salah satu jenis metode incremental search method yang menggunakan batas atas dan batas bawah untuk mempersempit area pencarian akar-akar. | ||
− | + | '''False-Position Methods''' | |
+ | |||
+ | [[File:Rumus-false-position.png|thumb|300px|style="float:right;"|Rumus ''False Position Method'']] | ||
Metode ini sangat mirip dengan metode Bisection. Hal yang membedakan metode False-Position dengan Bisection adalah penentuan titik tengah dari batas-batas yang ditentukan. Penentuan titik tengah dari False-Position Method menggunakan persamaan berikut. | Metode ini sangat mirip dengan metode Bisection. Hal yang membedakan metode False-Position dengan Bisection adalah penentuan titik tengah dari batas-batas yang ditentukan. Penentuan titik tengah dari False-Position Method menggunakan persamaan berikut. | ||
+ | |} | ||
− | + | {|class="wikitable" | |
+ | |''Metode Open Methods'' merupakan metode pencarian yang hanya menggunakan 1 titik untuk menemukan akar-akar. Metode ini dapat menggunakan turunan suatu fungsi untuk menentukan titik pengujian baru yang semakin dekat dengan nilai akar-akar yang diinginakn. Metode yang saya pelajari ada 3 yaitu Fixed-Point Iteration, Newton-Rapshon, dan Secant Method | ||
− | '' | + | '''Fixed-Point Iteration''' |
− | |||
− | |||
Metode ini disebut juga metode iterasi sederhana, adalah metode yang memisahkan x dengan sebagian x yang lain sehingga diperoleh: x=g(x) | Metode ini disebut juga metode iterasi sederhana, adalah metode yang memisahkan x dengan sebagian x yang lain sehingga diperoleh: x=g(x) | ||
− | + | '''Newton-Raphson''' [[File:Rumus-newton-raphson.png|thumb|300px|style="float:left;"|Rumus ''Newton Rapshon'']] | |
Metode ini menggunakan satu titik awal dan mendekatinya dengan memperhatikan slope atau gradien pada titik tersebut. Slop atau gradien didapatkan dengan melakukan turunan dari fungsi tersebut. Persamaan untuk Newton-Raphson adalah sebagai berikut: | Metode ini menggunakan satu titik awal dan mendekatinya dengan memperhatikan slope atau gradien pada titik tersebut. Slop atau gradien didapatkan dengan melakukan turunan dari fungsi tersebut. Persamaan untuk Newton-Raphson adalah sebagai berikut: | ||
− | |||
− | + | ||
+ | |||
+ | |||
+ | |||
+ | '''Secant Method''' | ||
Metode ini merupakan metode modifikasi Newton-Raphson dimana metode Newton-Raphson tidak digunakan (karena f'(x) sulit ditemukan atau tidak mungkin ditemukan). Persaman untuk metode Secant adalah sebagai berikut | Metode ini merupakan metode modifikasi Newton-Raphson dimana metode Newton-Raphson tidak digunakan (karena f'(x) sulit ditemukan atau tidak mungkin ditemukan). Persaman untuk metode Secant adalah sebagai berikut | ||
− | [[File:Rumus-secant.png]] | + | [[File:Rumus-secant.png|thumb|300px|style="float:left;"|Rumus ''Secant'']] |
+ | |||
+ | |} | ||
'''2. Regresi Linier''' | '''2. Regresi Linier''' | ||
Line 61: | Line 69: | ||
[[File:numerical-difference-approx.png]] | [[File:numerical-difference-approx.png]] | ||
− | + | ==Tugas Pertemuan 1: OpenModelica== | |
+ | |||
+ | Setelah pertemuan 1, pak Dai meminta kami untuk mempelajari OpenModelica | ||
Untuk mempelajari OpenModelica, saya menggunakan referensi/tutorial dari YouTube dengan tautan berikut: | Untuk mempelajari OpenModelica, saya menggunakan referensi/tutorial dari YouTube dengan tautan berikut: | ||
Line 79: | Line 89: | ||
Dengan menggunakan referensi dari tautan kedua, saya membuat bahasa pemograman untuk menyelesaikan persamaan pendulum tersebut. | Dengan menggunakan referensi dari tautan kedua, saya membuat bahasa pemograman untuk menyelesaikan persamaan pendulum tersebut. | ||
− | model pendulum | + | model pendulum |
+ | Real y "variable state"; | ||
+ | Real x; | ||
+ | parameter Real L=1 "pendulum length"; | ||
+ | constant Real g=9.80665; | ||
+ | initial equation | ||
+ | y=9 "initial value"; | ||
+ | equation | ||
+ | x=der(y); | ||
+ | der(x)+(g/L)*(y)=0 "differential equation"; | ||
+ | annotation(experiment(StartTime = 0, StopTime = 100)); | ||
+ | end pendulum; | ||
+ | |||
+ | |||
+ | Penyelesaian dari persamaan tersebut digambarkan dalam bentuk grafik sebagai berikut | ||
+ | |||
+ | [[File:pendulum-solution-om.png|600px|Hasil Plotting]] | ||
+ | |||
+ | Dari grafik tersebut dapat dilihat bahwa seiring berjalannya waktu, pendulum melakukan osilasi. Namun dapat dilihat bahwa pendulum tersebut tidak kembali ketitik semula seiring berjalannya waktu. | ||
+ | |||
+ | Dari pembelajaran ini, saya mempelajari bahwa OpenModelica merupakan tools yang berguna dalam pelajaran Metode Numerik. | ||
+ | |||
+ | |||
+ | =Pertemuan 2= | ||
+ | Pada pertemuan kedua ini, pak Dai mengevaluasi hasil belajar kami tentang yang sudah kami pelajari tentang Metode Numerik sebelum UTS, serta mempelajari penggunaan aplikasi OpenModelica. Kemudian kami diminta untuk membuat coding sederhana terkait nilai rata-rata 10 sample. | ||
+ | |||
+ | Setelah sesi belajar tatap muka berakhir, kami diberikan tugas oleh pak Dai untuk membuat model untuk menyelesaikan persamaan-persamaan aljabar simultan (seperti Gauss Elimination, Gauss-Seidel, dll.). | ||
+ | |||
+ | Untuk PR, saya menggunakan 3 persamaan aljabar sebagai berikut: | ||
+ | [[File:Fungsi-aljabar-simultan.png|300px|center]] | ||
+ | |||
+ | Persamaan aljabar simultan tersebut dapat diselesaikan dengan metode konvensional seperti ''Naive Gauss Elimination'', atau menggunakan metode lain seperti''Gauss Elimination'' yang melibatkan matriks , atau ''Gauss Seidel''. Pada kali ini, saya menggunakan metode Gauss Elimination untuk menyelesaikan persamaan tersebut. | ||
+ | |||
+ | Gauss Elimination adalah algoritme yang digunakan untuk menyelesaikan sistem persamaan linear. Metode ini melibatkan perubahan bentuk sistem persamaan menjadi bentuk matriks. Setelah mengubah sistem dalam bentuk matriks, lalu dilakukan pengurangan baris dengan mengganti posisi baris, dan/atau melakukan operasi penjumlahan dan pengurangan antar baris. | ||
+ | |||
+ | Modelica menyediakan model untuk menyelesaikan permasalahan aljabar simultan dengan menggunakan metode Gauss Elimination. Maka dari itu, saya mengubah sistem persamaan tersebut menjadi bentuk matriks. Berikut adalah model yang saya buat dengan OpenModelica: | ||
+ | |||
+ | [[File:gauss-elimination.png|600px|center]] | ||
+ | |||
+ | Saya menggunakan perintah dari library modelica yaitu "Modelica.Math.Matrices.solve(A,b)" untuk menyelesaikan sistem persamaan linier tersebut. | ||
+ | |||
+ | Setelah melakukan pengecekan dan melakukan simulasi terhadap model, saya melakukan plotting terhadap hasil simulasi tersebut. Berikut adalah hasil plotting tersebut: | ||
+ | |||
+ | [[File:plotting-gauss-elimination.png|600px|center]] | ||
+ | |||
+ | dapat dilihat bahwa hasil plotting tersebut menunjukkan penyelesaian dari permasalaha sistem persamaan yang telah ditunjukkan sebelumnya, yaitu x1=3, x2=2, x3=1. | ||
+ | |||
+ | =Pertemuan 3= | ||
+ | Pada pertemuan hari ini, Pak Dai menjelaskan mengenai aplikasi metode numerik pada permasalahan teknik. Salah satu permasalahan teknik yang dibahas adalah permasalahan sistem pegas-massa. Lalu pak Dai meminta kami untuk memahami permasalahan pada Figure 12.11 pada e-book Metode Numerik. Dengan mengubah sistem menjadi bentuk matrix, kita mendapatkan bentuk matrix dari sistem tersebut sebagai berikut: | ||
+ | |||
+ | persamaan matrix tersebut dapat diselesaikan dengan metode eliminasi gauss. Lalu saya membuat coding di OpenModelica sebagai berikut: | ||
+ | |||
+ | [[File:spring-mass-model.png|600px|center]] | ||
+ | |||
+ | setelah melakukan melakukan pengecekan dan tidak ada masalah, saya melakukan simulasi untuk menemukan nilai x1,x2, dan x3 dari persamaan matriks tersebut. Setelah melakukan simulasi, saya melakukan plotting untuk melihat hasil yang ditemukan | ||
+ | |||
+ | [[File:hasil-plotting-spring-mass.png|600px|center]] | ||
+ | |||
+ | dapat dilihat bahwa nilai x1 = 7.3575; x2 = 10.0552; x3 = 12.5077, sesuai dengan hasil yang ada di buku Metode Numerik. | ||
− | + | =Tugas Pertemuan 3= | |
− | + | Setelah pertemuan ini, pak Dai memberikan PR untuk mengerjakan soal berikut: | |
− | + | [[File:example2-1.png|500px|center]] | |
− | + | '''Langkah Penyelesaian Example 2-1''' | |
+ | {| class="mw-collapsible mw-collapsed wikitable" | ||
+ | ! '''1. Mengubah problem menjadi node dan elemen''' | ||
+ | |- | ||
+ | | [[File:Example2-1 table.png|400px|center]] | ||
+ | |} | ||
− | + | {| class="mw-collapsible mw-collapsed wikitable" | |
+ | ! '''2. Menentukan nilai Konstanta kekakuan/stiffness constant dari elemen''' | ||
+ | |- | ||
+ | | Elemen 1,3,4,6 || [[File:Stiffness-element1346.png|300px]] | ||
+ | |- | ||
+ | | Elemen 2,5 || [[File:Stiffness-element25.png|300px]] | ||
+ | |} | ||
− | + | {| class="mw-collapsible mw-collapsed wikitable" | |
+ | ! '''4. Menyusun dan menggabungkan matriks elemen-elemen''' | ||
+ | |- | ||
+ | | [[File:Kglobal-summary.png|400px]] | ||
+ | |} | ||
− | + | {| class="mw-collapsible mw-collapsed wikitable" | |
+ | ! '''4. Menyusun dan menggabungkan matriks elemen-elemen''' | ||
+ | |- | ||
+ | | [[File:Kglobal-summary.png|400px]] | ||
+ | |- | ||
+ | | [[File:Kglobal-summary-simplified.png|400px]] | ||
+ | |} | ||
− | x= | + | {| class="mw-collapsible mw-collapsed wikitable" |
+ | ! '''5. Menerapkan kondisi batas dan beban''' | ||
+ | |- | ||
+ | | Kondisi batas untuk node 1 dan 3 adalah fixed || [[File:Boundary-condition-deflection-node13.png|400px]] | ||
+ | |- | ||
+ | | External force pada node 4 dan 5 || [[File:Externalforce-node45.png|400px]] | ||
+ | |- | ||
+ | |Dengan menerapkan Hukum Hooke, F= k. x, maka dalam persamaan matrix menjadi [F]=[K].[U]. Didapat || [[File:Deflection-matrix-simplified.png|500px|center]] | ||
+ | |} | ||
− | + | {| class="mw-collapsible mw-collapsed wikitable" | |
+ | ! '''6. Tahap pencarian solusi''' | ||
+ | |- | ||
+ | | [[File:k2global.png|400px]] | ||
+ | |- | ||
+ | | [[File:k5global.png|400px]] | ||
+ | |- | ||
+ | | Persamaan matriks diatas dapat diselesaikan dengan OpenModelica, berikut adalah pemograman yang saya buat || [[File:deflection-code.png|600px|center]] | ||
+ | |- | ||
+ | | setelah melakukan pengecekan dan simulasi, saya melakukan plotting terhadap hasil simulasi. berikut hasilnya: || | ||
+ | [[File:Deflection-plot.png|600px|center]] | ||
+ | |} | ||
− | + | {| class="mw-collapsible mw-collapsed wikitable" | |
− | + | ! '''7. Mendapatkan nilai gaya reaksi''' | |
+ | |- | ||
+ | | Karena di soal ingin mencari gaya reaksi, maka perlu dilakukan perhitungan pada gaya reaksi dengan persamaan || '''{R} = [K] {U} - {F}''' | ||
+ | |- | ||
+ | | || [[File:Reaction-force-matrix.png|400px]] | ||
+ | |- | ||
+ | | Persamaan diatas dapat diselesaikan oleh OpenModelica, berikut adalah pemogramannya || [[File:Externalforce-code.png|600px|center]] | ||
+ | |- | ||
+ | | berikut hasil plottingnya || [[File:Externalforce-plot.png|600px|center]] | ||
+ | |} | ||
+ | {| class="mw-collapsible mw-collapsed wikitable" | ||
+ | ! '''8. Mendapatkan gaya Internal dan Normal Stress''' | ||
+ | |- | ||
+ | | Untuk menghitung normal stress, perlu dilakukan transformasi dari hasil defleksi ditinjau dari koordinat global menjadi transformasi lokal, berikut adalah persamaan yang dapat digunakan || [[File:Global-to-local.png|400px]] | ||
+ | |- | ||
+ | | || {u} -> koordinat local | ||
− | + | [U] -> koordinat global | |
+ | [T] -> matriks transformasi | ||
+ | |- | ||
+ | | Misalkan kita menganalisis stress pada elemen 5, maka node yang dianalisis adalah node 2 dan 5 | ||
+ | Sehingga persamaan matriks defleksi pada koordinat lokal menjadi || [[File:Global-to-local-element5.png|300px]] | ||
+ | |- | ||
+ | | Persamaan diatas dapat diselesaikan dengan OpenModelica, berikut adalah pemogramannya || [[File:Deflectionlocal-code.png|600px|center]] | ||
+ | |- | ||
+ | | berikut hasil plottingnya || [[File:Deflectionlocal-plot.png|600px|center]] | ||
− | + | Didapatkan U2x=-0.00976 inch dan U6x=-0.01209 inch | |
+ | |- | ||
+ | | Internal force didapat dengan persamaan || [[File:Internal-force-equation.png|300px]] | ||
+ | |||
+ | didapat internal force pada elemen 5 sebesar 696lb. | ||
+ | |- | ||
+ | | Normal stress didapat dengan persamaan || [[File:Normal-stress-equation.png|300px]] | ||
+ | |||
+ | didapat normal stress pada elemen 5 sebesar 87lb/in^2 | ||
+ | |} | ||
+ | |||
+ | =Pertemuan 4= | ||
+ | |||
+ | ==Kuis== | ||
+ | |||
+ | Membuat Flowchart untuk penyelesaian soal nomor 4 dan 8 | ||
+ | |||
+ | {|class="wikitable" | ||
+ | | '''Soal No.4''' || [[File:Problem4-edo.png|800px]] | ||
+ | |- | ||
+ | | '''Soal No.8''' || [[File:Problem8-edo.png|800px]] | ||
+ | |} | ||
+ | |||
+ | Berikut adalah penyelesaian untuk soal diatas | ||
+ | |||
+ | {|class="wikitable" | ||
+ | | '''Soal No.4''' || | ||
+ | |||
+ | {| class="mw-collapsible mw-collapsed wikitable" | ||
+ | ! '''1. Mengubah problem menjadi node dan elemen''' | ||
+ | |- | ||
+ | | [[File:Element-Table-Problem4.png |400px|center]] | ||
+ | |} | ||
+ | |||
+ | {| class="mw-collapsible mw-collapsed wikitable" | ||
+ | ! '''2. Menentukan nilai Konstanta kekakuan/stiffness constant dari elemen''' | ||
+ | |- | ||
+ | | Elemen 1,2 || [[File:Element12-problem4.png |300px]] | ||
+ | |- | ||
+ | | Elemen 3 || [[File:Element3-problem4.png |300px]] | ||
+ | |- | ||
+ | | Elemen 4,5 || [[File:Element45-problem4.png |300px]] | ||
+ | |} | ||
+ | |||
+ | {| class="mw-collapsible mw-collapsed wikitable" | ||
+ | ! '''4. Menyusun dan menggabungkan matriks elemen-elemen''' | ||
+ | |- | ||
+ | | '''Elemen''' || '''Local Matrix''' || '''Global Matrix''' | ||
+ | |- | ||
+ | | Elemen 1,2 || [[File:Localmatrix-element12.png |400px]] || [[File:Globalmatrix-element12.png |400px]] | ||
+ | |- | ||
+ | | Elemen 3 || [[File:Localmatrix-element3.png |400px]] || [[File:Globalmatrix-element3.png |400px]] | ||
+ | |- | ||
+ | | Elemen 4,5 || [[File:Localmatrix-element45.png |400px]] || [[File:Globalmatrix-element45.png |400px]] | ||
+ | |} | ||
+ | |||
+ | {| class="mw-collapsible mw-collapsed wikitable" | ||
+ | ! '''4. Menyusun dan menggabungkan matriks elemen-elemen''' | ||
+ | |- | ||
+ | | [[File:Matrixglobal-sum.png |400px]] | ||
+ | |} | ||
+ | |||
+ | {| class="mw-collapsible mw-collapsed wikitable" | ||
+ | ! '''5. Menerapkan kondisi batas dan beban''' | ||
+ | |- | ||
+ | | Kondisi batas untuk node 1, dan 3 adalah fixed | ||
+ | |- | ||
+ | | External force pada node 2 dan 4 || [[File:Externalforce-problem4.png|400px]] | ||
+ | |- | ||
+ | |Dengan menerapkan Hukum Hooke, F= k. x, maka dalam persamaan matrix menjadi [F]=[K].[U]. Didapat || [[File:Solving-equation-problem4.png|500px|center]] | ||
+ | |} | ||
+ | |||
+ | {| class="mw-collapsible mw-collapsed wikitable" | ||
+ | ! '''6. Tahap pencarian solusi''' | ||
+ | |- | ||
+ | | [[File:Solving-equation-simplified-problem4.png |500px|center]] | ||
+ | |- | ||
+ | | Persamaan matriks diatas dapat diselesaikan dengan OpenModelica, berikut adalah pemograman yang saya buat || [[File:Gauss-elimination-problem4.png|600px|center]] | ||
+ | |- | ||
+ | | setelah melakukan pengecekan dan simulasi, saya melakukan plotting terhadap hasil simulasi. berikut hasilnya: || | ||
+ | [[File:Plot-problem4.png|600px|center]] | ||
+ | |} | ||
+ | |||
+ | |} | ||
+ | |||
+ | =Pertemuan 5= | ||
+ | |||
+ | Pada pertemuan hari ini, kami diminta pak Dai untuk membahas tugas kuis yang sudah kami buat. Pak Dai meminta saya untuk menjelaskan tentang progress yang sudah saya buat. Namun, tugas yang saya kerjakan belum dalam bentuk coding. Kemudian saya menjelaskan mengenai ide besar coding untuk Tugas Kuis minggu lalu yang sudah dikerjakan oleh saudara Josiah Enrico. Secara garis besar, perlu dibuat fungsi panggil yang digunakan pada algoritme dalam model. | ||
+ | |||
+ | Setelah itu teman saya, Fahmi, menjelaskan mengenai coding yang ia buat untuk Tugas Kuis minggu lalu yaitu mengenai Plane Truss dan Space Truss. | ||
+ | |||
+ | ==Tugas Pertemuan 5== | ||
+ | |||
+ | Setelah kelas, Pak Dai memberikan tugas 5 sebagai berikut: | ||
+ | |||
+ | [[File:soal3.jpeg|thumb|example 3.3|center|300px]] | ||
+ | |||
+ | Berikut adalah langkah penyelesaian dari kuis nomor 5 | ||
+ | |||
+ | |||
+ | =Pertemuan 6= | ||
+ | |||
+ | Pada pertemuan hari ini, Pak Dai meminta kami untuk melakukan muhasabah terhadap hasil pembelajaran kami selama kelas Metode Numerik bersama Pak Dai. Berikut adalah muhasabah saya: | ||
+ | |||
+ | Menurut saya, saya merasa sudah cukup paham untuk memahami dasar-dasar dari metode numerik yang sudah diajari sebelum UTS. Pemahaman ini menjadi dasar saya untuk menerapkan metode numerik dengan menggunakan pemorgraman seperti OpenModelica. Selain pemahaman numerik, saya juga sudah cukup memahami tentang fenomena fisika dan membuat model matematika dari fenomena fisika tersebut. Penyelesaian masalah dibantu dengan metode numerik akan sangat membantu kita dalam menyelesaikan masalah teknik. Namun karena saya belum memahami bahasa pemograman modelica, maka saya sedikit kesulitan untuk menterjemahkan flowchart dalam penyelesaian masalaha teknik menjadi bahasa program. | ||
+ | |||
+ | ==Pertemuan 7== | ||
+ | |||
+ | Pada pertemuan hari ini, Pak Dai menjelaskan mengenai tugas besar Metode Numerik yaitu Aplikasi Metode Numerik dalam Optimasi Desain Struktur Rangka Sederhana. Secara garis besar yang dicari adalah material yang tepat dan murah untuk rangka sederhana. Setelah itu kami melakukan praktik optimasi bersama Asisten Dosen, Bu Candra. | ||
+ | |||
+ | Praktik yang dilakukan adalah Bracket Optimization Using Golden Ratio Method. Misalkan terdapat suatu fungsi yang memiliki nilai fungsi maksimum global dan lokal serta fungsi minimum global dan lokal. | ||
+ | |||
+ | Setelah itu, kami melakukan optimasi pada permasalahan berikut: | ||
+ | |||
+ | [[File:Soal-optimisasi.png|400px]] | ||
+ | |||
+ | Objektif dari permasalahan tersebut adalah untuk menemukan nilai fungsi maksimum dari fungsi tersebut. | ||
+ | Lalu kami diajarkan cara menggunakan OpenModelica untuk menyelesaikan tersebut, berikut adalah programnya: | ||
+ | |||
+ | 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; | ||
+ | |||
+ | Untuk fungsi panggilnya: | ||
+ | |||
+ | function f_obj3 | ||
+ | import Modelica.Math; | ||
+ | input Real x; | ||
+ | output Real y; | ||
+ | algorithm | ||
+ | y:=2*Math.sin(x)-x^2/10; | ||
+ | end f_obj3; | ||
+ | |||
+ | Untuk menarik kesimpulan, dalam menyelesaikan permasalahan dengan menggunakan metode numerik, kita perlu memahami proses-proses untuk menyelesaikan permasalahan tersebut. Pemahaman proses-proses ini akan memudahkan kita dalam membuat program OpenModelica. | ||
+ | |||
+ | ==Tugas Besar== | ||
+ | |||
+ | ===Problem=== | ||
+ | |||
+ | [[File:Tugas Besar Metnum Geometri Jos.jpg|center]] | ||
+ | |||
+ | ===Tujuan=== | ||
+ | |||
+ | Mencari material yang paling optimum pada area yang paling optimum yang dijual di pasar | ||
+ | |||
+ | ===Penyelesaian=== | ||
+ | |||
+ | '''1. Mendefinisikan Problem''' | ||
+ | |||
+ | Untuk dapat menyelesaikan permasalahan soal, perlu didefinisikan node dan elemen pada soal | ||
+ | |||
+ | [[File:Rangka siku definition.png|400px|center]] | ||
+ | |||
+ | '''2. Membuat asumsi dan constraint pada problem''' | ||
+ | |||
+ | Asumsi: | ||
+ | - Diasumsikan tidak ada bending karena bersifat truss | ||
+ | - Beban terdistribusi pada node | ||
+ | - Safety Factor = 2 | ||
+ | - Batas displacement 0,001m sebelum terjadi buckling | ||
+ | - Variabel bebas | ||
+ | |||
+ | Constraint" | ||
+ | - Node 1,2,3,4 (lantai dasar) fixed | ||
+ | - Beban F1 dan F2 terdistribusi ke node sekitaranya, sehingga: | ||
+ | 1. Node 13 & 16 = 1000N | ||
+ | 2. Node 14 & 15 = 500N | ||
+ | |||
+ | '''3. Mengasumsikan solusi pada problem''' | ||
+ | |||
+ | Untuk mencapai tujuan hal dapat dilakukan: | ||
+ | |||
+ | 1. Mencari area paling optimum dengan membandingkan dimensi siku untuk menentukan dimensi siku paling optimum (Elastisitas menjadi variabel tetap, Area menjadi variabel bebas) | ||
+ | |||
+ | 2. Mencari material paling optimum dengan membandingkan performance material pada area yang sama (Area menjadi variabel tetap, Elastisitas menjadi variabel bebas) | ||
+ | |||
+ | '''4. Mencari Data''' | ||
+ | |||
+ | [[File:Pencarian-Data-Tubes.png|400px]] | ||
+ | |||
+ | |||
+ | '''5. Membuat model numerik''' | ||
+ | |||
+ | Program Numerik ini dibuat untuk mencari nilai stress, safety factor, serta membantu dalam melakukan curve fitting | ||
+ | |||
+ | '''Program untuk menghitung stress''' | ||
+ | |||
+ | model TugasBesarEdwardJoshua | ||
+ | //define initial variable | ||
+ | parameter Integer Points=size(P,1); //Number of Points | ||
+ | parameter Integer Trusses=size(C,1); //Number of Trusses | ||
+ | parameter Real Yield= (nilai yield) ; //Yield Strength Material(Pa) | ||
+ | parameter Real Area= (nilai area) ; //Luas Siku (Dimension=30x30x3mm) | ||
+ | parameter Real Elas= (nilai elastisitas) ; //Elasticity Material (Pa) | ||
+ | //define connection | ||
+ | parameter Integer C[:,2]=[ 1,5; // (1) | ||
+ | 2,6; // (2) | ||
+ | 3,7; // (3) | ||
+ | 4,8; // (4) | ||
+ | 5,6; // (5) | ||
+ | 6,7; // (6) | ||
+ | 7,8; // (7) | ||
+ | 5,8; // (8) | ||
+ | 5,9; // (9) | ||
+ | 6,10; // (10) | ||
+ | 7,11; // (11) | ||
+ | 8,12; // (12) | ||
+ | 9,10; // (13) | ||
+ | 10,11;// (14) | ||
+ | 11,12;// (15) | ||
+ | 9,12; // (16) | ||
+ | 9,13; // (17) | ||
+ | 10,14;// (18) | ||
+ | 11,15;// (19) | ||
+ | 12,16;// (20) | ||
+ | 13,14;// (21) | ||
+ | 14,15;// (22) | ||
+ | 15,16;// (23) | ||
+ | 13,16];//(24) | ||
+ | //define coordinates (please put orderly) | ||
+ | parameter Real P[:,6]=[ 0 ,0 ,0,1,1,1; //node 1 | ||
+ | 0.75,0 ,0,1,1,1; //node 2 | ||
+ | 0.75,0.6,0,1,1,1; //node 3 | ||
+ | 0 ,0.6,0,1,1,1; //node 4 | ||
+ | |||
+ | 0 ,0 ,0.3,0,0,0; //node 5 | ||
+ | 0.75,0 ,0.3,0,0,0; //node 6 | ||
+ | 0.75,0.6,0.3,0,0,0; //node 7 | ||
+ | 0 ,0.6,0.3,0,0,0; //node 8 | ||
+ | |||
+ | 0 ,0 ,1.05,0,0,0; //node 9 | ||
+ | 0.75,0 ,1.05,0,0,0; //node 10 | ||
+ | 0.75,0.6,1.05,0,0,0; //node 11 | ||
+ | 0 ,0.6,1.05,0,0,0; //node 12 | ||
+ | |||
+ | 0 ,0 ,1.8,0,0,0; //node 13 | ||
+ | 0.75,0 ,1.8,0,0,0; //node 14 | ||
+ | 0.75,0.6,1.8,0,0,0; //node 15 | ||
+ | 0 ,0.6,1.8,0,0,0]; //node 16 | ||
+ | |||
+ | //define external force (please put orderly) | ||
+ | parameter Real F[Points*3]={0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,-1000, | ||
+ | 0,0,-500, | ||
+ | 0,0,-500, | ||
+ | 0,0,-1000}; | ||
+ | //solution | ||
+ | Real displacement[N], reaction[N]; | ||
+ | Real check[3]; | ||
+ | Real stress1[Trusses]; | ||
+ | Real safety[Trusses]; | ||
+ | Real dis[3]; | ||
+ | Real Str[3]; | ||
+ | protected | ||
+ | parameter Integer N=3*Points; | ||
+ | Real q1[3], q2[3], g[N,N], G[N,N], G_star[N,N], id[N,N]=identity(N), cx, cy, cz, L, X[3,3]; | ||
+ | Real err=10e-15, ers=10e-8; | ||
+ | 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 TugasBesarEdwardJoshua; | ||
+ | |||
+ | '''Program untuk curve fitting''' | ||
+ | |||
+ | ''Model'' | ||
+ | model callcurve | ||
+ | parameter Real [8] X={1.11e-4,1.41e-4,1.71e-4,2.31e-4,3.04e-4,3.75e-4,7.44e-4,8.64e-4}; | ||
+ | parameter Real [8] Y={273700 ,318800 ,381200 ,512800 ,683700 ,838000 ,1663100,1986400}; | ||
+ | Real [3] Coe; | ||
+ | algorithm | ||
+ | Coe:=Curve_Fitting(X,Y); | ||
+ | end callcurve; | ||
+ | |||
+ | ''Function'' | ||
+ | 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); //Coe:=fill(2,size(Coe,1)); | ||
+ | end Curve_Fitting; | ||
+ | |||
+ | '''Program untuk optimasi''' | ||
+ | |||
+ | Program untuk optimasi menggunakan metode golden ratio method | ||
+ | |||
+ | model Opt_Gold | ||
+ | parameter Real[3] y={-834.974,0.356007,2.39937e-5}; | ||
+ | parameter Real xlo=111e-6; | ||
+ | parameter Real xhi=3.75e-4; | ||
+ | parameter Integer N=10; // maximum iteration | ||
+ | parameter Real es=0.0001; // maximum error | ||
+ | Real f1[N], f2[N], x1[N], x2[N], ea[N]; | ||
+ | Real xopt, fx; | ||
+ | protected | ||
+ | Real d, xl, xu, xint, R=(5^(1/2)-1)/2; | ||
+ | algorithm | ||
+ | xl := xlo; | ||
+ | xu := xhi; | ||
+ | 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; | ||
+ | |||
+ | '''7. Komputasi & Optimasi''' | ||
+ | |||
+ | '''Elasticity Tetap''' | ||
+ | |||
+ | Untuk menentukan dimensi optimum siku dengan material SS201, dilakukan perhitungan: | ||
+ | |||
+ | [[File:Hasil perhitungan SS201.png]] | ||
+ | |||
+ | Kemudian dilakukan curve fitting pada harga per 6m siku SS201 untuk melengkapi harga yang belum lengkap | ||
+ | |||
+ | {|class="wikitable" | ||
+ | | [[File:Koefisien kurva harga ss201.png|200px]] || sehingga didapatkan kurva Y(X)=(3.74242*10<sup>12</sup>)X<sup>2</sup> - (7.30909*10<sup>7</sup>)X + 139839 untuk harga per 6m siku | ||
+ | |} | ||
+ | |||
+ | kemudian dicari nilai safety factor, lalu S.F/Cost, lalu dilakukan curve fitting serta optimasi | ||
+ | |||
+ | {|class="wikitable" | ||
+ | | [[File:Curve-fitting dan optimasi.png|200px]] || [[File:SS201 Graph.png|500px]] | ||
+ | |} | ||
+ | |||
+ | Dapat disimpulkan bahwa area optimum siku untuk rangka sederhana pada soal dengan menggunakan material SS 201 adalah 40x40x3mm | ||
+ | |||
+ | '''Area Tetap''' | ||
+ | |||
+ | Untuk menentukan material optimum siku dengan dimensi siku 30x30x3mm, dilakukan perhitungan: | ||
+ | |||
+ | [[File:Hasil perhitungan area locked.png|400px]] | ||
+ | |||
+ | Kemudian dilakukan curve fitting terhadap data SF/Cost dan dilakukan optimasi: | ||
+ | |||
+ | {|class="wikitable" | ||
+ | | [[File:Curve-fitting dan optimasi area locked.png|200px]] || [[File:Area-Locked Graph.png|500px]] | ||
+ | |} | ||
+ | |||
+ | Dapat disimpulkan bahwa area optimum siku untuk rangka sederhana pada soal dengan menggunakan dimensi 30x30x3mm adalah SS 304 | ||
+ | |||
+ | |||
+ | = UAS Metode Numerik 2021 = | ||
+ | |||
+ | Berikut adalah jawaban dari UAS Metode Numerik 03 | ||
+ | |||
+ | [[File:UAS Metnum03 Edward Joshua P M 1806233354-Halaman1.png|center|thumb|600px|Jawaban UAS Metode Numerik No.1]] | ||
+ | |||
+ | [[File:UAS Metnum03 Edward Joshua P M 1806233354-Halaman2.png|center|thumb|600px|Jawaban UAS Metode Numerik No.2]] | ||
+ | |||
+ | [[File:UAS Metnum03 Edward Joshua P M 1806233354-Halaman3.png|center|thumb|600px|Jawaban UAS Metode Numerik No.3]] | ||
+ | |||
+ | [[File:UAS Metnum03 Edward Joshua P M 1806233354-Halaman4.png|center|thumb|600px|Jawaban UAS Metode Numerik No.4,5,6]] | ||
+ | |||
+ | Untuk jawaban No. 7 akan saya tuliskan program yang saya gunakan untuk menyelesaikan soal tersebut: | ||
+ | |||
+ | {|class="wikitable" | ||
+ | | '''Program Utama''' | ||
+ | |- | ||
+ | | | ||
+ | |||
+ | model SoalNo7 | ||
+ | //inisiasi = [ elemen#, theta, A, E, L] | ||
+ | parameter Real [:,5] inisiasi = [1, 0, 2.011e-4, 1.9e11, 1; //isi sesuai data | ||
+ | 2, 0, 2.011e-4, 1.9e11, 1; | ||
+ | 3, 45, 2.011e-4, 1.9e11, 1; | ||
+ | 4, 135, 2.011e-4, 1.9e11, 1]; | ||
+ | //node = [ i, j] | ||
+ | parameter Integer [3,2] node = [1, 2; //isi sesuai data | ||
+ | 2, 3; | ||
+ | 1, 4, | ||
+ | 2, 4, | ||
+ | 3, 4]; | ||
+ | //jumlah node | ||
+ | parameter Integer n = 4; //isi sesuai data | ||
+ | //titik node boundary | ||
+ | parameter Integer [:] Boundary = {3,4}; //isi sesuai data | ||
+ | |||
+ | //load = [ F1x, F1y, F2x,F2y,F3x,F3y,F4x,F4y] | ||
+ | parameter Real [2*n] load = { 0, 1135562, 0, 0, 0, 0, 0, 0}; //isi sesuai data | ||
+ | Real [size(inisiasi,1)] k; | ||
+ | Real [size(inisiasi,1),4,4] Ke; | ||
+ | Real [size(inisiasi,1),2*n,2*n] Kg; | ||
+ | Real [2*n,2*n] KgTot; | ||
+ | Real [2*n,2*n] KgB; | ||
+ | Real [2*n] U; | ||
+ | Real [2*n] R; | ||
+ | //check force | ||
+ | Real [2] F; | ||
+ | equation | ||
+ | k = {(inisiasi[i,3] * inisiasi[i,4] / inisiasi[i,5]) for i in 1:size(inisiasi,1)}; | ||
+ | Ke = StiffnessMatrixElement(inisiasi); | ||
+ | Kg = StiffnessMatrixGlobal(n, node, Ke); | ||
+ | KgTot = SumStiffnessMatrixGlobal(Kg); | ||
+ | KgB = BoundaryStiffnessMatrixGlobal(KgTot, Boundary); | ||
+ | U = GaussJordan(KgB, load); | ||
+ | R = ReactionForce(KgTot, U, load); | ||
+ | end SoalNo7; | ||
+ | |} | ||
+ | |||
+ | {|class="wikitable" | ||
+ | | '''Fungsi Panggil''' | ||
+ | |- | ||
+ | | '''Stiffness Matrix Elemen''' | ||
+ | |||
+ | Untuk membuat matriks kekakuan setiap elemen (matriks lokal) | ||
+ | |- | ||
+ | | | ||
+ | function StiffnessMatrixElement | ||
+ | input Real [:,5] inisiasi_mat; | ||
+ | output Real [size(inisiasi_mat,1),4,4] Ke_mat; | ||
+ | protected | ||
+ | Real theta; | ||
+ | Real [3] StiffTrig; | ||
+ | Real [4,4] StiffTrans; | ||
+ | Real [size(inisiasi_mat,1)] k_vec; | ||
+ | Real float_error = 10e-10; | ||
+ | algorithm | ||
+ | k_vec := {(inisiasi_mat[i,3] * inisiasi_mat[i,4] / inisiasi_mat[i,5]) 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(3); | ||
+ | StiffTrans := zeros(4,4); | ||
+ | // Converting degrees to radians | ||
+ | theta := Modelica.SIunits.Conversions.from_deg(inisiasi_mat[i,2]); | ||
+ | // {cos^2, sin^2, sincos} | ||
+ | StiffTrig := {(Modelica.Math.cos(theta))^2, | ||
+ | (Modelica.Math.sin(theta))^2, | ||
+ | (Modelica.Math.sin(theta)*Modelica.Math.cos(theta))}; | ||
+ | // Handle float error elements in StiffTrig | ||
+ | for t in 1:size(StiffTrig,1) loop | ||
+ | if abs(StiffTrig[t]) <= float_error then | ||
+ | StiffTrig[t] := 0; | ||
+ | end if; | ||
+ | end for; | ||
+ | // Construct stiffness transformation matrix | ||
+ | StiffTrans := [ StiffTrig[1], StiffTrig[3], -1*StiffTrig[1], -1*StiffTrig[3]; | ||
+ | StiffTrig[3], StiffTrig[2], -1*StiffTrig[3], -1*StiffTrig[2]; | ||
+ | -1*StiffTrig[1], -1*StiffTrig[3], StiffTrig[1], StiffTrig[3]; | ||
+ | -1*StiffTrig[3], -1*StiffTrig[2], StiffTrig[3], StiffTrig[2]]; | ||
+ | // Multiply in stiffness constant of element, add final stiffness matrix to Ke_mat | ||
+ | for m in 1:4 loop | ||
+ | for n in 1:4 loop | ||
+ | Ke_mat[i,m,n] := k_vec[i] * StiffTrans[m,n]; | ||
+ | end for; | ||
+ | end for; | ||
+ | end for; | ||
+ | end StiffnessMatrixElement; | ||
+ | |- | ||
+ | | '''Stiffness Matrix Global''' | ||
+ | |||
+ | Untuk memindahkan matriks lokal menjadi matriks global | ||
+ | |- | ||
+ | | | ||
+ | function StiffnessMatrixGlobal | ||
+ | input Integer x; | ||
+ | input Integer [:,2] n; | ||
+ | input Real [:,4,4] Ke_mat; | ||
+ | output Real [size(Ke_mat,1),2*x,2*x] Kg_mat; | ||
+ | algorithm | ||
+ | Kg_mat := zeros(size(Ke_mat,1),2*x,2*x); | ||
+ | for i in 1:size(Ke_mat,1) loop | ||
+ | Kg_mat[i,2*n[i,1],2*n[i,1]]:=Ke_mat[i,2,2]; | ||
+ | Kg_mat[i,2*n[i,1]-1,2*n[i,1]-1]:=Ke_mat[i,1,1]; | ||
+ | Kg_mat[i,2*n[i,1],2*n[i,1]-1]:=Ke_mat[i,2,1]; | ||
+ | Kg_mat[i,2*n[i,1]-1,2*n[i,1]]:=Ke_mat[i,1,2]; | ||
+ | Kg_mat[i,2*n[i,2],2*n[i,2]]:=Ke_mat[i,4,4]; | ||
+ | Kg_mat[i,2*n[i,2]-1,2*n[i,2]-1]:=Ke_mat[i,3,3]; | ||
+ | Kg_mat[i,2*n[i,2],2*n[i,2]-1]:=Ke_mat[i,4,3]; | ||
+ | Kg_mat[i,2*n[i,2]-1,2*n[i,2]]:=Ke_mat[i,3,4]; | ||
+ | Kg_mat[i,2*n[i,2],2*n[i,1]]:=Ke_mat[i,4,2]; | ||
+ | Kg_mat[i,2*n[i,2]-1,2*n[i,1]-1]:=Ke_mat[i,3,1]; | ||
+ | Kg_mat[i,2*n[i,2],2*n[i,1]-1]:=Ke_mat[i,4,1]; | ||
+ | Kg_mat[i,2*n[i,2]-1,2*n[i,1]]:=Ke_mat[i,3,2]; | ||
+ | Kg_mat[i,2*n[i,1],2*n[i,2]]:=Ke_mat[i,2,4]; | ||
+ | Kg_mat[i,2*n[i,1]-1,2*n[i,2]-1]:=Ke_mat[i,1,3]; | ||
+ | Kg_mat[i,2*n[i,1],2*n[i,2]-1]:=Ke_mat[i,2,3]; | ||
+ | Kg_mat[i,2*n[i,1]-1,2*n[i,2]]:=Ke_mat[i,1,4]; | ||
+ | end for; | ||
+ | end StiffnessMatrixGlobal; | ||
+ | |- | ||
+ | | '''Sum Matrix Global''' | ||
− | [[ | + | Untuk menjumlahkan semua matrix global yang sudah diubah |
+ | |- | ||
+ | | | ||
+ | function SumStiffnessMatrixGlobal | ||
+ | input Real [:,:,:] Kg_mat; | ||
+ | output Real [size(Kg_mat,2),size(Kg_mat,2)] KgTot_mat; | ||
+ | algorithm | ||
+ | for a in 1:size(Kg_mat,2) loop | ||
+ | for b in 1:size(Kg_mat,2) loop | ||
+ | KgTot_mat[a,b] := sum(Kg_mat [:,a,b]); | ||
+ | end for; | ||
+ | end for; | ||
+ | end SumStiffnessMatrixGlobal; | ||
+ | |- | ||
+ | | '''Boundary Stiffness Matrix Global''' | ||
− | + | Untuk menerapkan kondisi batas pada matriks global untuk mencari defleksi | |
+ | |- | ||
+ | | | ||
+ | function BoundaryStiffnessMatrixGlobal | ||
+ | input Real [:,:] KgTot_met; | ||
+ | input Integer[:] Boundary_met; | ||
+ | output Real [size(KgTot_met,1),size(KgTot_met,1)] KgB_met; | ||
+ | algorithm | ||
+ | for a in 1:size(KgTot_met,1) loop | ||
+ | for b in 1:size(KgTot_met,1) loop | ||
+ | KgB_met[a,b] := KgTot_met[a,b]; | ||
+ | end for; | ||
+ | end for; | ||
+ | for i in 1:size(KgTot_met,1) loop | ||
+ | for a in 1:size(Boundary_met,1) loop | ||
+ | for b in 0:1 loop | ||
+ | KgB_met[2*(Boundary_met[a])-b,i]:=0; | ||
+ | KgB_met[2*Boundary_met[a]-b,2*Boundary_met[a]-b]:=1; | ||
+ | end for; | ||
+ | end for; | ||
+ | end for; | ||
+ | end BoundaryStiffnessMatrixGlobal; | ||
+ | |- | ||
+ | | '''Function Gauss Jordan''' | ||
− | + | Untuk melakukan operasi Gauss Jordan | |
+ | |- | ||
+ | | | ||
+ | function GaussJordan | ||
+ | input Real [:,:] KgB_met; | ||
+ | input Real [size(KgB_met,1)] load_met; | ||
+ | output Real [size(KgB_met,1)] U_met; | ||
+ | protected | ||
+ | Real float_error = 10e-10; | ||
+ | algorithm | ||
+ | U_met:=Modelica.Math.Matrices.solve(KgB_met,load_met); | ||
+ | for i in 1:size(KgB_met,1) loop | ||
+ | if abs(U_met[i]) <= float_error then | ||
+ | U_met[i] := 0; | ||
+ | end if; | ||
+ | end for; | ||
+ | end GaussJordan; | ||
+ | |- | ||
+ | |'''Reaction Force''' | ||
+ | |- | ||
+ | | | ||
+ | function ReactionForce | ||
+ | input Real [:,:] KgTot_met; | ||
+ | input Real [size(KgTot_met,1)] U_met; | ||
+ | input Real [size(KgTot_met,1)] load_met; | ||
+ | output Real [size(KgTot_met,1)] R_met; | ||
+ | protected Real float_error = 10e-10; | ||
+ | algorithm | ||
+ | R_met := KgTot_met*U_met-load_met; | ||
+ | for t in 1:size(KgTot_met,1) loop | ||
+ | if abs(R_met[t]) <= float_error then | ||
+ | R_met[t] := 0; | ||
+ | end if; | ||
+ | end for; | ||
+ | end ReactionForce; | ||
+ | |} |
Latest revision as of 00:30, 14 January 2021
Contents
Pertemuan Metode Numerik 03
Pertemuan 1
Metode Numerik adalah salah satu mata kuliah yang sangat banyak penerapannya dalam dunia keteknikan. Mata kuliah ini salah satu mata kuliah yang cukup menarik karena penerapannya sangat luas dan bermanfaat. Sejauh ini yang telah saya pelajari sebelum UTS mencakup 3 materi besar yaitu mencari akar-akar, regresi linier, dan turunan numerik.
1. Mencari Akar-Akar
Pada materi ini, saya mempelajari metode-metode untuk mencari akar secara numerik. Beberapa metode yang saya pelajari adalah metode pencarian akar menggunakan Closed methods (Bracketing Method) dan Open Methods.
Metode Closed Methods merupakan metode pencarian akar-akar dengan menggunakan batas atas dan batas bawah untuk mencari akar dan mengukur persentasi error yang didapat untuk mendapat tingkat akurasi dari iterasi. Metode yang saya pelajari ada 3 yaitu Graphical Methods, Bisection Methods, dan False-Position Methods.
Graphical Methods Sebuah metode sederhana yang menggunakan grafik untuk memperkirakan akar-akar suatu fungsi. Metode ini dilakukan dengan melakukan plotting dari suatu fungsi ke dalam bentuk grafik. Bisection Methods Metode ini merupakan salah satu jenis metode incremental search method yang menggunakan batas atas dan batas bawah untuk mempersempit area pencarian akar-akar. False-Position Methods Metode ini sangat mirip dengan metode Bisection. Hal yang membedakan metode False-Position dengan Bisection adalah penentuan titik tengah dari batas-batas yang ditentukan. Penentuan titik tengah dari False-Position Method menggunakan persamaan berikut. |
Metode Open Methods merupakan metode pencarian yang hanya menggunakan 1 titik untuk menemukan akar-akar. Metode ini dapat menggunakan turunan suatu fungsi untuk menentukan titik pengujian baru yang semakin dekat dengan nilai akar-akar yang diinginakn. Metode yang saya pelajari ada 3 yaitu Fixed-Point Iteration, Newton-Rapshon, dan Secant Method
Fixed-Point Iteration Metode ini disebut juga metode iterasi sederhana, adalah metode yang memisahkan x dengan sebagian x yang lain sehingga diperoleh: x=g(x) Newton-RaphsonMetode ini menggunakan satu titik awal dan mendekatinya dengan memperhatikan slope atau gradien pada titik tersebut. Slop atau gradien didapatkan dengan melakukan turunan dari fungsi tersebut. Persamaan untuk Newton-Raphson adalah sebagai berikut:
Metode ini merupakan metode modifikasi Newton-Raphson dimana metode Newton-Raphson tidak digunakan (karena f'(x) sulit ditemukan atau tidak mungkin ditemukan). Persaman untuk metode Secant adalah sebagai berikut |
2. Regresi Linier
regresi linear adalah sebuah pendekatan untuk memodelkan hubungan antara variable terikat Y dan satu atau lebih variable bebas yang disebut X. Salah satu kegunaan dari regresi linear adalah untuk melakukan prediksi berdasarkan data-data yang telah dimiliki sebelumnya. Hubungan di antara variable-variabel tersebut disebut sebagai model regresi linear.
Persamaan umum Regresi Linier adalah sebagai berikut:
dimana:
3. Turunan Numerik
Turunan Numerik adalah menentukan hampiran nilai turunan fungsi f yang diberikan dalam bentuk tabel. Terdapat 3 pendekatan dalam menghitung turunan numerik:
Tugas Pertemuan 1: OpenModelica
Setelah pertemuan 1, pak Dai meminta kami untuk mempelajari OpenModelica
Untuk mempelajari OpenModelica, saya menggunakan referensi/tutorial dari YouTube dengan tautan berikut:
https://www.youtube.com/watch?v=SW5Eclf1tRs
https://www.youtube.com/watch?v=m0Ahs8fEN28&t=519s&ab_channel=NSTUFACE
Dari video-video tersebut saya diperkenalkan mengenai interface OpenModelica untuk pemula. Saya juga mempelajari bahwa OpenModelica menggunakan bahasa program Modelica untuk penggunaannya. Bahasa ini mirip dengan bahasa pemograman lain seperti python. Kelebihan yang saya lihat dari OpenModelica ini adalah program ini memiliki tools yang membantu mempermudah kita untuk membuat sistem dalam bentuk grafis atau skema. Model-model ini dapat kita aplikasikan dalam kehidupan nyata seperti membuat sistem elektrikal, magnetik, fluida, perpindahan panas, dsb.
Dalam konteks Metode Numerik, saya mempelajari bahwa OpenModelica dapat membantu kita dalam menyelesaikan permasalahan-permasalahan dalam mata kuliah Metode Numerik dan memvisualisasikan penyelesaian tersebut dalam bentuk grafik, salah satunya adalah penyelesaian Persamaan Diferensial Biasa atau ODE.
Contoh penyelesaian permasalahan ODE menggunakan OpenModelica adalah persamaan pendulum, yang didefinisikan sebagai berikut:
Dengan menggunakan referensi dari tautan kedua, saya membuat bahasa pemograman untuk menyelesaikan persamaan pendulum tersebut.
model pendulum Real y "variable state"; Real x; parameter Real L=1 "pendulum length"; constant Real g=9.80665; initial equation y=9 "initial value"; equation x=der(y); der(x)+(g/L)*(y)=0 "differential equation"; annotation(experiment(StartTime = 0, StopTime = 100)); end pendulum;
Penyelesaian dari persamaan tersebut digambarkan dalam bentuk grafik sebagai berikut
Dari grafik tersebut dapat dilihat bahwa seiring berjalannya waktu, pendulum melakukan osilasi. Namun dapat dilihat bahwa pendulum tersebut tidak kembali ketitik semula seiring berjalannya waktu.
Dari pembelajaran ini, saya mempelajari bahwa OpenModelica merupakan tools yang berguna dalam pelajaran Metode Numerik.
Pertemuan 2
Pada pertemuan kedua ini, pak Dai mengevaluasi hasil belajar kami tentang yang sudah kami pelajari tentang Metode Numerik sebelum UTS, serta mempelajari penggunaan aplikasi OpenModelica. Kemudian kami diminta untuk membuat coding sederhana terkait nilai rata-rata 10 sample.
Setelah sesi belajar tatap muka berakhir, kami diberikan tugas oleh pak Dai untuk membuat model untuk menyelesaikan persamaan-persamaan aljabar simultan (seperti Gauss Elimination, Gauss-Seidel, dll.).
Untuk PR, saya menggunakan 3 persamaan aljabar sebagai berikut:
Persamaan aljabar simultan tersebut dapat diselesaikan dengan metode konvensional seperti Naive Gauss Elimination, atau menggunakan metode lain sepertiGauss Elimination yang melibatkan matriks , atau Gauss Seidel. Pada kali ini, saya menggunakan metode Gauss Elimination untuk menyelesaikan persamaan tersebut.
Gauss Elimination adalah algoritme yang digunakan untuk menyelesaikan sistem persamaan linear. Metode ini melibatkan perubahan bentuk sistem persamaan menjadi bentuk matriks. Setelah mengubah sistem dalam bentuk matriks, lalu dilakukan pengurangan baris dengan mengganti posisi baris, dan/atau melakukan operasi penjumlahan dan pengurangan antar baris.
Modelica menyediakan model untuk menyelesaikan permasalahan aljabar simultan dengan menggunakan metode Gauss Elimination. Maka dari itu, saya mengubah sistem persamaan tersebut menjadi bentuk matriks. Berikut adalah model yang saya buat dengan OpenModelica:
Saya menggunakan perintah dari library modelica yaitu "Modelica.Math.Matrices.solve(A,b)" untuk menyelesaikan sistem persamaan linier tersebut.
Setelah melakukan pengecekan dan melakukan simulasi terhadap model, saya melakukan plotting terhadap hasil simulasi tersebut. Berikut adalah hasil plotting tersebut:
dapat dilihat bahwa hasil plotting tersebut menunjukkan penyelesaian dari permasalaha sistem persamaan yang telah ditunjukkan sebelumnya, yaitu x1=3, x2=2, x3=1.
Pertemuan 3
Pada pertemuan hari ini, Pak Dai menjelaskan mengenai aplikasi metode numerik pada permasalahan teknik. Salah satu permasalahan teknik yang dibahas adalah permasalahan sistem pegas-massa. Lalu pak Dai meminta kami untuk memahami permasalahan pada Figure 12.11 pada e-book Metode Numerik. Dengan mengubah sistem menjadi bentuk matrix, kita mendapatkan bentuk matrix dari sistem tersebut sebagai berikut:
persamaan matrix tersebut dapat diselesaikan dengan metode eliminasi gauss. Lalu saya membuat coding di OpenModelica sebagai berikut:
setelah melakukan melakukan pengecekan dan tidak ada masalah, saya melakukan simulasi untuk menemukan nilai x1,x2, dan x3 dari persamaan matriks tersebut. Setelah melakukan simulasi, saya melakukan plotting untuk melihat hasil yang ditemukan
dapat dilihat bahwa nilai x1 = 7.3575; x2 = 10.0552; x3 = 12.5077, sesuai dengan hasil yang ada di buku Metode Numerik.
Tugas Pertemuan 3
Setelah pertemuan ini, pak Dai memberikan PR untuk mengerjakan soal berikut:
Langkah Penyelesaian Example 2-1
1. Mengubah problem menjadi node dan elemen |
---|
2. Menentukan nilai Konstanta kekakuan/stiffness constant dari elemen | |
---|---|
Elemen 1,3,4,6 | |
Elemen 2,5 |
4. Menyusun dan menggabungkan matriks elemen-elemen |
---|
4. Menyusun dan menggabungkan matriks elemen-elemen |
---|
Pertemuan 4
Kuis
Membuat Flowchart untuk penyelesaian soal nomor 4 dan 8
Soal No.4 | |
Soal No.8 |
Berikut adalah penyelesaian untuk soal diatas
Pertemuan 5
Pada pertemuan hari ini, kami diminta pak Dai untuk membahas tugas kuis yang sudah kami buat. Pak Dai meminta saya untuk menjelaskan tentang progress yang sudah saya buat. Namun, tugas yang saya kerjakan belum dalam bentuk coding. Kemudian saya menjelaskan mengenai ide besar coding untuk Tugas Kuis minggu lalu yang sudah dikerjakan oleh saudara Josiah Enrico. Secara garis besar, perlu dibuat fungsi panggil yang digunakan pada algoritme dalam model.
Setelah itu teman saya, Fahmi, menjelaskan mengenai coding yang ia buat untuk Tugas Kuis minggu lalu yaitu mengenai Plane Truss dan Space Truss.
Tugas Pertemuan 5
Setelah kelas, Pak Dai memberikan tugas 5 sebagai berikut:
Berikut adalah langkah penyelesaian dari kuis nomor 5
Pertemuan 6
Pada pertemuan hari ini, Pak Dai meminta kami untuk melakukan muhasabah terhadap hasil pembelajaran kami selama kelas Metode Numerik bersama Pak Dai. Berikut adalah muhasabah saya:
Menurut saya, saya merasa sudah cukup paham untuk memahami dasar-dasar dari metode numerik yang sudah diajari sebelum UTS. Pemahaman ini menjadi dasar saya untuk menerapkan metode numerik dengan menggunakan pemorgraman seperti OpenModelica. Selain pemahaman numerik, saya juga sudah cukup memahami tentang fenomena fisika dan membuat model matematika dari fenomena fisika tersebut. Penyelesaian masalah dibantu dengan metode numerik akan sangat membantu kita dalam menyelesaikan masalah teknik. Namun karena saya belum memahami bahasa pemograman modelica, maka saya sedikit kesulitan untuk menterjemahkan flowchart dalam penyelesaian masalaha teknik menjadi bahasa program.
Pertemuan 7
Pada pertemuan hari ini, Pak Dai menjelaskan mengenai tugas besar Metode Numerik yaitu Aplikasi Metode Numerik dalam Optimasi Desain Struktur Rangka Sederhana. Secara garis besar yang dicari adalah material yang tepat dan murah untuk rangka sederhana. Setelah itu kami melakukan praktik optimasi bersama Asisten Dosen, Bu Candra.
Praktik yang dilakukan adalah Bracket Optimization Using Golden Ratio Method. Misalkan terdapat suatu fungsi yang memiliki nilai fungsi maksimum global dan lokal serta fungsi minimum global dan lokal.
Setelah itu, kami melakukan optimasi pada permasalahan berikut:
Objektif dari permasalahan tersebut adalah untuk menemukan nilai fungsi maksimum dari fungsi tersebut. Lalu kami diajarkan cara menggunakan OpenModelica untuk menyelesaikan tersebut, berikut adalah programnya:
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;
Untuk fungsi panggilnya:
function f_obj3 import Modelica.Math; input Real x; output Real y; algorithm y:=2*Math.sin(x)-x^2/10; end f_obj3;
Untuk menarik kesimpulan, dalam menyelesaikan permasalahan dengan menggunakan metode numerik, kita perlu memahami proses-proses untuk menyelesaikan permasalahan tersebut. Pemahaman proses-proses ini akan memudahkan kita dalam membuat program OpenModelica.
Tugas Besar
Problem
Tujuan
Mencari material yang paling optimum pada area yang paling optimum yang dijual di pasar
Penyelesaian
1. Mendefinisikan Problem
Untuk dapat menyelesaikan permasalahan soal, perlu didefinisikan node dan elemen pada soal
2. Membuat asumsi dan constraint pada problem
Asumsi: - Diasumsikan tidak ada bending karena bersifat truss - Beban terdistribusi pada node - Safety Factor = 2 - Batas displacement 0,001m sebelum terjadi buckling - Variabel bebas
Constraint" - Node 1,2,3,4 (lantai dasar) fixed - Beban F1 dan F2 terdistribusi ke node sekitaranya, sehingga: 1. Node 13 & 16 = 1000N 2. Node 14 & 15 = 500N
3. Mengasumsikan solusi pada problem
Untuk mencapai tujuan hal dapat dilakukan:
1. Mencari area paling optimum dengan membandingkan dimensi siku untuk menentukan dimensi siku paling optimum (Elastisitas menjadi variabel tetap, Area menjadi variabel bebas)
2. Mencari material paling optimum dengan membandingkan performance material pada area yang sama (Area menjadi variabel tetap, Elastisitas menjadi variabel bebas)
4. Mencari Data
5. Membuat model numerik
Program Numerik ini dibuat untuk mencari nilai stress, safety factor, serta membantu dalam melakukan curve fitting
Program untuk menghitung stress
model TugasBesarEdwardJoshua //define initial variable parameter Integer Points=size(P,1); //Number of Points parameter Integer Trusses=size(C,1); //Number of Trusses parameter Real Yield= (nilai yield) ; //Yield Strength Material(Pa) parameter Real Area= (nilai area) ; //Luas Siku (Dimension=30x30x3mm) parameter Real Elas= (nilai elastisitas) ; //Elasticity Material (Pa) //define connection parameter Integer C[:,2]=[ 1,5; // (1) 2,6; // (2) 3,7; // (3) 4,8; // (4) 5,6; // (5) 6,7; // (6) 7,8; // (7) 5,8; // (8) 5,9; // (9) 6,10; // (10) 7,11; // (11) 8,12; // (12) 9,10; // (13) 10,11;// (14) 11,12;// (15) 9,12; // (16) 9,13; // (17) 10,14;// (18) 11,15;// (19) 12,16;// (20) 13,14;// (21) 14,15;// (22) 15,16;// (23) 13,16];//(24) //define coordinates (please put orderly) parameter Real P[:,6]=[ 0 ,0 ,0,1,1,1; //node 1 0.75,0 ,0,1,1,1; //node 2 0.75,0.6,0,1,1,1; //node 3 0 ,0.6,0,1,1,1; //node 4 0 ,0 ,0.3,0,0,0; //node 5 0.75,0 ,0.3,0,0,0; //node 6 0.75,0.6,0.3,0,0,0; //node 7 0 ,0.6,0.3,0,0,0; //node 8 0 ,0 ,1.05,0,0,0; //node 9 0.75,0 ,1.05,0,0,0; //node 10 0.75,0.6,1.05,0,0,0; //node 11 0 ,0.6,1.05,0,0,0; //node 12 0 ,0 ,1.8,0,0,0; //node 13 0.75,0 ,1.8,0,0,0; //node 14 0.75,0.6,1.8,0,0,0; //node 15 0 ,0.6,1.8,0,0,0]; //node 16 //define external force (please put orderly) parameter Real F[Points*3]={0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,-1000, 0,0,-500, 0,0,-500, 0,0,-1000}; //solution Real displacement[N], reaction[N]; Real check[3]; Real stress1[Trusses]; Real safety[Trusses]; Real dis[3]; Real Str[3]; protected parameter Integer N=3*Points; Real q1[3], q2[3], g[N,N], G[N,N], G_star[N,N], id[N,N]=identity(N), cx, cy, cz, L, X[3,3]; Real err=10e-15, ers=10e-8; 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 TugasBesarEdwardJoshua;
Program untuk curve fitting
Model
model callcurve parameter Real [8] X={1.11e-4,1.41e-4,1.71e-4,2.31e-4,3.04e-4,3.75e-4,7.44e-4,8.64e-4}; parameter Real [8] Y={273700 ,318800 ,381200 ,512800 ,683700 ,838000 ,1663100,1986400}; Real [3] Coe; algorithm Coe:=Curve_Fitting(X,Y); end callcurve;
Function
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); //Coe:=fill(2,size(Coe,1));
end Curve_Fitting;
Program untuk optimasi
Program untuk optimasi menggunakan metode golden ratio method
model Opt_Gold parameter Real[3] y={-834.974,0.356007,2.39937e-5}; parameter Real xlo=111e-6; parameter Real xhi=3.75e-4; parameter Integer N=10; // maximum iteration parameter Real es=0.0001; // maximum error Real f1[N], f2[N], x1[N], x2[N], ea[N]; Real xopt, fx; protected Real d, xl, xu, xint, R=(5^(1/2)-1)/2; algorithm xl := xlo; xu := xhi; 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;
7. Komputasi & Optimasi
Elasticity Tetap
Untuk menentukan dimensi optimum siku dengan material SS201, dilakukan perhitungan:
Kemudian dilakukan curve fitting pada harga per 6m siku SS201 untuk melengkapi harga yang belum lengkap
sehingga didapatkan kurva Y(X)=(3.74242*1012)X2 - (7.30909*107)X + 139839 untuk harga per 6m siku |
kemudian dicari nilai safety factor, lalu S.F/Cost, lalu dilakukan curve fitting serta optimasi
Dapat disimpulkan bahwa area optimum siku untuk rangka sederhana pada soal dengan menggunakan material SS 201 adalah 40x40x3mm
Area Tetap
Untuk menentukan material optimum siku dengan dimensi siku 30x30x3mm, dilakukan perhitungan:
Kemudian dilakukan curve fitting terhadap data SF/Cost dan dilakukan optimasi:
Dapat disimpulkan bahwa area optimum siku untuk rangka sederhana pada soal dengan menggunakan dimensi 30x30x3mm adalah SS 304
UAS Metode Numerik 2021
Berikut adalah jawaban dari UAS Metode Numerik 03
Untuk jawaban No. 7 akan saya tuliskan program yang saya gunakan untuk menyelesaikan soal tersebut:
Program Utama |
model SoalNo7 //inisiasi = [ elemen#, theta, A, E, L] parameter Real [:,5] inisiasi = [1, 0, 2.011e-4, 1.9e11, 1; //isi sesuai data 2, 0, 2.011e-4, 1.9e11, 1; 3, 45, 2.011e-4, 1.9e11, 1; 4, 135, 2.011e-4, 1.9e11, 1]; //node = [ i, j] parameter Integer [3,2] node = [1, 2; //isi sesuai data 2, 3; 1, 4, 2, 4, 3, 4]; //jumlah node parameter Integer n = 4; //isi sesuai data //titik node boundary parameter Integer [:] Boundary = {3,4}; //isi sesuai data //load = [ F1x, F1y, F2x,F2y,F3x,F3y,F4x,F4y] parameter Real [2*n] load = { 0, 1135562, 0, 0, 0, 0, 0, 0}; //isi sesuai data Real [size(inisiasi,1)] k; Real [size(inisiasi,1),4,4] Ke; Real [size(inisiasi,1),2*n,2*n] Kg; Real [2*n,2*n] KgTot; Real [2*n,2*n] KgB; Real [2*n] U; Real [2*n] R; //check force Real [2] F; equation k = {(inisiasi[i,3] * inisiasi[i,4] / inisiasi[i,5]) for i in 1:size(inisiasi,1)}; Ke = StiffnessMatrixElement(inisiasi); Kg = StiffnessMatrixGlobal(n, node, Ke); KgTot = SumStiffnessMatrixGlobal(Kg); KgB = BoundaryStiffnessMatrixGlobal(KgTot, Boundary); U = GaussJordan(KgB, load); R = ReactionForce(KgTot, U, load); end SoalNo7; |
Fungsi Panggil |
Stiffness Matrix Elemen
Untuk membuat matriks kekakuan setiap elemen (matriks lokal) |
function StiffnessMatrixElement input Real [:,5] inisiasi_mat; output Real [size(inisiasi_mat,1),4,4] Ke_mat; protected Real theta; Real [3] StiffTrig; Real [4,4] StiffTrans; Real [size(inisiasi_mat,1)] k_vec; Real float_error = 10e-10; algorithm k_vec := {(inisiasi_mat[i,3] * inisiasi_mat[i,4] / inisiasi_mat[i,5]) 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(3); StiffTrans := zeros(4,4); // Converting degrees to radians theta := Modelica.SIunits.Conversions.from_deg(inisiasi_mat[i,2]); // {cos^2, sin^2, sincos} StiffTrig := {(Modelica.Math.cos(theta))^2, (Modelica.Math.sin(theta))^2, (Modelica.Math.sin(theta)*Modelica.Math.cos(theta))}; // Handle float error elements in StiffTrig for t in 1:size(StiffTrig,1) loop if abs(StiffTrig[t]) <= float_error then StiffTrig[t] := 0; end if; end for; // Construct stiffness transformation matrix StiffTrans := [ StiffTrig[1], StiffTrig[3], -1*StiffTrig[1], -1*StiffTrig[3]; StiffTrig[3], StiffTrig[2], -1*StiffTrig[3], -1*StiffTrig[2]; -1*StiffTrig[1], -1*StiffTrig[3], StiffTrig[1], StiffTrig[3]; -1*StiffTrig[3], -1*StiffTrig[2], StiffTrig[3], StiffTrig[2]]; // Multiply in stiffness constant of element, add final stiffness matrix to Ke_mat for m in 1:4 loop for n in 1:4 loop Ke_mat[i,m,n] := k_vec[i] * StiffTrans[m,n]; end for; end for; end for; end StiffnessMatrixElement; |
Stiffness Matrix Global
Untuk memindahkan matriks lokal menjadi matriks global |
function StiffnessMatrixGlobal input Integer x; input Integer [:,2] n; input Real [:,4,4] Ke_mat; output Real [size(Ke_mat,1),2*x,2*x] Kg_mat; algorithm Kg_mat := zeros(size(Ke_mat,1),2*x,2*x); for i in 1:size(Ke_mat,1) loop Kg_mat[i,2*n[i,1],2*n[i,1]]:=Ke_mat[i,2,2]; Kg_mat[i,2*n[i,1]-1,2*n[i,1]-1]:=Ke_mat[i,1,1]; Kg_mat[i,2*n[i,1],2*n[i,1]-1]:=Ke_mat[i,2,1]; Kg_mat[i,2*n[i,1]-1,2*n[i,1]]:=Ke_mat[i,1,2]; Kg_mat[i,2*n[i,2],2*n[i,2]]:=Ke_mat[i,4,4]; Kg_mat[i,2*n[i,2]-1,2*n[i,2]-1]:=Ke_mat[i,3,3]; Kg_mat[i,2*n[i,2],2*n[i,2]-1]:=Ke_mat[i,4,3]; Kg_mat[i,2*n[i,2]-1,2*n[i,2]]:=Ke_mat[i,3,4]; Kg_mat[i,2*n[i,2],2*n[i,1]]:=Ke_mat[i,4,2]; Kg_mat[i,2*n[i,2]-1,2*n[i,1]-1]:=Ke_mat[i,3,1]; Kg_mat[i,2*n[i,2],2*n[i,1]-1]:=Ke_mat[i,4,1]; Kg_mat[i,2*n[i,2]-1,2*n[i,1]]:=Ke_mat[i,3,2]; Kg_mat[i,2*n[i,1],2*n[i,2]]:=Ke_mat[i,2,4]; Kg_mat[i,2*n[i,1]-1,2*n[i,2]-1]:=Ke_mat[i,1,3]; Kg_mat[i,2*n[i,1],2*n[i,2]-1]:=Ke_mat[i,2,3]; Kg_mat[i,2*n[i,1]-1,2*n[i,2]]:=Ke_mat[i,1,4]; end for; end StiffnessMatrixGlobal; |
Sum Matrix Global
Untuk menjumlahkan semua matrix global yang sudah diubah |
function SumStiffnessMatrixGlobal input Real [:,:,:] Kg_mat; output Real [size(Kg_mat,2),size(Kg_mat,2)] KgTot_mat; algorithm for a in 1:size(Kg_mat,2) loop for b in 1:size(Kg_mat,2) loop KgTot_mat[a,b] := sum(Kg_mat [:,a,b]); end for; end for; end SumStiffnessMatrixGlobal; |
Boundary Stiffness Matrix Global
Untuk menerapkan kondisi batas pada matriks global untuk mencari defleksi |
function BoundaryStiffnessMatrixGlobal input Real [:,:] KgTot_met; input Integer[:] Boundary_met; output Real [size(KgTot_met,1),size(KgTot_met,1)] KgB_met; algorithm for a in 1:size(KgTot_met,1) loop for b in 1:size(KgTot_met,1) loop KgB_met[a,b] := KgTot_met[a,b]; end for; end for; for i in 1:size(KgTot_met,1) loop for a in 1:size(Boundary_met,1) loop for b in 0:1 loop KgB_met[2*(Boundary_met[a])-b,i]:=0; KgB_met[2*Boundary_met[a]-b,2*Boundary_met[a]-b]:=1; end for; end for; end for; end BoundaryStiffnessMatrixGlobal; |
Function Gauss Jordan
Untuk melakukan operasi Gauss Jordan |
function GaussJordan input Real [:,:] KgB_met; input Real [size(KgB_met,1)] load_met; output Real [size(KgB_met,1)] U_met; protected Real float_error = 10e-10; algorithm U_met:=Modelica.Math.Matrices.solve(KgB_met,load_met); for i in 1:size(KgB_met,1) loop if abs(U_met[i]) <= float_error then U_met[i] := 0; end if; end for; end GaussJordan; |
Reaction Force |
function ReactionForce input Real [:,:] KgTot_met; input Real [size(KgTot_met,1)] U_met; input Real [size(KgTot_met,1)] load_met; output Real [size(KgTot_met,1)] R_met; protected Real float_error = 10e-10; algorithm R_met := KgTot_met*U_met-load_met; for t in 1:size(KgTot_met,1) loop if abs(R_met[t]) <= float_error then R_met[t] := 0; end if; end for; end ReactionForce; |