Tag Archives: Pemrograman

Momen Inersia (Momen Area Orde 2) untuk Sembarang Bentuk dalam Pemrograman C

Untuk mencari nilai nilai inersia sebuah penampang, saya lebih sering menggunakan cara langsung dengan menggunakan integral atau menggunakan tabel jika bentuknya regular. Bentuk umum untuk menentukan nilai momen inersia diberikan dalam bentuk integrasi berikut.

\displaystyle I_{xx}=\int y^{2}dA

\displaystyle I_{yy}=\int x^{2}dA

Namun untuk bentuk polinomial, bentuk integral di atas sangat susah dikerjakan, apalagi jika menggunakan hitungan manual dengan tangan, pasti akan lama mendapatkan nilainya. Dengan bantuan komputer dan analisis metode numerik, momen inersia berbagai bentuk bisa dicari. Saya menemukan ada 2 cara numerik yang bisa dipakai untuk kasus ini.

Bentuk numerik pertama yang saya ambil dari paper Design of biaxially loaded short RC columns

of arbitrary cross section diberikan dalam bentuk berikut:

\displaystyle I_{xx}=-\frac{1}{12}\sum_{i=1}^{n}(x_{i+1}-x_{i})(y_{i+1}+y_{i})(y_{i+1}^{2}+y_{i}^{2})
\displaystyle I_{yy}=\frac{1}{12}\sum_{i=1}^{n}(y_{i+1}-y_{i})(x_{i+1}+x_{i})(x_{i+1}^{2}+x_{i}^{2})

Bentuk numerik kedua yang diambil dari Wikipedia diberikan dalam bentuk berikut. Bentuk numerik di bawah ini sudah saya modifikasi sedikit karena pada saat penulisan ini, ada kesalahan bentuk yang diberikan di Wikipedia.

\displaystyle I_{xx}=\frac{1}{12}\sum_{i=1}^{n}(y_{i}^{2}+y_{i}y_{i+1}+y_{i+1}^{2})a_{i}
\displaystyle I_{yy}=\frac{1}{12}\sum_{i=1}^{n}(x_{i}^{2}+x_{i}x_{i+1}+x_{i+1}^{2})a_{i}
a_{i}=x_{i}y_{i+1}-x_{i+1}y_{i}

Dengan jumlah nodal (titik) polinomial sebanyak n, maka momen inersia bentuk apapun bisa dicari. Jika bentuk yang dicari membentuk kurva, garis kurva bisa dipecah menjadi beberapa elemen polinomial. Keakuratan hasil tergantung dari banyak elemen yang membentuk kurva tersebut. Yang perlu diperhatikan dari kedua bentuk di atas adalah pada saat nilai i=n, maka nilai i+1 kembali ke nilai i=1 atau ke titik awal. Hal lain yang perlu juga diperhatikan adalah garis polinomial yang dibentuk tidak boleh berpotongan agar hasil yang diperoleh bersifat valid. Selain itu koordinat titik perlu diperhatikan. Meskipun bentuk polinomialnya sama, namun jika diletakkan pada koordinat yang berbeda pada sumbu Cartesian, maka hasilnya juga akan berbeda. Umumnya di dalam teknik sipil, pusat sumbu O adalah titik pusat bidang yang kita tinjau tersebut. Tapi saya belum memasukkan perhitungan untuk mencari titik pusat bidang dalam program di bawah 😆

Untuk bentuk pertama, program dalam C diberikan dalam potongan kode berikut.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
    Metode 1
*/
#include <stdio.h>
#include <math.h>
 
int main(){
    float x[200];
    float y[200];
    float total=0, a=0;
    float inertiaX=0, inertiaY=0;
    int i, n, p;
 
    // Init information
    printf("Total nodes (point): ");
    scanf("%i", &n);
 
    // Nodal Coordinat x,y
    for(i=0; i<n; i++){
        printf("Nodal number %i : ", i);
        scanf("%f", &x[i]);
        scanf("%f", &y[i]);
    }
 
 
    // Second moment area X
    for(i=0; i<n; i++){
        p = (i==n-1)?(0):(i+1);
        total = total + ( (x[p]-x[i]) * (y[p]+y[i]) * (pow(y[p],2)+pow(y[i],2)) );
    }
    inertiaX = -total / 12;
 
    // Second moment area Y
    total = 0;
    for(i=0; i<n; i++){
        p = (i==n-1)?(0):(i+1);
        total = total + ( (y[p]-y[i]) * (x[p]+x[i]) * (pow(x[p],2)+pow(x[i],2)) );
    }
    inertiaY = total / 12;
 
 
    printf("\n");
    printf("Momen xx: %f\n", inertiaX);
    printf("Momen yy: %f", inertiaY);
}

Untuk bentuk kedua diberikan dalam potongan kode berikut.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/*
    Metode 2
*/
#include <stdio.h>
#include <math.h>
 
int main(){
    float x[200];
    float y[200];
    float total=0, a=0;
    float inertiaX=0, inertiaY=0;
    int i, n, p;
 
    // Init information
    printf("Total nodes (point): ");
    scanf("%i", &n);
 
    // Nodal Coordinat x,y
    for(i=0; i<n; i++){
        printf("Nodal number %i : ", i);
        scanf("%f", &x[i]);
        scanf("%f", &y[i]);
    }
 
 
    // Second moment area X
    for(i=0; i<n; i++){
        p = (i==n-1)?(0):(i+1);
        a = x[i]*y[p] - x[p]*y[i];
        total = total + ( pow(y[i],2) + y[i]*y[p] + pow(y[p],2) ) * a;
    }
    inertiaX = total / 12;
 
    // Second moment area Y
    total = 0;
    for(i=0; i<n; i++){
        p = (i==n-1)?(0):(i+1);
        a = x[i]*y[p] - x[p]*y[i];
        total = total + ( pow(x[i],2) + x[i]*x[p] + pow(x[p],2) ) * a;
    }
    inertiaY = total / 12;
 
 
    printf("\n");
    printf("Momen xx: %f\n", inertiaX);
    printf("Momen yy: %f", inertiaY);
}

Games Tebak Kata

Satu aplikasi bisa saya selesaikan malam ini, wow senangnya. Akhir-akhir ini saya sangat bersemangat membuat aplikasi baru, padahal aplikasi lainnya yang baru saja saya buat masih jauh dari sempurna dan butuh pengembangan lebih lanjut 🙂

Permainan ini pernah saya jumpai entah di web mana, saya juga lupa alamatnya. Sore ini saya terpikir untuk membuat games yang serupa dengan games yang pernah saya lihat tersebut. Bukan bermaksud untuk meniru, namun saya ingin mempunyai games di web ini, biar suasananya ga garing 😆

Silahkan saja dicoba di alamat http://duken.info/aplikasi/games/tebak/.

Saya sangat menunggu kritik dan saran kalian semua 😀

Program Integrasi Numerik dalam C

Untuk menghitung luas suatu daerah di bawah fungsi, yang biasa kita lakukan adalah menghitung nilai integral di bawah fungsi tersebut dengan batas atas dan batas bawah yang kita beriknan. Namun, komputer tidak mengenal integral. Komputer hanya mengenal operasi bilangan yang dasar seperti tambah, kali, bagi, dll.

Metode integrasi numerik memberikan cara pada kita untuk menghitung nilai integral tersebut dengan perhitungan biasa, tanpa perlu tahu apa itu integral tentunya. Tulisan dari wikipedia tentang integrasi numerik memberikan sedikit penjelasan tentang bagaimana integrasi numerik dikerjakan. Ada banyak metode dalam integrasi numerik, yang akan saya berikan di sini adalah metode jumlah atas dan jumlah bawah, metode simpson 1/3, metode trapezoidal, dan metode gauss quadrature. Contoh di bawah ini adalah program untuk menghitung nilai :

\displaystyle \int_0^1\! e^x.sin(x)\, dx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
    coder       : duken marga
    blog        : http://duken.info
    description : integrasi numerik menggunakan motoda trapezoidal, 
              gauss quadrature, simpson, dan jumlah atas dan bawah
*/
 
#include <stdio.h>
#include <math.h>
 
float jumlah_atas(float, float, float);
float jumlah_bawah(float, float, float);
float trapezoidal(float, float, float);
float simpson(float, float, float);
float gauss_quadrature(float, float);
 
float f(float);
 
int main(){
    float batas_atas;
    float batas_bawah;
    int jumlah_segmen = 20;
 
    printf("Masukkan batas atas : ");
    scanf("%f", &batas_atas);
    printf("Masukkan batas bawah : ");
    scanf("%f", &batas_bawah);
    printf("Masukkan jumlah segmen : ");
    scanf("%d", &jumlah_segmen);
 
    printf("Jumlah atas  : %20.18f \n",
        jumlah_atas(batas_bawah, batas_atas, jumlah_segmen));
    printf("Jumlah bawah : %20.18f \n",
        jumlah_bawah(batas_bawah, batas_atas, jumlah_segmen));
    printf("Rata-rata    : %20.18f \n\n",
        ( jumlah_atas(batas_bawah, batas_atas, jumlah_segmen)
        + jumlah_bawah(batas_bawah, batas_atas, jumlah_segmen) 
        ) /2
        );
    printf("Jumlah trapezoidal  : %20.18f \n",
        trapezoidal(batas_bawah, batas_atas, jumlah_segmen));
    printf("Jumlah simpson  : %20.18f \n",
        simpson(batas_bawah, batas_atas, jumlah_segmen));
    printf("Jumlah gauss_quadrature  : %20.18f \n",
        gauss_quadrature(batas_bawah, batas_atas));
}
 
/*definisi fungsi yang akan dicari nilainya*/
float f(float x){
    return exp(x)*sin(x);
}
 
/* mencari nilai luas dengan metode jumlah atas */
float jumlah_atas(float bwh, float ats, float jlh){
    float i, luas = 0;
    float node1, node2;
    float y_node1, y_node2, y;
    float lebar_segmen = (ats - bwh) / jlh;
    for(i = bwh; i < ats; i += lebar_segmen){
        node1 = i;
        node2 = i + lebar_segmen;
        y_node1 = f(node1);
        y_node2 = f(node2);
        if(y_node1 < y_node2)
            y = y_node1;
        else
            y = y_node2;
 
        luas += lebar_segmen * y;
    }
    return luas;
}
 
/* mencari nilai luas dengan metode jumlah bawah */
float jumlah_bawah(float bwh, float ats, float jlh){
    float i, luas = 0;
    float node1, node2;
    float y_node1, y_node2, y;
    float lebar_segmen = (ats - bwh) / jlh;
    for(i = bwh; i < ats; i += lebar_segmen){
        node1 = i;
        node2 = i + lebar_segmen;
        y_node1 = f(node1);
        y_node2 = f(node2);
        if(y_node1 > y_node2)
            y = y_node1;
        else
            y = y_node2;
 
        luas += lebar_segmen * y;
    }
    return luas;
}
 
/* mencari nilai luas dengan metode trapezoidal */
float trapezoidal(float bwh, float ats, float jlh){
    int i;
    float luas = 0;
    float lebar_segmen = (ats - bwh) / jlh;
    float node, y;
 
    luas = 0.5 * lebar_segmen * (f(ats) + f(bwh));
    for(i = 1; i < jlh; i++){
        node = bwh + i * lebar_segmen;
        y = f(node);
        luas += lebar_segmen * y;
    }
    return luas;
}
 
/* mencari nilai luas dengan metode simpson 1/3 */
float simpson(float bwh, float ats, float jlh){
    int i;
    float luas = 0;
    float lebar_segmen = (ats - bwh) / jlh;
    float node, y;
 
    luas = lebar_segmen * (f(ats) + f(bwh)) / 3;
    for(i = 1; i < jlh; i++){
        node = bwh + i * lebar_segmen;
        y = f(node);
        if(i%2 == 1)
            y *= 4;
        else
            y *= 2;
        luas += lebar_segmen * y / 3;
    }
    return luas;
}
 
/* mencari nilai luas dengan metode gauss quadrature */
/* menggunakan orde 3, bisa diganti dengan orde lain */
/* yang perlu diganti : orde, weight[], x[] */
float gauss_quadrature(float bwh, float ats){
    int i;
    int orde = 3;
    float luas = 0;
    float t;
    float weight[] = { (float) 8/9, (float)5/9, (float)5/9 };
    float x[] = { 0, sqrt((float) 3/5), -sqrt((float) 3/5) };
 
    for(i = 0; i < orde; i++){
        t = ((ats - bwh) * x[i] + (ats + bwh)) / 2 ;
        luas += weight[i] * f(t);
    }
    luas *= (ats - bwh) / 2;
    return luas;
}

Metode Newton-Raphson

Referensi : http://en.wikipedia.org/wiki/Newton_Raphson

Referensi di atas cukup lengkap dalam menerangkan apa itu metode Newton-Raphson. Singkatnya, metode Newton Rapshon adalah metode yang digunakan untuk mencari solusi sebuh persamaan menggunakan metode numerik.

\displaystyle x_{n+1} = x_n - \dfrac{f(x_n)}{f'(x_n)}.\,\!

dengan f(x) adalah fungsi yang ingin kita cari solusinya, f'(x) adalah turunan dari fungsi f(x), dan n adalah bilangan asli mulai dari 1. Rumus di atas cukup menggambarkan secara sederhana apa itu metode Newton-Raphson.

Contoh sederhana, kita ingin mencari solusi persamaan: x^2 + x = cos(x)

Fungsi di atas kita ubah menjadi fungsi: f(x) = x^2 + x - cos(x)

Maka turunan dari fungsi di atas adalah f'(x) = 2x + 1 + sin(x)


x_1 = x_0 - \dfrac{f(x_0)}{f'(x_0)}
x_2  = x_1 - \dfrac{f(x_1)}{f'(x_1)}
x_3  = x_2 - \dfrac{f(x_2)}{f'(x_2)} \vdots
x_4  =  \vdots
x_5  =  \vdots

untuk n = 0, maka \displaystyle  x_1 = x_0 - \frac{(x_0^2 + x_0 - cos(x_0)}{2x_0 + 1 + sin(x_0))} dengan nilai awal x_0 = 10 dan akan menghasilkan nilai x_1.

untuk n = 1, maka \displaystyle x_2 = x_1 - \frac{(x_1^2 + x_1 - cos(x_1)}{2x_1 + 1 + sin(x_1)})

Demikian seterusnya cara di atas kita ulangi hingga mendapatkan nilai x_n yang konstan. Biasanya dengan 5 kali perulangan, sudah bisa mendapatkan nilai x_n yang konstan. Nilai akhir x_n ini adalah solusi dari persamaan f(x) kita tadi.

Contoh program dalam c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/* 
 * program untuk mencari solusi persamaan 
 * dari fungsi x^2 + x = cos(x)
 * 
 * f(x)  = x^2 + x - cos(x)
 * f(x)' = 2x + 1 + sin(x)
*/
 
#include <stdio.h>
#include <math.h>
#define PHI 3.141592654
 
int main()
{
    int i, loop;
    float init, x;
 
    printf("Masukkan bilangan inisiasi : ");
    scanf("%f", &init);
    x = init;
    printf("Masukkan banyak pengulangan : ");
    scanf("%d", &loop);
 
    for(i = 0; i < loop ; i++){
        x = x - ((x*x + x - cos(x * PHI / 180)) / (2*x + 1 + sin(x * PHI / 180)));
        printf("%f\n", x);
    }
 
    printf("Solusi persamaan x^2 + x = cos(x) adalah x = %f", x);
 
}

Contoh program dalam fortran:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
! program untuk mencari solusi persamaan 
! dari fungsi x^2 + x = cos(x)
 
! f(x)  = x^2 + x - cos(x)
! f(x)' = 2x + 1 + sin(x)
 
 
program newtonRaphson
    integer::i, loop
    real::init, x
    real, parameter::PHI = 3.141592654
 
    write(*, "(A)", advance="NO"), "Masukkan bilangan inisiasi : "
    read*, init
    write(*, "(A)", advance="NO"), "Masukkan banyak looping : "
    read*, loop
 
    x = init
 
    do i = 0, loop
        x = x - ((x**2 + x - cos(x * PHI / 180)) / (2*x + 1 + sin(x * PHI / 180)))
        print*, x
    end do
 
    print*, "Solusi persamaan x^2 + x = cos(x) adalah x = ", x
end program newtonRaphson

Fortran for Engineer

Selama 2 minggu ini saya belajar fortran. Ternyata bahasa yang satu ini cukup menarik bagi saya. Bagi programmer sejati yang berkecimpung di dunia IT, mungkin Fortran dianggap sesuatu yang jadul dan jarang dipakai. Terbukti dari teman saya di jurusan informatika heran mengapa saya memakai Fortran dan bukan bahasa modern lain seperti C++.

Fortran didesain untuk para peneliti yang ingin mengembangkan aplikasi berbasis science. Artinya fortran didesain untuk engineer. Berbagai program simulasi, metoda numerik, dan perhitungan lainnya bisa dikerjakan dengan fortran. Perbedaan dengan bahasa lain seperti Java dan C terletak pada kemudahan pengolahan angka. Para pengembang aplikasi yang memakai fortran akan fokus ke penulisan program bukan kepada bahasa pemrograman itu sendiri 😀

Bahasa C++ adalah bahasa yang powerful, bisa digunakan untuk berbagai macam keperluan, mulai dari pembuatan aplikasi sederhana, berkomunikasi langsung dengan mesin, dan pembuatan perangkat cerdas bisa dilakukan dengan bahasa C/C++ atau Java. Karna kemampuannya inilah kadang kala kita sebagai engineer di bidang masing-masing, yang tidak terlalu mendalami pemrograman, kadang tidak kuat untuk mempelajari banyak fitur-fitur tersebut. Saya sendiri sudah mengalaminya lho, rasanya ga kuat, hahaha :p

Untuk itulah fortran ada sehingga pekerjaan kita hanya fokus ke pembuatan aplikasi, bukan fokus ke bahasa pemrograman. Tentu saja dengan belajar dan latihan yang cukup kita bisa membuat aplikasi yang kita inginkan.

Fortran bisa dipakai di linux dengan menggunakan compiler gfortran/f95, f90, ifort (Intel Fortran). Sedangkan di Windows, bisa menggunakan gfortran. Intel Fortran adalah produk compiler yang bersifat berbayar jika ingin mengunduhnya.

Satu kekurangan fortran adalah saya belum menemukan aplikasi GUI yang dikhusukan untuk Fortran. Jika ingin membuat aplikasi fortran, harus menggunakan konsol. Saya pernah mendengar Visual Fortan dan tampaknya program ini juga berbayar untuk mendapatkannya.

Untuk tutorial dan ebook, kamu bisa menggunakan tulisan dari www-eio.upc.es/lceio/manuals/Fortran95Manual.pdf dan dari alamat http://www.sdsc.edu/~tkaiser/f90.html

Semoga bermanfaat 😀

Sistem Login yang Aman dengan PHP

Saya pertama kali belajar PHP, saya bingung dengan bagaimana sistem login di web. Saya mencari-cari artikel di internet dan banyak sekali variasi kode untuk halaman dan verifikasi login agar bisa masuk ke halaman tertentu, baik itu halaman admin atau halaman yang dilindungi oleh pembuatnya. Skema login sebenarnya sederhana dan pada tulisan ini saya juga hanya memberikan skema yang sederhana. Urutan autentikasi login ada 4:

  1. User melihat halaman dengan form untuk mengisi username dan password disertai dengan tombol untuk login, bisa juga ditambahkan dengan form lain misalnya Captcha berupa gambar. Kadang kala, form login tidak harus username dan password, bisa saja hanya form password saja yang ditampilkan.
  2. User memasukkan data dan memberikan data ke server untuk diproses.
  3. Data input username dan password diproses. Data ini dicocokan dengan database yang ada, misalnya database MySQL. Jika username dan password yang diberikan dari input user sama dengan username dan password pada database, maka login berhasil. Jika tidak ada data yang  cocok, maka login tidak berhasil.
  4. Buat session untuk akses file yang diproteksi. Session digunakan untuk keperluan yang kita inginkan. Session adalah variabel global yang bisa menyimpan data penanda bahwa seorang user telah berhasil login sehingga file yang diproteksi bisa diakses.

Skema login yang lebih kompeks bisa ditambahkan sesuai dengan kebutuhan, misalnya saja memeriksa IP, membatasi jumlah user yang login, dll. Pertama, kita harus membuat halaman login, kode-kode html di bawah ini adalah bagian dari keseluruhan html yang ada.

login.php

1
2
3
4
5
<form action="auth.php" method="post">
	<label for="username">Username</label><input type="text" name="username"  class="input" size="10" autocomplete="off" /><br /><br />
	<label for="password">Password</label><input type="text" name="password" class="input" size="20" autocomplete="off" /><br />
	<input type="submit" value="Login" class="btn" />
</form>

auth.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
	session_start();
	$user       = mysql_real_escape_string($_POST["user"]);
	$user       = substr($user, 0, 10);
	$password   = mysql_real_escape_string($_POST["password"]);
	$password   = substr($password, 0, 20);
	$q          = "SELECT * FROM user WHERE user='$user'";
	$r          = mysql_query($q);
	$d          = mysql_fetch_object($r);
 
	if($d->user == $user AND $d->password == md5($password))
	{
		$_SESSION["user"] = $data->user;
		$_SESSION["nama"] = $data->nama;
	}
	else
	{
		header("location: login.php");
	}
?>

Jika dilihat kode di atas, ada beberapa isu keamanan yang perlu diperhatikan.

  1. Gunakan $_POST, bukan $_GET, atau $_REQUEST. Metoda ini digunakan agar data dikirim lewat metoda POST yang tidak kelihatan lewat browser. REQUEST dicegah karena metoda ini masih menerima data dari GET.
  2. Gunakan fungsi mysql_real_escape_string(). Fungsi ini berguna untuk mengilangka tanda quote pada data input username dan password yang bisa membahayakan fungsi login kita dengan serangan sql injection. SQL injection adalah metode serangan pada halaman login dengan memasukkan inputan data yang salah sehingga sql kita menjadi tidak logis sesuai dengan tujuan awal, hasilnya bisa saja user mendapatkan akses admin tanpa harus mengetahui password admin tersebut.
  3. Ambil data username dari database terlebih dahulu. Pengecekan passwor dilakukan setelah mengambil data username terlebih dahulu. Sebisa mungkin hindari penggunaan perintah sql :
    1
    
    "SELECT * FROM user WHERE user='$user' and password='$password'";

    Kode sql di atas bisa rentan terhadap serangan sql injection.

  4. Batasi penggunaan input karakter pada form login. Form input bisa dibatasi dengan penggunaan tag size=”10″ pada kode html. Lakukan proteksi juga di sisi server dengan fungsi substr()
  5. Jangan simpan password pada $_SESSION. Session bisa saja disalahgunakan, oleh karena itu simpanlah data yang memang pentin pada session dan jangan menyimpan password.

Selamat mengamankan halaman login 🙂

Mencari Nilai Akar dengan Menggunakan Metode Babylon

Dari dulu saya selalu bingung cara mencari nilai suatu akar dengan pasti. Setiap kalkulator scientific bisa “menebak” nilai dari suatu akar bilangan. Sampai suatu saat di kelas TPB di kampus dalam mata kuliah kalkulus, saya mengenal lebih dalam apa itu limit. Kita bisa menggunakan limit untuk mencari pendekatan suatu nilai dari fungsi yang kita cari termasuk mencari nilai dari fungsi akar. Dasar saya emang bodoh, saya tidak begitu memahami prinsip limit ini.

Pada sebuah buku pemrograman, saya menemukan algoritma bagaimana mencari nilai akar dengan menggunakan fungsi Babylon. Fungsi ini menggunakan looping atau perulangan untuk mendapatkan nilai yang lebih presis. Syarat agar perhitungan kita berhenti dari perulangan, kita harus menetapkan suatu batasan atau nilai toleransi.

Algoritma Babylon bisa dituliskan seperti ini:

  1. Ambil nilai yang akan dicari nilai akarnya, misalkan bilangan ini adalah x.
  2. Kita akan menggunakan variabel lain yaitu y. Jika x>2, maka nilai y kita set nilainya menjadi x/2, namun jika 0<x<=2, maka kita set nilai y=1
  3. Cari nilai y baru yang diperoleh lewat perhitungan y = { (y + x/y)/2 }. Ingat nilai y yang di sebelah kiri adalah nilai y yang ingin kita cari, sedangkan nilai y yang di sebelah kanan adalah nilai y yang kita peroleh dari langkah 2 di atas.
  4. Tentukan batas toleransi, misalnya Epsilon E = 5×10-15.
  5. Jika E < | y*y – x |, ulang dan kembali ke langkah 3 dengan nilai y adalah nilai y yang terakhir. Jika E > | y*y -x |, ikuti langkah 6.
  6. Nilai akar x yang kita cari adalah nilai y yang tadi kita peroleh.

Contohnya kita ingin mencari nilai akar 5.

  1. Nilai x = 5.
  2. x > 2, maka nilai y=x/2 atau y = 2,5
  3. y = { (y + x/y)/2 } = (2,5 + 5/2,5)/2 = 2,25
  4. E = 5×10-8
  5. y*y – x = 2,25*2,25 – 5 = 0,0625
  6. x – y*y = 5 – 2,25*2,25 = -0,0625
  7. Kita bandingkan nilai Epsilon dengan hasil di atas. E =5×10-8 lebih kecil dari salah satu nilai di atas. 5×10-8 < -0,0625, jadi kita ulangi lagi langkahnya.
  8. y = { (y + x/y)/2 } = (2,25 + 5/2,25)/2 = 2,2361..
  9. E = 5×10-15
  10. y*y – x = 2,2361*2,361 – 5 = 1,929×10-4
  11. x – y*y = 5 – 2,2361*2,361 = -1,929×10-4
  12. Kita bandingkan nilai Epsilon dengan hasil di atas. E =5×10-8 lebih kecil dari salah satu nilai di atas. 5×10-8 < 1,929×10-4, jadi kita ulangi lagi langkahnya.
  13. y = { (y + x/y)/2 } = (2,2361 + 5/2,2361)/2 = 2,236067978..
  14. E = 5×10-15
  15. y*y – x = 2,23606*2,3606 – 5 = 1,88×10-9
  16. x – y*y = 5 – 2,23606*2,3606 = -1,88×10-9
  17. Kita bandingkan nilai Epsilon dengan hasil di atas. E = 5×10-8 lebih besar dari salah satu nilai di atas. 5×10-8 > 1,88×10-9. Karena syarat E > | y*y -x | sudah terpenuhi, maka perulangan dihentikan.

Nilai akhir y adalah hasil akar dari nilai x. Jadi akar 5 adalah 2,236067978. Tentunya nilai ini adalah pendekatan. Jika teman-teman menghitung nilai akar 5 langsung dari kalkulator, nilainya (hampir) sama dengan nilai dengan menggunakan cara Babylon. Untuk mendapatkan nilai yang lebih presisi, kita bisa menggunakan nilai Epsilon yang lebih rendah dari nilai di atas, namun dengan nilai di atas pun, saya bisa mendapatkan kepresisian 9 angka di belakang koma dengan 2 kali perulangan. Jangan-jangan hasil perhitungan akar dari kalkulator yang sering kita pakai, itu menggunakan cara Babylon ya 😀

Untuk programnya, bisa menggunakan C++ atau bahasa lain. Contoh di bawah ini adalah program mencari akar dengan nilai epsilon 5×10-15.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
	compile with g++ (MinGW)
	ex : g++ square.cpp -o square
*/
 
#include <iostream>
#include <iomanip>
using namespace std;
 
/*deklarasi fungsi babylon*/
double	babylon(double);
 
/*fungsi utama*/
int main()
{
	double X;
	cout << "Input bilangan yang akan dicari akarnya : ";
	cin >> X;
	cout << "==============================\n";
	cout << "\t Y \t Y*Y \n";
	cout << "==============================\n";
 
	/*panggil fungsi babylon dengan parameter nilai akar yang dicari*/
	double y = babylon(X);
	cout << "==============================\n";
 
	/*set nilai kepresisian jika perlu*/
	cout << "Akar " << X << " adalah : " << setprecision(20) <<y << endl;
 
	return 0;
}
 
/*detail fungsi babylon*/
double babylon(double x){
	/*
		batas nilai toleransi (epsilon), atau epsilon
		usahakan nilai ini jangan terlalu besar atau terlalu kecil
	*/
	const double TOLERANSI = 5e-15;
	if(x < 0)
		return 0.0;
 
	/*jika
		x > 2 -> y = x/2
		x <= 2 -> y = 1
	*/
	double y = (x > 2 ? x/2 : 1);
 
	/*
		ulangi sampai syarat dipenuhi : epsilon > | y*y - x |
		jika sudah memenuhi syarat, maka nilai akar adalah nilai y
	*/
	do{
		y = (y + x/y) / 2;
		cout << setw(10) << y << setw(12) << y*y << "\n";
	}while(x > y*y + TOLERANSI || y*y > x + TOLERANSI);
	return y;
}

Mendeteksi Perangkat Mobile dengan PHP

Ketika user membuka sebuah web, ada 2 kemungkinan yaitu user membuka halaman web dari desktop atau dari perangkat mobile. Saat ini banyak layanan web yang menyediakan tampilan web yang sesuai dengan ukuran layar perangkat mobile sehingga lebih mudah dibaca dan dilihat. Berikut cara mendeteksi perangkat mobile menggunakan php, anda bisa mengembangkannya atau menambahkan jenis-jenis perangkat mobile lainnya.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
 
	/*Detect mobile device*/
 
	$ismobile = 0;
	$container = $_SERVER['HTTP_USER_AGENT'];
 
	/*List of mobile devices*/
	$useragents = array(
	'Blazer',
	'Palm',
	'Handspring',
	'Nokia',
	'Kyocera',
	'Samsung',
	'Motorola',
	'Smartphone',
	'Windows CE',
	'Blackberry',
	'WAP',
	'SonyEricsson',
	'PlayStation Portable',
	'LG',
	'MMP',
	'OPWV',
	'Symbian',
	'EPOC'
	);
 
	foreach($useragents as $useragents)
	{
		if(strstr($container,$useragents))
		{
			$ismobile = 1;
		}
	}
	if($ismobile)
	{
		echo "<p>Anda menggunakan perangkat mobile.</p>";
	}
 
	echo $_SERVER['HTTP_USER_AGENT'];
 
?>