Norman Febrianto

From ccitonlinewiki
Revision as of 16:57, 6 January 2021 by Norman.febrianto (talk | contribs)
Jump to: navigation, search

Data Diri

  • Nama  : Norman Febrianto
  • NPM  : 190630161
  • Jurusan : Teknik Mesin
  • Angkatan: 2019

Perkenalan Singkat

Nama saya Norman Febrianto dari jurusan Mesin Universitas Indonesia. Saya memilih jurusan mesin karena ingin lebih mengetahui dunia permesinan dan prospek kerja jurusan mesin yang cukup luas.

Metode Numerik

Metode numerik merupapakan teknik dalam penyelesaian permsalahan yang diformulasikan secara matematis dengan menggunakan operasi hitungan (aritmatik) yaitu operasi tambah, kurang, kali, dan bagi. Metode ini digunakan karena banyak permasalahan matematis tidak dapat diselesaikan menggunakan metode analitik. Materi yang telah disampaikan dalam mata kuliah Metode Numerik diantaranya :

Pseudocode

  • Sistem Persamaan
  • Turunan Numerik
  • Metode Newton Rhapson, Secant, dan Bisection
  • Regresi Linear
  • Interpolasi

Metode Numerik Minggu ke-1

Dalam belajar metode numerik, terdapat hal-hal yang harus diperhatikan diantaranya :

  • paham melalui konsep-konsep yang telah diberikan, beberapa materi dalam metode numerik : memahami persamaan, istilah algoritma, kurva, regresi, differensial, parsial
  • Dapat menerapkan pemahaman terhadap konsep dalam permodelan numerik, bisa menyelesaikan masalah melalui perhitungan numerik
  • menerapkan metode dalam permasalahan keteknikan
  • dapat mencapai poin 1,2,3 juga dengan moral value yaitu adab

Tugas Minggu ke-1

Mempelajari dan membuat video tutorial menggunakan open modelica, saya sudah membuat video tutorial yang tidak begitu sulit dengan open modelica mengenai interpolasi. berikut contoh soal yang saya coba menyelesaikan dengan openmodelica.

Interpolasi mudah.png

Kita dapat menyelesaikan persoalan berikut dengan menggunakan rumus umum dari interpolasi.

Rumus umum interp.png

Kemudian kita dapat memasukan variabel-variabel yang diketahui, untuk parameter real berdasarkan soal diantaranya x1, x2, y1, y2. Variabel yang akan kita cari adalah y dan dapat kita tuliskan "Real y". Kita juga bisa menuliskan Real x meskipun x sudah diketahui pada open modelica.

Interp.png

Setelah di check, jika tidak terdapat masalah kita save terlebih dahulu dan dapat dilakukan stimulate untuk proses pada openmodelica. Hasil dari Real y yang dicari didapatkan pada box sebelah kanan.

Hasilinter.png

berikut link video saya pada saat mengerjakan interpolasi di atas

saya mempelajari open modelica dari link video berikut : https://www.youtube.com/watch?v=GhtBMIlO70w

Metode Numerik Minggu ke-2

Openmodelica lebih ke bahasa permodelan, bukan hanya bahasa coding seperti pyhton. Namun dalam perhitungan menggunakan code yang dalam bahasa C++, parameter real tidak perlu dicompile ulang cukup di simulate ulang saja. kelebihan openmodelica diantaranya sebagai berikut :

  • 1. menggunakan bahasa permodelan yang cocok untuk engineer
  • 2. segi perhitungan lumayan cepat
  • 3. pengguna aplikasi openmodelica cukup banyak penggunanya, dan termasuk open teknologi (free). Karena seperti mathlab harus membeli atau ada legalisasi

Pada minggu ini, belajar cara untuk memanggil suatu fungsi untuk class tertentu. Jadi pada langkahnya pada awal new, memilih pada option Function untuk membuat fungsi yang nantinya akan digunakan untuk membantu perhitungan. Function dinamakan "Fungsi Tambah X1"dengan X sebagai input, Y sebagai output, dan fungsi yang dibuat adalah Y=10+x. Dibuat dalam Open Modelica sebagai berikut:

Tambahx1.png

Selanjutnya membuat new (baru) untuk memilih option class dinamakan "Panggil" yang digunakan untuk "memanggil" fungsi tambah X1 tersebut. Pada class ini, kita dapat mengubah nilai input X1 sesuai dengan kebutuhan.

Panggil.png

Setelah itu, pada class untuk memakai function yang telah dibuat kita panggil pada "equation". Jadi Function digunakan untuk membantu perhitungan pada class ini. nilai output Y merupakan nilai yang dicari sesuai dengan nilai input X1 yang dimasukan. Sebagai contoh, dimasukkan nilai X1 sebesar 5 maka sesuai fungsi Y=10+X, akan didapatkan nilai Hasil+X1=10+X1=10+5=15.

Hasiltambahx1.png

Nilai outpu Y terlihat pada box di sebelah kanan. Nilai X1 dapat dirubah sesuai dengan kebutuhan dan dapat dilakukan re-simulate untuk mendapatkan nilai outputnya.

Tugas Minggu ke-2

Pengaplikasikan penggunaan Function dan Class pada Openmodelica. 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 penyelesaian perlu dengan menggunakan tools, agar dapat dibuat lebih sederhana. Metode yang dapat digunakan untuk menyelesaikan persamaan aljabar simultan adalah metode Gauss, Gauss-Jordan, Crammer, dan Gauss-Seidel. Variabel array adalah sebuah variabel yang di dalamnya terdapat banyak data. Contoh, jika kita memiliki data X1,X2,...,X10 menggunakan variabel array cukup dituliskan X[10] Untuk mencoba menggunakan Function and Class, saya mencoba menjawab soal matriks 4x4 dari contoh soal yang saya browsing di internet.

Soalmatriks4x4.png

Kemudian kita dapat membuat fungsi Gauss untuk matriks 4x4 terlebih dahulu. Pada function saya memakai fungsi "solve" eliminasi gauss dari openmodelica yang dapat digunakan untuk menyelesaikan persamaan matriks

Fgaus4x4.png

Langkah selanjutnya membuat class yang berisikan matriks dari soal, dan untuk menggunakan function yang telah dibuat sebelumnya.

Matx4x4.png

Setelah itu dilakukan stimulate, sehingga didapatkan hasil matriks berikut

Hsl4x4.png
berikut video saya untuk penerapan tugas ke-2 mengenai Function & class

Metode Numerik Minggu ke-3

membuat fungsi di dalam modelica untuk menyelesaikan persamaan aljabar pada buku (9.12) dengan metode Gauss, namun bisa juga menggunakan metode lain seperti Gauss-Jordan. penyelesaian yang hasilnya berupa himpunan disebut array. menggunakan array karena nilai uji akan berubah perr-iterasi, iterasi 1 nilai A, ke-2 B, sehingga hasilnya berupa himpunan penyelesaian dan berupa grafik. [N] merupakan jumlah dari data, dapat juga menjadi 3 dimensi dengan menambahkan variabel lain [O], [P], dan lainnya. 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 dijadikan contoh adalah mengenai Truss.

Pada kelas kali ini, sebelumnya diriview kembali mengenai aljabar simultan untuk menyelesaikan persamaan linier dengan matriks. Pengaplikasian dalam Open Modelica, kita akan membuat code untuk menyelesaikan persamaan 9.12 pada buku Chapra yaitu mengenai eliminasi Naïve Gauss. Pseudocode untuk eliminasi Naïve Gauss diberikan pada Fig.9.4:

Fig9.12.png

pada open modelica dapat dituliskan dengan menggunakan Function, dinamakan "NaiveGauss"

Naivgaus.png

Kemudian dapat dipanggil function sebelumnya kedalam class

Prob9.5.png

Setelah itu dapat kita stimulate untuk di dapatkan hasilnya

Hslnaiv.png

Tugas Minggu ke-3

Mencoba mengerjakan soal permasalahan teknik yaitu Truss, dengan menggunakan openmodelica. Berikut soal yang harus dikerjakan

Tugas minggu 3.jpeg

Berikut merupakan Program yang dibuat pada modelica untuk penyelesaian

*class TrussesHW
parameter Integer N=8; //Global matrice = 2*points connected
parameter Real A=0.001; //Area m2
parameter Real E=200e9; //Pa
Real G[N,N]; //global
Real Ginitial[N,N]; //global
Real Sol[N]; //global dispplacement
Real X[N]={0,0,-1035.2762,-3863.7033,0,0,-1035.2762,-3863.7033};
Real R[N]; //global reaction force
Real SolMat[N,1];
Real XMat[N,1];

//boundary condition
Integer b1=1;
Integer b2=3;

//truss 1
parameter Real X1=0; //degree between truss
Real k1=A*E/1;
Real K1[4,4]; //stiffness matrice
Integer p1a=1;
Integer p1b=2;
Real G1[N,N];

//truss 2
parameter Real X2=0; //degree between truss
Real k2=A*E/1;
Real K2[4,4]; //stiffness matrice
Integer p2a=2;
Integer p2b=3;
Real G2[N,N];

//truss 3
parameter Real X3=90; //degree between truss
Real k3=A*E/1.25;
Real K3[4,4]; //stiffness matrice
Integer p3a=2;
Integer p3b=4;
Real G3[N,N];

//truss 4
parameter Real X4=90+38.6598; //degree between truss
Real k4=A*E/1.6;
Real K4[4,4]; //stiffness matrice
Integer p4a=1;
Integer p4b=4;
Real G4[N,N];

//truss 5
parameter Real X5=90-38.6598; //degree between truss
Real k5=A*E/1.6;
Real K5[4,4]; //stiffness matrice
Integer p5a=3;
Integer p5b=4;
Real G5[N,N];

/*
for each truss, please ensure pXa is lower then pXb (X represents truss element number)
*/

algorithm

//creating global matrice
K1:=Stiffness_Matrices(X1);
G1:=k1*Local_Global(K1,N,p1a,p1b);

K2:=Stiffness_Matrices(X2);
G2:=k2*Local_Global(K2,N,p2a,p2b);

K3:=Stiffness_Matrices(X3);
G3:=k3*Local_Global(K3,N,p3a,p3b);

K4:=Stiffness_Matrices(X4);
G4:=k4*Local_Global(K4,N,p4a,p4b);

K5:=Stiffness_Matrices(X5);
G5:=k5*Local_Global(K5,N,p5a,p5b);

G:=G1+G2+G3+G4+G5;
Ginitial:=G;

//implementing boundary condition
for i in 1:N loop
 G[2*b1-1,i]:=0;
 G[2*b1,i]:=0;
 G[2*b2-1,i]:=0;
 G[2*b2,i]:=0;
end for;

G[2*b1-1,2*b1-1]:=1;
G[2*b1,2*b1]:=1;
G[2*b2-1,2*b2-1]:=1;
G[2*b2,2*b2]:=1;

//solving displacement
Sol:=Gauss_Jordan(N,G,X);

//solving reaction force
SolMat:=matrix(Sol);
XMat:=matrix(X);
R:=Reaction_Trusses(N,Ginitial,SolMat,XMat);

end Trusses_HW;

Grafik Reaction Process

Reac.Displacem.png

Grafik Diplacement

Sol.displace.png


Transformasi Matriks

function Stiffness_Matrices
input Real A;
Real Y;
output Real X[4,4];
Real float_error = 10e-10;
final constant Real pi=2*Modelica.Math.asin(1.0);

algorithm

Y:=A/180*pi;
    
X:=[(Modelica.Math.cos(Y))^2,Modelica.Math.cos(Y)*Modelica.Math.sin(Y),-(Modelica.Math.cos(Y))^2,-Modelica.Math.cos(Y)*Modelica.Math.sin(Y);

Modelica.Math.cos(Y)*Modelica.Math.sin(Y),(Modelica.Math.sin(Y))^2,-Modelica.Math.cos(Y)*Modelica.Math.sin(Y),-(Modelica.Math.sin(Y))^2;

-(Modelica.Math.cos(Y))^2,-Modelica.Math.cos(Y)*Modelica.Math.sin(Y),(Modelica.Math.cos(Y))^2,Modelica.Math.cos(Y)*Modelica.Math.sin(Y);

-Modelica.Math.cos(Y)*Modelica.Math.sin(Y),-(Modelica.Math.sin(Y))^2,Modelica.Math.cos(Y)*Modelica.Math.sin(Y),(Modelica.Math.sin(Y))^2];

for i in 1:4 loop
 for j in 1:4 loop
   if abs(X[i,j]) <= float_error then
     X[i,j] := 0;
   end if;
 end for;
end for;

end Stiffness_Matrices;

Global Element Matrice

function Local_Global
input Real Y[4,4];
input Integer B;
input Integer p1;
input Integer p2;
output Real G[B,B];

algorithm

for i in 1:B loop
 for j in 1:B loop
     G[i,j]:=0;
 end for;
end for;

G[2*p1,2*p1]:=Y[2,2];
G[2*p1-1,2*p1-1]:=Y[1,1];
G[2*p1,2*p1-1]:=Y[2,1];
G[2*p1-1,2*p1]:=Y[1,2];

G[2*p2,2*p2]:=Y[4,4];
G[2*p2-1,2*p2-1]:=Y[3,3];
G[2*p2,2*p2-1]:=Y[4,3];
G[2*p2-1,2*p2]:=Y[3,4];

G[2*p2,2*p1]:=Y[4,2];
G[2*p2-1,2*p1-1]:=Y[3,1];
G[2*p2,2*p1-1]:=Y[4,1];
G[2*p2-1,2*p1]:=Y[3,2];

G[2*p1,2*p2]:=Y[2,4];
G[2*p1-1,2*p2-1]:=Y[1,3];
G[2*p1,2*p2-1]:=Y[2,3];
G[2*p1-1,2*p2]:=Y[1,4];

end Local_Global;


Reaction Matrice Equation

function Reaction_Trusses
input Integer N;
input Real A[N,N];
input Real B[N,1];
input Real C[N,1];
Real X[N,1];
output Real Sol[N];
Real float_error = 10e-10;

algorithm
X:=A*B-C;

for i in 1:N loop
 if abs(X[i,1]) <= float_error then
   X[i,1] := 0;
 end if;
end for;

for i in 1:N loop
 Sol[i]:=X[i,1];
end for;

end Reaction_Trusses;

Gauss Jordan

function Gauss_Jordan

input Integer N;
input Real A[N,N];
input Real B[N];
output Real X[N];
Real float_error = 10e-10;

algorithm
X:=Modelica.Math.Matrices.solve(A,B);

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

end Gauss_Jordan;

Metode Numerik Minggu ke-4

Quiz Flowchart dan class diagram

pada minggu ke-4 memahami mengenai flowchart berdasarkan coding yang dibuat josiah, berikut jawaban dari saya

Norman F Quiz.jpg

Tugas Minggu ke-4

Pada minggu ke empat, kami perlu mengerjakan soal no.8 mengenai truss 3 Dimensi dengan menggunakan open modelica, berikut soal yang harus dikerjakan dan dipahami.

Soal no 8.jpg

Pembuatan diagram class dan flowchart dari soal adalah sebagai berikut :

Dclassno8.jpg
Fchartno8.jpg

pertama kita bahas dengan mencari diketahui, dan menuliskan parameter yang ada dengan menghitung

Dikno8.jpg

kemudian menuliskan function yang terlibat dalam pengerjaan soal, pertama adalah function element matrices

StiffnessMatrixElement.png

Kemudian matriks untuk stiffness global

StiffnessMatrixGlobal.png

Setelah itu dapat kita jumlahkan matriks global, dan menentukan boundary dari matriks

SumStiffnessMatrixGlobal.png
BoundaryStiffnessMatrixGlobal.png

Kemudian kita bisa memanggil fungsi Gaussjordan, dan menentukan Reaksi dengan fungsi reaction

GaussJordan.png

setelah itu akan didapatkan hasil U(displacement) dan R(Reaction)

U&R.png

Berikut link video yang saya buat untuk menjelaskan mengenai proses coding atau pengerjaan soal no.8

Metode Numerik Minggu ke-6

sistem optimasi dalam sistem ada fluida cair sistem aliran darah, berupa udara yaitu sistem pernapasan. Yang ditampilkan pada grafik adalah suatu karakteristik dari sistem dan komponen. komponen penting dalam sistem perpipaan sistem fluida tidak hanya perpipaan tetapi ada mesin kerja (pompa) dan tenaga, ada valve, pipa belok. sistem fluida, aliran air dimasukan yang terdiri dari pompa, pipa, pipa belok (T,L) valve. Setiap komponen bertujuan sama yaitu mengalirkan air dari satu tempat ke tempat lain Sistem tersebut adalah pompa, dengan sistem pendukung, memberi tenaga pada pompa

Grafikfluid.jpeg

yng melengkung adalah grafik efisiensi Break housepower sumbu datar adalah jumlah aliran yang diantarkan sumbu y adalah efisiensi dari pompa garis hijau adalah tenaga air yang keluar dari pompa seiring jumlah air yang dikeluarkan tekanan akan turun sementara breakhouse power akan naik. pada efisiensi, makin tinggi kapasitas maka efisiensi akan naik. Terdapat titik maksimum dan setelah itu efisiensi akan menurun. Terdapat suatu titik maks untuk efisiensi yang pada akhirnya akan menurun pada kondisi berpaa dan kapasitas berapa, sehingga mendapat efisiensi pompa yang maksimum. untuk efisiensi sistem, mempertimbangkan heatloss pada kondisi tertentu.

Pembahasan berikutnya mengenai metode Bracket Optimization Using Golden Ratio Method oleh bu Chandra. Jika ingin menyelesaikan suatu masalah dengan optimasi, harus paham terlebih dahulu mengenai materinya

Bracktergraph.png
  • Menentukan dan mengetahui batasan titik awal terendah (xL) dan tertinggi (xH)
  • Mendapatkan nilai x1 dan x2 dari golden ratio (d)
  • Menentukan xL dan xH berdasarkan nilai batasan maksimum dan minimal baru
  • Mendapatkan nilai x1 dan x2 baru

Jika dalam soal diketahui untuk menyelesaikan persamaan y=2sinx-x^2/10, dapat dimasukan ke dalam openmodelica, pertama membuat function dari persamaan tersebut yang nanti akan dipanggil nantinya

Fxobj3.png

Setelah di cek dan tidak terjadi masalah, dapat dibuat model yang akan memanggil fungsi tersebut

Brackopt.png

Progress Tugas Besar (23-12-2020)

Tugas besar yang diberikan untuk kelas metnum 02 dan 03 adalah optimasi untuk rangka batang:

600px-Soaltubes.jpeg

suatu rangka batang yang telah dibentuk seperti gambar diatas, dengan spesifikasi sebagai berikut:

Soaltubes2.jpeg

Diharapkan dari soal tersebut dapat mendesain rangka batang dengan harga terjangkau dan optimal untuk fungsinya.

Faktor atau variabel bebasnya meliputi : Harga, Material yang digunakan, cross section Dilakukan dengan metode optimasi dan membentuk curve fitting pada variabel harga

Pada soal terlihat bahwa rangka memiliki beberapa hal yang diketahui diantaranya adalah gaya yang bekerja yaitu sebesar 1000N dan 2000N pada kedua sisi. Gaya tersebut kemudian diasumsikan bekerja pada node, jadi gaya tersebut terbagi menjadi 2, 1000:2=500N dan 2000:2=1000N. Rangka memiliki tinggi 0,6m, lebar 0,75m dan tinggi 1,8m untuk setiap lantai. Hal yang perlu dilakukan adalah mencari material yang baik untuk rangka, dengan mempertimbangkan safety factor rangka agar dalam kondisi aman pada saat digunakan, dan memperhatikan efisiensi ekonomis dalam pembuatan rangka tersebut. Beberapa yang dilakukan diantaranya : - Variasi yang dapat dilakukan adalah Material sama (digunakan SS304) dengan luas area berbeda dan luas area sama (0,00184 m) tetapi menggunakan jenis material yang berbeda (3 material). - Mencari Harga dari SS304 dengan luas area berbeda (6 ukuran) dan mencari Harga 3 jenis material untuk area 0,00184 m - Mensimulate untuk safety factor untuk kedua variasi - Membuat suatu rasio harga total dengan safety factor - Melakukan optimasi untuk mengetahui area dan material yang baik untuk rangka Terima kasih kepada Josiah, bang Cristo, bang Fahmi dan teman-teman yang telah membentu berikut merupakan hasil Coding yang telah didiskusikan.

model Trusses_3D_TugasBesar_Safety

  • //define initial variable

parameter Integer Points=size(P,1); //Number of Points parameter Integer Trusses=size(C,1); //Number of Trusses parameter Real Yield=215e6; //Yield Strength (Pa) parameter Real Area=0.000184; //Area L Profile (Dimension=0.025, Thickness=0,004)(m) parameter Real Elas=193e9; //Elasticity SS 304 (Pa)

//define connection parameter Integer C[:,2]=[1,5;

                         2,6;
                         3,7;
                         4,8;
                         5,6;  //1st floor
                         6,7;  //1st floor
                         7,8;  //1st floor
                         5,8;  //1st floor
                         5,9;
                        6,10;
                        7,11;
                        8,12;
                        9,10; //2nd floor
                        10,11;//2nd floor 
                        11,12;//2nd floor
                         9,12; //2nd floor
                         9,13;
                        10,14;
                        11,15;
                        12,16;
                        13,14;//3rd floor
                        14,15;//3rd floor
                        15,16;//3rd floor
                       13,16];//3rd floor
                                                             

//define coordinates (please put orderly) parameter Real P[:,6]=[0.3,-0.375,0,1,1,1; //1

                      -0.3,-0.375,0,1,1,1;    //2
                      -0.3,0.375,0,1,1,1;     //3
                      0.3,0.375,0,1,1,1;      //4
                          
                      0.3,-0.375,0.6,0,0,0;   //5
                      -0.3,-0.375,0.6,0,0,0;  //6
                      -0.3,0.375,0.6,0,0,0;   //7
                      0.3,0.375,0.6,0,0,0;    //8
                           
                      0.3,-0.375,1.2,0,0,0;   //9
                      -0.3,-0.375,1.2,0,0,0;  //10  
                      -0.3,0.375,1.2,0,0,0;   //11
                      0.3,0.375,1.2,0,0,0;    //12
                           
                      0.3,-0.375,1.8,0,0,0;   //13
                      -0.3,-0.375,1.8,0,0,0;  //14
                      -0.3,0.375,1.8,0,0,0;   //15
                      0.3,0.375,1.8,0,0,0];   //16
                         

//define external force (please put orderly) parameter Real F[Points*3]={0,0,0,

                           0,0,0, 
                           0,0,0, 
                           0,0,0, 
                           0,0,0, 
                           0,0,0, 
                           0,0,0, 
                           0,0,0, 
                           0,0,0, 
                           0,0,0, 
                           0,0,0, 
                           0,0,0, 
                           0,0,-500, 
                           0,0,-1000, 
                           0,0,-1000, 
                           0,0,-500}; 

//solution Real displacement[N], reaction[N]; Real check[3];

Real stress1[Trusses]; Real safety[Trusses]; Real dis[3]; Real Str[3];

protected parameter Integer N=3*Points; Real q1[3], q2[3], g[N,N], G[N,N], G_star[N,N], id[N,N]=identity(N), cx, cy, cz, L, X[3,3]; Real err=10e-10, ers=10e-4;

algorithm //Creating Global Matrix G:=id; for i in 1:Trusses loop

for j in 1:3 loop
 q1[j]:=P[C[i,1],j];
 q2[j]:=P[C[i,2],j];
end for;
     
  //Solving Matrix
  L:=Modelica.Math.Vectors.length(q2-q1);
  cx:=(q2[1]-q1[1])/L;
  cy:=(q2[2]-q1[2])/L;
  cz:=(q2[3]-q1[3])/L; 
  X:=(Area*Elas/L)*[cx^2,cx*cy,cx*cz;
                    cy*cx,cy^2,cy*cz;
                    cz*cx,cz*cy,cz^2];
  //Transforming to global matrix
  g:=zeros(N,N); 
  for m,n in 1:3 loop
    g[3*(C[i,1]-1)+m,3*(C[i,1]-1)+n]:=X[m,n];
    g[3*(C[i,2]-1)+m,3*(C[i,2]-1)+n]:=X[m,n];
    g[3*(C[i,2]-1)+m,3*(C[i,1]-1)+n]:=-X[m,n];
    g[3*(C[i,1]-1)+m,3*(C[i,2]-1)+n]:=-X[m,n];
  end for;  
G_star:=G+g;
G:=G_star;

end for;

//Implementing boundary for x in 1:Points loop

if P[x,4] <> 0 then
  for a in 1:Points*3 loop
    G[(x*3)-2,a]:=0;
    G[(x*3)-2,(x*3)-2]:=1;
  end for;
end if;
if P[x,5] <> 0 then
  for a in 1:Points*3 loop
    G[(x*3)-1,a]:=0;
    G[(x*3)-1,(x*3)-1]:=1;
  end for;
end if;
if P[x,6] <> 0 then
  for a in 1:Points*3 loop
    G[x*3,a]:=0;
    G[x*3,x*3]:=1;
  end for;
end if;

end for;

//Solving displacement displacement:=Modelica.Math.Matrices.solve(G,F);

//Solving reaction reaction:=(G_star*displacement)-F;

//Eliminating float error for i in 1:N loop

reaction[i]:=if abs(reaction[i])<=err then 0 else reaction[i];
displacement[i]:=if abs(displacement[i])<=err then 0 else displacement[i];

end for;

//Checking Force check[1]:=sum({reaction[i] for i in (1:3:(N-2))})+sum({F[i] for i in (1:3:(N-2))}); check[2]:=sum({reaction[i] for i in (2:3:(N-1))})+sum({F[i] for i in (2:3:(N-1))}); check[3]:=sum({reaction[i] for i in (3:3:N)})+sum({F[i] for i in (3:3:N)});

for i in 1:3 loop

check[i] := if abs(check[i])<=ers then 0 else check[i];

end for;

//Calculating stress in each truss for i in 1:Trusses loop for j in 1:3 loop

 q1[j]:=P[C[i,1],j];
 q2[j]:=P[C[i,2],j];
 dis[j]:=abs(displacement[3*(C[i,1]-1)+j]-displacement[3*(C[i,2]-1)+j]);

end for;

  //Solving Matrix
  L:=Modelica.Math.Vectors.length(q2-q1);
  cx:=(q2[1]-q1[1])/L;
  cy:=(q2[2]-q1[2])/L;
  cz:=(q2[3]-q1[3])/L; 
  X:=(Elas/L)*[cx^2,cx*cy,cx*cz;
               cy*cx,cy^2,cy*cz;
               cz*cx,cz*cy,cz^2];
  
  Str:=(X*dis);
  stress1[i]:=Modelica.Math.Vectors.length(Str);

end for;

//Safety factor for i in 1:Trusses loop

if stress1[i]>0 then
  safety[i]:=Yield/stress1[i];
else
  safety[i]:=0;
end if; 

end for;

end Trusses_3D_TugasBesar_Safety;