Difference between revisions of "Hikaru Trinita Salsabila"
(→Tugas Besar: Optimasi Rangka) |
(→Tugas Besar: Optimasi Rangka) |
||
Line 442: | Line 442: | ||
-Melakukan perbandingan dengan material berbeda | -Melakukan perbandingan dengan material berbeda | ||
− | Dalam | + | Data yang akan digunakan unutk perhitungan reaction, displacement, dan stress: |
+ | |||
+ | [[File:soaltubeshikarudinomorin.jpg|400px|center]] | ||
+ | |||
+ | Diasumsikan rangka menggunakan material SS201 dengan luas truss 171mm^2 (L profile 30x30mm thickness 3mm). | ||
+ | |||
+ | Hasil perhitungan reaction: | ||
+ | Hasil perhitungan displacement: | ||
+ | Hasil perhitungan stress: | ||
+ | |||
+ | |||
+ | Dalam melakukan optimasi terdapat 2 metode: | ||
1. Jenis material yang digunakan sama (SS201), sehingga luas truss divariasikan | 1. Jenis material yang digunakan sama (SS201), sehingga luas truss divariasikan | ||
− | 2. Luas truss yang digunakan sama, sehingga dicari beberapa material yang mungkin bisa digunakan | + | 2. Luas truss yang digunakan sama (171mm^2), sehingga dicari beberapa material yang mungkin bisa digunakan |
Untuk masing-masing metode tersebut akan dihitung nilai total harga, safety factor, dan rasio. Kemudian dilakukan curve fitting dan melakukan optimasi. | Untuk masing-masing metode tersebut akan dihitung nilai total harga, safety factor, dan rasio. Kemudian dilakukan curve fitting dan melakukan optimasi. | ||
Line 480: | Line 491: | ||
[[File:materialoptimumhikaru.PNG|300px|center]] | [[File:materialoptimumhikaru.PNG|300px|center]] | ||
− | Maka dengan luas ara truss sebesar 171mm^2, material yang paling optimal untuk digunakan sebagai bahan dasar rangka adalah material dengan modulus | + | Maka dengan luas ara truss sebesar 171mm^2, material yang paling optimal untuk digunakan sebagai bahan dasar rangka adalah material dengan modulus elastisitas sebesar 1.97x10^11Pa. Material tersebut adalah Stainless steel 201. |
− | |||
'''Program pada OpenModelica''' | '''Program pada OpenModelica''' | ||
+ | |||
+ | *Reaction, Displacement, dan Stress | ||
+ | model TugasBesarMetnum | ||
+ | /define initial variable | ||
+ | parameter Integer Points=size(P,1); //Number of Points | ||
+ | parameter Integer Trusses=size(C,1); //Number of Trusses | ||
+ | parameter Real Yield=292e6; //Yield Strength (Pa) | ||
+ | parameter Real Area=0.000171; //Area L Profile (Dimension=0.03, Thickness=0,003) (m2) | ||
+ | parameter Real Elas=197e9; //Elasticity SS 201 (Pa) | ||
+ | |||
+ | //define connection | ||
+ | parameter Integer C[:,2]=[1,5; | ||
+ | 2,6; | ||
+ | 3,7; | ||
+ | 4,8; | ||
+ | 5,6; //1st floor | ||
+ | 6,7; //1st floor | ||
+ | 7,8; //1st floor | ||
+ | 5,8; //1st floor | ||
+ | 5,9; | ||
+ | 6,10; | ||
+ | 7,11; | ||
+ | 8,12; | ||
+ | 9,10; //2nd floor | ||
+ | 10,11;//2nd floor | ||
+ | 11,12;//2nd floor | ||
+ | 9,12; //2nd floor | ||
+ | 9,13; | ||
+ | 10,14; | ||
+ | 11,15; | ||
+ | 12,16; | ||
+ | 13,14;//3rd floor | ||
+ | 14,15;//3rd floor | ||
+ | 15,16;//3rd floor | ||
+ | 13,16];//3rd floor | ||
+ | |||
+ | //define coordinates (please put orderly) | ||
+ | parameter Real P[:,6]=[-0.6,0,0,1,1,1;//1 | ||
+ | 0,0,0,1,1,1;//2 | ||
+ | 0,0.75,0,1,1,1;//3 | ||
+ | -0.6,0.75,0,1,1,1;//4 | ||
+ | -0.6,0,0.6,0,0,0;//5 | ||
+ | 0,0,0.6,0,0,0;//6 | ||
+ | 0,0.75,0.6,0,0,0;//7 | ||
+ | -0.6,0.75,0.6,0,0,0;//8 | ||
+ | -0.6,0,1.2,0,0,0;//9 | ||
+ | 0,0,1.2,0,0,0;//10 | ||
+ | 0,0.75,1.2,0,0,0;//11 | ||
+ | -0.6,0.75,1.2,0,0,0;//12 | ||
+ | -0.6,0,1.8,0,0,0;//13 | ||
+ | 0,0,1.8,0,0,0;//14 | ||
+ | 0,0.75,1.8,0,0,0;//15 | ||
+ | -0.6,0.75,1.8,0,0,0];//16 | ||
+ | |||
+ | //define external force (please put orderly) | ||
+ | parameter Real F[Points*3]={0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,0, | ||
+ | 0,0,-500, | ||
+ | 0,0,-1000, | ||
+ | 0,0,-1000, | ||
+ | 0,0,-500}; | ||
+ | |||
+ | //solution | ||
+ | Real displacement[N], reaction[N]; | ||
+ | Real check[3]; | ||
+ | |||
+ | Real stress1[Trusses]; | ||
+ | Real safety[Trusses]; | ||
+ | Real dis[3]; | ||
+ | Real Str[3]; | ||
+ | |||
+ | protected | ||
+ | parameter Integer N=3*Points; | ||
+ | Real q1[3], q2[3], g[N,N], G[N,N], G_star[N,N], id[N,N]=identity(N), cx, cy, cz, L, X[3,3]; | ||
+ | Real err=10e-10, ers=10e-4; | ||
+ | |||
+ | algorithm | ||
+ | //Creating Global Matrix | ||
+ | G:=id; | ||
+ | for i in 1:Trusses loop | ||
+ | for j in 1:3 loop | ||
+ | q1[j]:=P[C[i,1],j]; | ||
+ | q2[j]:=P[C[i,2],j]; | ||
+ | end for; | ||
+ | |||
+ | //Solving Matrix | ||
+ | L:=Modelica.Math.Vectors.length(q2-q1); | ||
+ | cx:=(q2[1]-q1[1])/L; | ||
+ | cy:=(q2[2]-q1[2])/L; | ||
+ | cz:=(q2[3]-q1[3])/L; | ||
+ | X:=(Area*Elas/L)*[cx^2,cx*cy,cx*cz; | ||
+ | cy*cx,cy^2,cy*cz; | ||
+ | cz*cx,cz*cy,cz^2]; | ||
+ | |||
+ | //Transforming to global matrix | ||
+ | g:=zeros(N,N); | ||
+ | for m,n in 1:3 loop | ||
+ | g[3*(C[i,1]-1)+m,3*(C[i,1]-1)+n]:=X[m,n]; | ||
+ | g[3*(C[i,2]-1)+m,3*(C[i,2]-1)+n]:=X[m,n]; | ||
+ | g[3*(C[i,2]-1)+m,3*(C[i,1]-1)+n]:=-X[m,n]; | ||
+ | g[3*(C[i,1]-1)+m,3*(C[i,2]-1)+n]:=-X[m,n]; | ||
+ | end for; | ||
+ | |||
+ | G_star:=G+g; | ||
+ | G:=G_star; | ||
+ | end for; | ||
+ | |||
+ | //Implementing boundary | ||
+ | for x in 1:Points loop | ||
+ | if P[x,4] <> 0 then | ||
+ | for a in 1:Points*3 loop | ||
+ | G[(x*3)-2,a]:=0; | ||
+ | G[(x*3)-2,(x*3)-2]:=1; | ||
+ | end for; | ||
+ | end if; | ||
+ | if P[x,5] <> 0 then | ||
+ | for a in 1:Points*3 loop | ||
+ | G[(x*3)-1,a]:=0; | ||
+ | G[(x*3)-1,(x*3)-1]:=1; | ||
+ | end for; | ||
+ | end if; | ||
+ | if P[x,6] <> 0 then | ||
+ | for a in 1:Points*3 loop | ||
+ | G[x*3,a]:=0; | ||
+ | G[x*3,x*3]:=1; | ||
+ | end for; | ||
+ | end if; | ||
+ | end for; | ||
+ | |||
+ | //Solving displacement | ||
+ | displacement:=Modelica.Math.Matrices.solve(G,F); | ||
+ | |||
+ | //Solving reaction | ||
+ | reaction:=(G_star*displacement)-F; | ||
+ | |||
+ | //Eliminating float error | ||
+ | for i in 1:N loop | ||
+ | reaction[i]:=if abs(reaction[i])<=err then 0 else reaction[i]; | ||
+ | displacement[i]:=if abs(displacement[i])<=err then 0 else displacement[i]; | ||
+ | end for; | ||
+ | |||
+ | //Checking Force | ||
+ | check[1]:=sum({reaction[i] for i in (1:3:(N-2))})+sum({F[i] for i in (1:3:(N-2))}); | ||
+ | check[2]:=sum({reaction[i] for i in (2:3:(N-1))})+sum({F[i] for i in (2:3:(N-1))}); | ||
+ | check[3]:=sum({reaction[i] for i in (3:3:N)})+sum({F[i] for i in (3:3:N)}); | ||
+ | |||
+ | for i in 1:3 loop | ||
+ | check[i] := if abs(check[i])<=ers then 0 else check[i]; | ||
+ | end for; | ||
+ | |||
+ | //Calculating stress in each truss | ||
+ | for i in 1:Trusses loop | ||
+ | for j in 1:3 loop | ||
+ | q1[j]:=P[C[i,1],j]; | ||
+ | q2[j]:=P[C[i,2],j]; | ||
+ | dis[j]:=abs(displacement[3*(C[i,1]-1)+j]-displacement[3*(C[i,2]-1)+j]); | ||
+ | end for; | ||
+ | |||
+ | //Solving Matrix | ||
+ | L:=Modelica.Math.Vectors.length(q2-q1); | ||
+ | cx:=(q2[1]-q1[1])/L; | ||
+ | cy:=(q2[2]-q1[2])/L; | ||
+ | cz:=(q2[3]-q1[3])/L; | ||
+ | X:=(Elas/L)*[cx^2,cx*cy,cx*cz; | ||
+ | cy*cx,cy^2,cy*cz; | ||
+ | cz*cx,cz*cy,cz^2]; | ||
+ | |||
+ | Str:=(X*dis); | ||
+ | stress1[i]:=Modelica.Math.Vectors.length(Str); | ||
+ | end for; | ||
+ | |||
+ | //Safety factor | ||
+ | for i in 1:Trusses loop | ||
+ | if stress1[i]>0 then | ||
+ | safety[i]:=Yield/stress1[i]; | ||
+ | else | ||
+ | safety[i]:=0; | ||
+ | end if; | ||
+ | end for; | ||
+ | |||
+ | end Trusses_3D_Tugas_Besar_Safety; | ||
+ | |||
+ | *Optimasi | ||
+ | model OptimasiRangka | ||
+ | |||
+ | parameter Real xd[:]={111e-6,141e-6,171e-6,231e-6,304e-6}; | ||
+ | parameter Real yd[size(xd,1)]={7.25e-5,7.83e-5,8.15e-5,8.31e-5,9.08e-5}; | ||
+ | parameter Real xlo=111e-6; | ||
+ | parameter Real xhi=425e-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 OptimasiRangka | ||
+ | |||
+ | *Curve Fitting | ||
+ | function CurveFitting | ||
+ | |||
+ | 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 CurveFitting; |
Revision as of 00:29, 6 January 2021
Biodata
Nama : Hikaru Trinita Salsabila
NPM : 1806149122
TTL : Kawasaki, 25 Juli 2000
Tempat Tinggal: Depok
Golongan Darah: A
Hobi : Membaca
Saat ini, saya adalah mahasiswa semester 5 program studi Teknik Mesin Universitas Indonesia. Saya memilih jurusan ini atas saran dari kedua orang tua, yang mana ayah saya juga merupakan dosen di DTM UI. Saya bersyukur bisa menjadi mahasiswa Teknik Mesin Universitas Indonesia, karena kampus ini merupakan salah satu kampus terbaik. Semoga ilmu yang saya dapatkan di perkuliahan bisa menjadi bekal untuk masa depan. Besar harapan agar saya bisa menjadi orang yang bermanfaat bagi diri sendiri dan juga orang lain. Aamiin.
Contents
Metode Numerik
Perkuliahan Metode Numerik minggu ke 1-UTS diisi oleh Bapak Dr. Ir. Engkos A. Kosasih, M.T. Beberapa topik yang dibahas yaitu:
- Pseudocode
- Sistem Persamaan
- Turunan Numerik
- Metode Newton Rhapson, Secant, dan Bisection
- Regresi Linear
- Interpolasi
Setelah UTS, perkuliahan Metode Numerik diisi oleh Bapak Dr. Ir. Ahmad Indra Siswantara
Minggu 1 (11 November 2020)
Pada pertemuan minggu ini, dipaparkan tujuan-tujuan pembelajaran metode numerik, yaitu: Tujuan:
- 1.Memahami konsep-konsep dan prinsip-prinsip dasar dalam metode numerik, Contoh:Persamaan aljabar, algorithma, pencocokan kurva, persamaan diferensial parsial, dll.
- 2.Mengerti aplikasi metode numerik.
- 3.Mampu menerapkan metode numerik dallam persoalan teknik.
- 4.Mendapat nilai tambah/adab sehingga kita menjadi orang yang lebih beradab.
Tugas Minggu 1
Untuk tugas pertama, kami diminta mempelajari Open Modelica, yaitu sebuah aplikasi untuk membuat modelling dan simulasi. Aplikasi ini biasa digunakan digunakan di bidang industri maupun akademis. Untuk mempelejari aplikasi tersebut, saya menonton beberapa video dari youtube:
Saya mencoba membuat model sederhana yaitu sistem katrol(untuk mencari nilai tegangan tali dan percepatan) dan interpolasi (untuk mencari nilai diantara dua buah nilai yang sudah diketahui). Video pembelajaran adalah sebagai berikut:
- Sistem Katrol Tetap
- Interpolasi
Minggu 2 (18 November 2020)
Di awal pertemuan disampaikan oleh Pak Dai, jika kita sebagai manusia harus memiliki perubahan setiap harinya, hari ini harus lebih baik dari hari kemarin. Sebelum memasuki materi, kami diminta mereview fungsi pembelajaran aljabar linear dan hubungannya dengan metode numerik. Kemudian, kami diminta menceritakan pengalaman mempelajari aplikasi Open Modelica. Aplikasi ini dibuat dengan tujuan bahasa pemodelan, bukan coding. Akan tetapi, ketika melakukan perhitungan, code yang ditulis harus dalam bahsa C++. Salah satu alasan pemilihan penggunaan aplikasi ini adalah karena Open Modelica dibuat free, sehingga bisa digunakan oleh siapa saja. Open Modelica mempunyai beberapa fitur, seperti membuat model, class, function, dan lain-lain. Aplikasi ini object oriented, kita bisa membuat beberapa class fungsi dan class eksekusi, kemudian menggabungkannya menjadi satu model.
Sebagai contoh pembelajaran, kami dipandu oleh Pak Dai membuuat sebuah function dan class yang akan dihubungkan. Function yang dibuat adalah "Fungsi Tambah X1"dengan X sebagai input, Y sebagai output, dan fungsi yang dibuat adalah Y=10+x. Dibuat dalam Open Modelica sebagai berikut:
Selanjutnya dibuat class "Panggil"yang berfungsi "memanggil" fungsi tambah X1 tersebut. Pada class ini, kita dapat mengubah-ubah nilai input X1.
Dengan gabungan class dan function ini, kita dapat mencari nilai output Y dengan memasukkan nilai input X1. Sebagai contoh, dimasukkan nilai X1 sebesar 5 maka sesuai fungsi Y=10+X, akan didapatkan nilai Hasil tambah X1=10+X1=10+5=15.
Nilai X1 dapat diubah-ubah kemudian dilakukan re-simulate untuk mendapatkan nilai outputnya.
Tugas Minggu 2
Untuk tugas minggu ini kami diminta membuat sebuah fungsi berupa persamaan aljabar simultan dengan variabel array kemudian membuat class untuk memanggil fungsi tersebut. Persamaan aljabar simultan adalah sebuah persoalan matematika yang kompleks sehingga dengan menggunakan tools, penyelesaiannya dapat dibuat lebih sederhana. Metode yang dapat digunakan untuk menyelesaikan persamaan aljabar simultan adalah metode Gauss, Gauss-Jordan, Crammer, dan Gauss-Seidel. Sedangkan variabel array adalah sebuah variabel yang di dalamnya terdapat banyak data. Sebagai contoh, jika kita memiliki data X1, X2, dan X3, dengan menggunakan variabel array cukup dituliskan X[3] saja. Pada tugas kali ini, saya mencoba menyelesaikan persoalan yang saya ambil dari buku Incropera (mata kuliah Heat Transfer) pada bab 4 mengenai penyelesaian distribusi temperatur pada beberapa node.
Kemudian persoalan tersebut akan dibuat ke dalam 8 persamaan 8 variabel sebagai berikut:
Dengan menggunakan OpenModelica dan metode Gauss, didapatkan hasil T1 hingga T8 yang diwakilkan dengan X:
Berikut video cara menyelesaikan distribusi temperatur menggunakan Open Modelica:
Minggu 3 (25 November 2018)
Pada pertemuan minggu ke-3, dibahas aplikasi metode numerik pada permasalahan eknik. Beberapa metode yang dapat digunakan yaitu CFD, Stokastik, dan FEA. Dalam menyelesaikan masalah teknik, angkah yang harus dilakukan adalah melakukan analisis, membuat model matematis, menggunakan metode numerik untuk penyelesain (menggunakan computer), dan didapatkan solusi dari permasalahan. Salah satu permasalahan teknik yang kami pelajari adalah Truss.Sebelum kelas, kami diminta berlatih mengerjakan Example 3.1 mengenai Truss. Berikut example 3.1 yang saya coba kerjakan:
Langkah pertama yaitu mencari matriks kekakuan global dengan code sebagai berikut:
Setelah disimulate, didapatkan nilai-nilai kekakuan global dan dituangkan kedalam matriks:
Kemudian, mencari nilai displacement dan reaksi dari truss:
Persoalan tersebut dibuat kedalam function dan class pada Open Modelica:
Setelah code tidak ada error, dilakukan simulate dan didapatkan hasil displacement serta reaksi dari truss:
Gauss Jordan
Ketika kelas, kami kembali dijelaskan mengenai aljabar simultan, variable array, dan metode Gauss. Agar lebih mengerti mengenai aplikasi metode numerik dan pengaplikasiannya dalam Open Modelica. Christo, salah satu mahasiswa menjelaskan mengenai code untuk menyelesaikan eliminasi Guass Jordan, berikut code modelica untuk Gauss Jordan.
function GaussJordan input Real [:,:] A;//matriks awal output Real [:,:] B;//matriks tereduksi protected Integer h = 1; //pivot row Integer k = 1; //pivot coloumn Integer m = size(A,1); //jumlah baris Integer n = size(A,2); //jumlah kolom Integer c = 0; Integer max_row; // Row index of max number in pivot column Real [:] pivot_column; Real [:] pivot_row; Real [:,:] temp_array; Real r; Real float_error = 10e-10; algorithm B := A; while h <= m and k <= n loop for i in 1 : m loop for j in 1 : n loop if abs(B[i,j]) <= float_error then B[i,j] := 0; end if; end for; end for; //Finding pivot pivot_column:= {B[i,h] for i in h:m}; //Baris terbawah yang mempunyai dengan pivot tertinggi c:=h-1; for element in pivot_column loop c:= c+1; if abs(element)== max(abs(pivot_column)) then max_row :=c; end if; end for; //Jika tidak ada pivot di kolom ini, pindah ke kolom selanjutnya if B[max_row,k] == 0 then k:=k+1; else // tukar row h - max_row temp_array := B; temp_array[h] := B[max_row]; temp_array[max_row] := B[h]; B:= temp_array; //devide pivot row by pivot number B[h] := B[h]/B[h,k]; for i in (h+1) :m loop r := B[i,k]/B[h,k]; B[i,k]:=0; for j in (k+1) : n loop B[i,j] := B[i,j]-B[h,j] * r; end for; end for; //pindah ke pivot kolom dan row selanjutnya h := h+1; k := k+1; end if; end while; // proses dari kanan atas h :=m; k :=n; while h >=1 and k>=1 loop //dealing with error for i in 1:m loop for j in 1:n loop if abs(B[i,j]) <=float_error then B[i,j]:=0; end if; end for; end for; //finding pivot pivot_row := {B[h,i] for i in 1:k}; //Get position index k of pivot c := 0; for element in pivot_row loop c := c+1; if element <> 0 then break; end if; end for; k:= c; // no pivot in this row, move to next row if B[h,k] == 0 then h:= h-1; else //perform row operatation for i in 1:(h-1) loop r := B[i,k]; B[i] := B[i] - B[h] *r; end for; //move to next pivot row dan column h:=h+1; k:=k+1; end if; end while; end GaussJordan;
Naive Gauss
Selain itu, kami diminta membuat code untuk menyelesaikan persamaan 9.12 pada buku Chapra yaitu mengenaik eliminasi Naïve Gauss. Pseudocode untuk eliminasi Naïve Gauss diberikan pada Fig.9.4:
Kemudian, pseudocode tersebut dibuat kedalam bahasa Open Modelica:
function NaiveGauss input Real [3,3] A; input Real [3] B; output Real [3] x; protected Real [3,3] a; Real [3] b; Integer m = size(A,1); // jumlah kolom Integer n = size(A,2); // jumlah baris Real k = 1; Real i = 1; Real j = 1; Real factor = 1; Real sum = 1; algorithm a := A; b := B; // Forward Elimination for k in 1:(n-1) loop for i in (k+1):n loop factor := a[i,k] / a[k,k]; for j in (k+1):n loop a[i,j] := a[i,j] - (factor * a[k,j]); end for; b[i] := b[i] - (factor * b[k]); end for; end for; // Back Substitution x[n] := b[n] / a[n,n]; for i in (n-1):(-1) loop sum := b[i]; for j in (i+1):n loop sum := sum - (a[i,j] * x[j]); end for; x[i] := sum / a[i,i]; end for; end NaiveGauss;
Function Naïve Gauss yang sudah dibuat tersebut dibuktikan dengan menyelesaikan example 9.5 pada buku Chapra:
Setelah code tidak mengalami error, dilakukan simulate dan didapatkan hasil yang sama dengan pembahasan pada buku:
Tugas Minggu 3
Sebagai tugas 3 kami diminta menyelesaikan permalasahan truss berikut:
Untuk menyelesaikan soal truss tersebut, terlebih dahulu saya membuat FBD untuk mengetahui properties masing-masing batang sehingga bisa didapatkan matriks kekakuan lokal dan global.
Setelah itu dibuat dalam OpenModelica, disimulasikan, dan didapatkan matriks kekakuan global(KG) untuk truss tersebut:
Untuk mencari displacement, perlu diperhatikan boundary dan external load yang ada dan dibuat kedalam matriks A. Karena titik 1 dan 3 merupakan pinned, maka tidak ada displacement pada titik 1 dan 3(U1x=U1Y=U3X=U3Y=0). External load berada pada titik 2 dan 4 (pada arah x sebesar -4000Cos(15) sedangkan pada arah y sebesar 4000Cos(15)). Pada Open Modelica, menggunakan persamaan A*U=F dan R=(KG*U)-R untuk mencari displacement dan reaction setiap titik:
Sehingga didapatkan nilai displacement dan reaction(jika diambil error sebesar e-10):
Mencari KG
model TugasNo4 parameter Real A=0.001;//luas parameter Real E=200*10^9;//modulus elastisitas parameter Real L1=1;//Panjang batang 1,2 parameter Real L2=1.25;//Panjang batang 4 parameter Real L3=1.6;//panjang batang 3,5 parameter Real t1=0;//sudut batang 1.Node 1 dan 2. parameter Real t2=0;//sudut batang 2. Node 2 dan 3. parameter Real t3=4.04;//sudut batang 3.Node 3 dan 4. parameter Real t4=4.7;//sudut batang 4. Node 2 dan 4. parameter Real t5=5.4;//sudut batang 5. Node 1 dan 4. Real d1[8,8]=[(cos(t1))^2,sin(t1)*cos(t1),-(cos(t1))^2,-sin(t1)*cos(t1),0,0,0,0; sin(t1)*cos(t1),(sin(t1))^2,-sin(t1)*cos(t1),-(sin(t1))^2,0,0,0,0; -(cos(t1))^2,-sin(t1)*cos(t1),(cos(t1))^2,sin(t1)*cos(t1),0,0,0,0; -sin(t1)*cos(t1),-(sin(t1))^2,sin(t1)*cos(t1),(sin(t1))^2,0,0,0,0; 0,0,0,0,0,0,0,0; 0,0,0,0,0,0,0,0; 0,0,0,0,0,0,0,0; 0,0,0,0,0,0,0,0]; Real d2[8,8]=[0,0,0,0,0,0,0,0; 0,0,0,0,0,0,0,0; 0,0,(cos(t2))^2,sin(t2)*cos(t2),-(cos(t2))^2,-(sin(t2)*cos(t2)),0,0; 0,0,sin(t2)*cos(t2),(sin(t2))^2,-(sin(t2)*cos(t2)),-(sin(t2))^2,0,0; 0,0,-(cos(t2))^2,-(sin(t2)*cos(t2)),(cos(t2))^2,sin(t2)*cos(t2),0,0; 0,0,-(sin(t2)*cos(t2)),-(sin(t2))^2,sin(t2)*cos(t2),(sin(t2))^2,0,0; 0,0,0,0,0,0,0,0; 0,0,0,0,0,0,0,0]; Real d3[8,8]=[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,(cos(t3))^2,sin(t3)*cos(t3),-(cos(t3))^2,-sin(t3)*cos(t3); 0,0,0,0,sin(t3)*cos(t3),(sin(t3))^2,-sin(t3)*cos(t3),-(sin(t3))^2; 0,0,0,0,-(cos(t3))^2,-sin(t3)*cos(t3),(cos(t3))^2,sin(t3)*cos(t3); 0,0,0,0,-sin(t3)*cos(t3),-(sin(t3))^2,sin(t3)*cos(t3),(sin(t3))^2]; Real d4[8,8]=[0,0,0,0,0,0,0,0; 0,0,0,0,0,0,0,0; 0,0,(cos(t4))^2,sin(t4)*cos(t4),0,0,-(cos(t4))^2,-sin(t4)*cos(t4); 0,0,sin(t4)*cos(t4),(sin(t4))^2,0,0,-sin(t4)*cos(t4),-(sin(t4))^2; 0,0,0,0,0,0,0,0; 0,0,0,0,0,0,0,0; 0,0,-(cos(t4))^2,-sin(t3)*cos(t4),0,0,(cos(t4))^2,sin(t4)*cos(t4); 0,0,-sin(t4)*cos(t4),-(sin(t4))^2,0,0,sin(t4)*cos(t4),(sin(t4))^2]; Real d5[8,8]=[cos(t5)^2,sin(t5)*cos(t2),0,0,0,0,-(cos(t5))^2,-(sin(t5)*cos(t5)); sin(t5)*cos(t5),(sin(t5))^2,0,0,0,0,-(sin(t5)*cos(t5)),-(sin(t5))^2; 0,0,0,0,0,0,0,0; 0,0,0,0,0,0,0,0; 0,0,0,0,0,0,0,0; 0,0,0,0,0,0,0,0; -(cos(t5))^2,-(sin(t5)*cos(t5)),0,0,0,0,(cos(t5))^2,sin(t5)*cos(t5); -(sin(t5)*cos(t5)),-(sin(t5))^2,0,0,0,0,sin(t5)*cos(t5),(sin(t5))^2]; Real k1; Real k2; Real k3; Real K1[8,8]; Real K2[8,8]; Real K3[8,8]; Real K4[8,8]; Real K5[8,8]; Real KG[8,8]; equation k1=A*E/L1; k2=A*E/L2; k3=A*E/L3; K1=k1*d1; K2=k1*d2; K3=k3*d3; K4=k2*d4; K5=k3*d5; KG=K1+K2+K3+K4+K5; end TugasNo4;
Mencari U dan R
class UdanRTugasNo4 parameter Real A[8,8]=[10^6,0,0,0,0,0,0,0; 0,10^6,0,0,0,0,0,0; -2*10^8,0,4*10^8,1.98*10^6,-2*10^8,0,-0.0245566,-1.9*10^6; 0,0,1.98*10^6,1.59*10^8,0,0,-1.9*10^6,-1.5*10^8; 0,0,0,0,10^6,0,0,0; 0,0,0,0,0,10^6,0,0; -5*10^7,6.13*10^7,-0.0245566,-1.5*10^6,-4.8*10^7,-6*10^7,9.88*10^7,1.58*10^6; 6.13*10^6,-7.4*10^7,-1.9*10^6,-1.5*10^8,-6*10^7,-7.6*10^7,1.58*10^6,3.11*10^8];//apply boundary parameter Real B[8]={0,0,-1035.27618,3863.703305,0,0,-1035.27618,3863.703305};//external load parameter Real KG[8,8]=[2.5*10^8,-9.6*10^7,-2*10^8,0,0,0,-5*10^7,6.13*10^7; -6.1*10^7,7.46*10^7,0,0,0,0,6.13*10^7,-7.4*10^7; -2*10^8,0,4*10^8,1.98*10^6,-2*10^8,0,-0.0245566,-1.9*10^6; 0,0,1.98*10^6,1.59*10^8,0,0,-1.9*10^6,-1.5*10^8; 0,0,-2*10^8,0,2.48*10^8,6.09*10^7,-4.8*10^7,-6*10^7; 0,0,0,0,6.09*10^7,7.65*10^7,-6*10^7,-7.6*10^7; -5*10^7,6.13*10^7,-0.0245566,-1.5*10^6,-4.8*10^7,-6*10^7,9.88*10^7,1.58*10^6; 6.13*10^7,-7.4*10^7,-1.9*10^6,-1.5*10^8,-6*10^7,-7.6*10^7,1.58*10^6,3.11*10^8]; parameter Real F[8]={0,0,-1035.27618,3863.703305,0,0,-1035.27618,3863.703305};//force Real U[8];//displacement Real R[8];//reaction equation U=NaiveGauss(A,B); R=(KG*U)-F; end UdanRTugasNo4;
Minggu 4 (2 Desember 2020)
Pada pertemuan ini, kami membahas mengenai pr truss. Terdapat beberapa cara penyelesaian oleh teman-teman saya. Menurut saya sendiri, cara yang saya gunakan kurang efektif karena masih harus memasukkan banyak data secara manual. Oleh karena itu saya harus mempelajari penyelesaian yang kebih efektif.
Kuis 1
Pada minggu ke 4, kami diberikan kuis untuk membuat flowchart dan class diagram dari coding penyelesaian truss milik Josiah. Terdapat 5 coding yaitu penyelesaian truss, matriks kekakuan lokal, matriks kekakuan global, matriks reaksi truss, dan Gauss Jordan untuk mendapat nilai displacement. Terlbih dahulu saya buat class diagram dari 5 coding tersebut:
Kemudian saya buat flowchart untuk masing-masing coding:
Tugas Minggu 4
Untuk tugas 3, kami diminta menyelesaikan permasalahan truss 3D dengan membuat class diagram, flowchart, dan penyelesaiannya pada Open Modelica.
Saya terlebih dahulu membuat class diagram dan flowchart, kurang lebih sama dengan kuis 1.
Langkah pertama, saya membuat FBD terlebih dahulu untuk mencari data-data yang diperlukan, yaitu node, sudut, luas, modulus elastisitas, dan panjang dari tiap batang. Karena ini merupakan permasalahan 3D, maka sudut akan ada pada arah x, y, dan z. Rumus untuk mencari sudut dan panjang batang saya dapatkan dari buku. Untuk gaya eksternal sendiri dapat dilihat dari gambar, hanya aada pada node 1 di sumbu y. Kemudian data-data yang sudah didapat dibuat ke dalam matriks untuk mempermudah penyelesaiannya menggunakan Open Modellica.
Untuk mencari nilai k dapat menggunakan rumus k=AE/L. Setelah mendapa nilai k setiap batang, nilai tersebut akan digunakan untuk membuat matriks K elemental (Ke) setiap batang.
Kemudian matriks 6x6 tersebut akan dibuat menjadi matriks 12x12 sesuai dengan jumlah batang (3) * jumlah node (4). Ini disebut matriks kekakuan global (Kg).
Selanjutnya, matriks kekakuan global setiap batang dijumlahkan untuk mendapat matriks kekakuan global total(KgTot)
Kemudian boundary diterapkan pada matriks kekakuan global total. Pada kasus ini, node 2,3, dan 4 merupakan pinned. Sehingga U2X=U2Y=U2Z=U3X=U3Y=U3Z=U4X=U4Y=U4Z=0.
Untuk mencari nilai displacement(U) lainnya menggunakan eliminasi Gauss Jordan dengan persamaan XU=F. Dengan X adalah matriks K global yang sudah menerapkan boundary(KgB) dan F adalah eksternal load.
Sedangkan untuk mencari reaction menggunakan persamaan R=Kg*U - F.
Function-function tersebut akan dipanggil ke dalam sebuah class untuk penyelesaiannya. Pada class akan diinput data-data yang telah docari pada langkah pertama.
Sehingga setelah disimulate, didapatkan nilai displacement(U) dan R.
Untuk video penjelasan:
Minggu 6 (16 Desember 2020)
Pada awal pertemuan minggu ini, kami diberi wawasan jika ilmu tidak hanya didapat dari buku namun juga dari alam nyata. Oleh sebab itu, kita harus aware terhadap lingkungan sekitar. Ilmu yang sudah kita dapatkan di perkuliahan pun baiknya diaplikasikan dalam kehidupan. Topik metode numerik kali ini adalah mengenai optimasi. Sebelum perkuliahan dimulai, Bu Chandra memberikan kami sebuah video pembelajaran mengenai optimasi menggunakan metode Bracket dan di kelas kami berdiskusi jika ada kesulitan. Saya mencoba perhitungan optimasi berdasarkan video tutorial oleh Bu Candra.
Fungsi yang akan dipanggil:
Model yang akan memanggil fungsi, berisi alur penyelesaian:
Hasil yang didapatkan:
Tugas Besar: Optimasi Rangka
Sebagai tugas akhir, kami diminta mendesain rangka dengan ketentuan sebagai berikut:
Tujuan dari tugas besar ini adalah untuk mengoptimalkan pembuatan rangka baik dari pemilihan material dan penentuan luas truss. Dalam pengerjaan tugas ini, ada beberapa hal yang harus kami perhatikan:
-Menentukan material
-Menentukan luas penampang truss
-Mencari nilai displacement, reaction, dan streess
-Menghitung total biaya yang dibutuhkan
-Melakukan perbandingan dengan material berbeda
Data yang akan digunakan unutk perhitungan reaction, displacement, dan stress:
Diasumsikan rangka menggunakan material SS201 dengan luas truss 171mm^2 (L profile 30x30mm thickness 3mm).
Hasil perhitungan reaction: Hasil perhitungan displacement: Hasil perhitungan stress:
Dalam melakukan optimasi terdapat 2 metode:
1. Jenis material yang digunakan sama (SS201), sehingga luas truss divariasikan
2. Luas truss yang digunakan sama (171mm^2), sehingga dicari beberapa material yang mungkin bisa digunakan
Untuk masing-masing metode tersebut akan dihitung nilai total harga, safety factor, dan rasio. Kemudian dilakukan curve fitting dan melakukan optimasi.
Jenis Material Tetap
Data yang digunakan:
Setelah dilakukan perhitungan, didapatkan:
Kemudian dilakukan optimasi dan didapatkan hasil:
Maka luas area optimum jika rangka menggunakan material SS201 adalah sebesar 0.000423422m^2 atau 423mm^2
Luas Truss Tetap
Data yang digunakan:
Setelah dilakukan perhitungan, didaptkan:
Kemudian dilakukan optimasi dan didapatkan hasil:
Maka dengan luas ara truss sebesar 171mm^2, material yang paling optimal untuk digunakan sebagai bahan dasar rangka adalah material dengan modulus elastisitas sebesar 1.97x10^11Pa. Material tersebut adalah Stainless steel 201.
Program pada OpenModelica
*Reaction, Displacement, dan Stress model TugasBesarMetnum /define initial variable parameter Integer Points=size(P,1); //Number of Points parameter Integer Trusses=size(C,1); //Number of Trusses parameter Real Yield=292e6; //Yield Strength (Pa) parameter Real Area=0.000171; //Area L Profile (Dimension=0.03, Thickness=0,003) (m2) parameter Real Elas=197e9; //Elasticity SS 201 (Pa) //define connection parameter Integer C[:,2]=[1,5; 2,6; 3,7; 4,8; 5,6; //1st floor 6,7; //1st floor 7,8; //1st floor 5,8; //1st floor 5,9; 6,10; 7,11; 8,12; 9,10; //2nd floor 10,11;//2nd floor 11,12;//2nd floor 9,12; //2nd floor 9,13; 10,14; 11,15; 12,16; 13,14;//3rd floor 14,15;//3rd floor 15,16;//3rd floor 13,16];//3rd floor //define coordinates (please put orderly) parameter Real P[:,6]=[-0.6,0,0,1,1,1;//1 0,0,0,1,1,1;//2 0,0.75,0,1,1,1;//3 -0.6,0.75,0,1,1,1;//4 -0.6,0,0.6,0,0,0;//5 0,0,0.6,0,0,0;//6 0,0.75,0.6,0,0,0;//7 -0.6,0.75,0.6,0,0,0;//8 -0.6,0,1.2,0,0,0;//9 0,0,1.2,0,0,0;//10 0,0.75,1.2,0,0,0;//11 -0.6,0.75,1.2,0,0,0;//12 -0.6,0,1.8,0,0,0;//13 0,0,1.8,0,0,0;//14 0,0.75,1.8,0,0,0;//15 -0.6,0.75,1.8,0,0,0];//16 //define external force (please put orderly) parameter Real F[Points*3]={0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,-500, 0,0,-1000, 0,0,-1000, 0,0,-500}; //solution Real displacement[N], reaction[N]; Real check[3]; Real stress1[Trusses]; Real safety[Trusses]; Real dis[3]; Real Str[3]; protected parameter Integer N=3*Points; Real q1[3], q2[3], g[N,N], G[N,N], G_star[N,N], id[N,N]=identity(N), cx, cy, cz, L, X[3,3]; Real err=10e-10, ers=10e-4; algorithm //Creating Global Matrix G:=id; for i in 1:Trusses loop for j in 1:3 loop q1[j]:=P[C[i,1],j]; q2[j]:=P[C[i,2],j]; end for; //Solving Matrix L:=Modelica.Math.Vectors.length(q2-q1); cx:=(q2[1]-q1[1])/L; cy:=(q2[2]-q1[2])/L; cz:=(q2[3]-q1[3])/L; X:=(Area*Elas/L)*[cx^2,cx*cy,cx*cz; cy*cx,cy^2,cy*cz; cz*cx,cz*cy,cz^2]; //Transforming to global matrix g:=zeros(N,N); for m,n in 1:3 loop g[3*(C[i,1]-1)+m,3*(C[i,1]-1)+n]:=X[m,n]; g[3*(C[i,2]-1)+m,3*(C[i,2]-1)+n]:=X[m,n]; g[3*(C[i,2]-1)+m,3*(C[i,1]-1)+n]:=-X[m,n]; g[3*(C[i,1]-1)+m,3*(C[i,2]-1)+n]:=-X[m,n]; end for; G_star:=G+g; G:=G_star; end for; //Implementing boundary for x in 1:Points loop if P[x,4] <> 0 then for a in 1:Points*3 loop G[(x*3)-2,a]:=0; G[(x*3)-2,(x*3)-2]:=1; end for; end if; if P[x,5] <> 0 then for a in 1:Points*3 loop G[(x*3)-1,a]:=0; G[(x*3)-1,(x*3)-1]:=1; end for; end if; if P[x,6] <> 0 then for a in 1:Points*3 loop G[x*3,a]:=0; G[x*3,x*3]:=1; end for; end if; end for; //Solving displacement displacement:=Modelica.Math.Matrices.solve(G,F); //Solving reaction reaction:=(G_star*displacement)-F; //Eliminating float error for i in 1:N loop reaction[i]:=if abs(reaction[i])<=err then 0 else reaction[i]; displacement[i]:=if abs(displacement[i])<=err then 0 else displacement[i]; end for; //Checking Force check[1]:=sum({reaction[i] for i in (1:3:(N-2))})+sum({F[i] for i in (1:3:(N-2))}); check[2]:=sum({reaction[i] for i in (2:3:(N-1))})+sum({F[i] for i in (2:3:(N-1))}); check[3]:=sum({reaction[i] for i in (3:3:N)})+sum({F[i] for i in (3:3:N)}); for i in 1:3 loop check[i] := if abs(check[i])<=ers then 0 else check[i]; end for; //Calculating stress in each truss for i in 1:Trusses loop for j in 1:3 loop q1[j]:=P[C[i,1],j]; q2[j]:=P[C[i,2],j]; dis[j]:=abs(displacement[3*(C[i,1]-1)+j]-displacement[3*(C[i,2]-1)+j]); end for; //Solving Matrix L:=Modelica.Math.Vectors.length(q2-q1); cx:=(q2[1]-q1[1])/L; cy:=(q2[2]-q1[2])/L; cz:=(q2[3]-q1[3])/L; X:=(Elas/L)*[cx^2,cx*cy,cx*cz; cy*cx,cy^2,cy*cz; cz*cx,cz*cy,cz^2]; Str:=(X*dis); stress1[i]:=Modelica.Math.Vectors.length(Str); end for; //Safety factor for i in 1:Trusses loop if stress1[i]>0 then safety[i]:=Yield/stress1[i]; else safety[i]:=0; end if; end for; end Trusses_3D_Tugas_Besar_Safety;
*Optimasi model OptimasiRangka parameter Real xd[:]={111e-6,141e-6,171e-6,231e-6,304e-6}; parameter Real yd[size(xd,1)]={7.25e-5,7.83e-5,8.15e-5,8.31e-5,9.08e-5}; parameter Real xlo=111e-6; parameter Real xhi=425e-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 OptimasiRangka
*Curve Fitting function CurveFitting 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 CurveFitting;