Tag Archives: Matematika

Rata-rata Aritmatik, Geometrik, dan Harmonik

Pagi ini saya menemukan sepasang kata baru dalam bahasa Inggris: geometric mean, yang dalam bahasa Indonesia diartikan sebagai rata-rata geometrik. Saya lalu mencari arti rata-rata geometrik ini dan menemukan bahwa rerata geometrik merupakan salah satu dari 3 macam rata-rata Pythagorian.

Ketiga rata-rata Pythagorian tersebut beserta definisinya adalah:
1. Rata-rata aritmatik

\displaystyle A(x_1, \ldots, x_n) = \frac{1}{n}(x_1 + \cdots + x_n)

2. Rata-rata geometrik
\displaystyle G(x_1, \ldots, x_n) = \sqrt[n]{x_1 \cdots x_n}

3. Rata-rata harmonik
\displaystyle H(x_1, \ldots, x_n) = \frac{n}{\frac{1}{x_1} + \cdots + \frac{1}{x_n}}

Rata-rata aritmatik mungkin sudah diperkenalkan pada bangku sekolah dasar, sedangkan kedua rata-rata lainnya, secara tidak langsung diperkenalkan di bangku pendidikan yang lebih tinggi.

Perbedaan nilai ketiganya terletak pada jenis data yang akan dicari nilai rata-ratanya. Rata-rata aritmatik dipakai untuk data-data yang umum atau general, contohnya rata-rata nilai sejumlah mahasiswa, rata-rata kedalaman sungai, atau rata-rata lama perjalanan dari kota A ke kota B.

Sedangkan rata-rata geometrik biasanya dipakai untuk data yang memiliki kualitas/berat (weight) yang berbeda di antara data-data tersebut. Umumnya data-data ini memiliki nilai batas minimum dan maksimum. Contohnya sekolah A memiliki range nilai siswa 0-100, sedangkan sekolah B memiliki range nilai 0-80. Jika kita ingin mencari nilai rata-rata siswa kedua sekolah tersebut, rata-rata aritmatika tidak akan bisa digunakan karena bobot nilai sekolah A akan memberikan nilai yang lebih besar dibanding sekolah B. Untuk kasus seperti ini, rerata geometrik umum digunakan.

Rata-rata harmonik digunakan untuk data yang berupa rate atau rasio. Contohnya adalah kecepatan (jarak per waktu), debit air (volume per waktu), tekanan (gaya per luas), dan data lainnya yang memiliki satuan rate. Misalkan mobil 1 berjalan dari kota A ke kota B dengan kecepatan 80 km/jam. Kemudian mobil 2 dengan jarak yang sama, dari kota A ke kota B, berjalan dengan kecepatan 60 km/jam. Rata-rata kecepatan kedua mobil tersebut adalah 68,57 km/jam dihitung dengan menggunakan rerata harmonik. Dalam kasus ini, nilai yang tetap adalah jarak. Jika nilai yang tetap adalah waktu, misalkan mobil 1 dan mobil 2 berjalan dalam waktu 1 jam dan jarak yang ditempuh berbeda, maka rata-rata kecepatan mobil dihitung dengan rerata aritmatik yang nilainya adalah 70 km/jam.

Dari ketiga rerata Pythagorian di atas, nilai yang paling kecil adalah rerata harmonik dan yang paling besar nilainya adalah rata-rata aritmatik, bisa dituliskan

\displaystyle H \leq G \leq A
.
Fungsi rerata lainnya adalah rata-rata Quadratik yang biasanya menangani data-data yang nilainya positif dan negatif.

Tanggal yang Sama di Tahun Depan

Hari ini adalah hari Jumat tanggal 11 Oktober 2013. Kira-kira tahun depan tanggal yang sama, 11 Oktober, hari apa ya?

Dulu waktu saya masih duduk di bangku SMP, setiap kali saya berulang tahun, saya selalu berpikir: tahun depan ulang tahunku hari apa ya? Itulah pertanyaan iseng yang mungkin sebagian orang pernah pikirkan. Saya pun melakukan hitung-hitungan sederhana. Solusinya pun ternyata sangat sederhana dan bisa dipraktekkan langsung.

Dalam 1 tahun, bukan tahun kabisat seperti tahun 2013, ada 365 hari yang dibagi ke dalam 12 bulan. Dalam 1 minggu terdapat 7 hari. Karena penamaan Senin hingga Minggu dilakukan dalam 7 hari, maka kita akan melakukan perhitungan hari dan minggu.

365 \; mod \; 7 \equiv 1\:

Perhitungan di atas menunjukkan sisa dari 365 dibagi 7 adalah 1. Artinya, dalam 1 tahun non kabisat akan ada kelebihan sisa 1 hari dalam tanggal yang sama di tahun depan. Dengan demikian, untuk mencari tau hari di tanggal yang sama di tahun depan, kita tinggal memajukan 1 hari ke depan.

Contohnya, jika hari ini adalah hari Jumat tanggal 11 Oktober 2013, maka tahun depan tanggal 11 Oktober 2014 (2014 adalah tahun non-kabisat) adalah hari Sabtu. Tanggal 11 Oktober 2015 adalah hari Minggu.

Bagaimana dengan tahun kabisat seperti tahun 2016? Khusus untuk tahun kabisat, kita harus memajukan 2 hari karena 1 tahun kabisat berjumlah 366 hari.

366 \; mod \; 7 \equiv 2

Dengan demikian, tanggal 11 Oktober 2016 akan jatuh pada hari Selasa :).

Rumus Tali Sepatu

Referensi utama: http://en.wikipedia.org/wiki/Shoelace_formula

Nama aslinya adalah Shoelace Formula atau jika diterjemahkan ke dalam bahasa Indonesia menjadi formula tali sepatu atau rumus tali sepatu. Rumus ini biasa digunakan untuk mencari luasan suatu area yang dibatasi oleh titik-titik yang membentuk sebuah poligon (banyak sisi). Para surveyor lapangan biasa menggunakan rumus sederhana ini.

7a85364ae671f99d2aac6f5cbccda344

Menariknya, meskipun rumusnya terlihat sangat tidak menarik, implementasi rumus ini bahkan bisa diajarkan di lingkungan anak SD (Sekolah Dasar). Tidak percaya? Coba saja lihat bagian Explanation di situs Wikipedia pada link di atas. Mengutip langsung dari Wikipedia pada saat tulisan ini dibuat, misalkan sebuah segitiga dengan koordinat (2,4), (3,−8), dan (1,2). Koordinat ini bebas ditentukan dan menyesuaikan dengan koordinat titik awal 0,0.
Karena ada 3 titik, kita membuat sebuah matriks koordinat x, y seperti di bawah ini dengan koordinat paling akhir adalah koordinat paling awal. Dalam kasus ini, koordinat paling atas dan bawah adalah 2,4.

b611a73a6bfd235edb02c9df3f124079

Lalu kita membuat sebuah garis diagonal dari kiri ke kanan seperti gambar di bawah ini kemudian mengalikan bilangan-bilangan yang berpasangan lalu menjumlahkannya: (2 × −8) + (3 × 2) + (1 × 4) = −6

ShoelaceMatrix2

Dengan cara yang sama, buatlah pasangan diagonal dari kanan ke kiri seperti gambar di bawah ini lalu mengalikan bilangan-bilangan tersebut dan menjumlahkannya: (4 × 3) + (−8 × 1) + (2 × 2) = 8

ShoelaceMatrix3

Perhatikan gambar di atas mirip dengan bentuk tali sepatu 🙂

Dengan demikian luas area segitiga adalah hasil yang diperoleh dari perhitungan pertama dikurangi dengan hasil yang kedua lalu dibagi 2: |-6 – 8|/2 = 14/2 = 7.

Menghitung Diameter Saluran Pipa

Ini adalah salah satu pertanyaan random ujian masuk ke SMA saya dulu, hanya angka-angkanya saja yang diganti. Bayangkan saya mempunyai sebuah pipa seperti gambar di bawah ini.

 Pipa

Misalkan kedalaman air di dalam pipa (t2) adalah 50 cm. Lebar air (m1+m2) adalah 3 meter. Berapakah diameter saluran pipa?

Soal ini bisa diselesaikan dengan menggunakan rumus yang dipelajari di SMP. Jika ada sebuah lingkaran dan 2 buah garis sembarang di dalam nya, maka hasil kali nilai sisi-sisi yang berseberangan oleh titik potong kedua garis adalah sama.

t_1 * t_2 = m_1 * m_2

Dalam soal di atas m1 = m2, maka:

  t_1 * t_2 = m_1 * m_2
t_1 * 0.5 = 1.5 * 1.5
t_1 = 4.5

Dengan demikian tinggi pipa (t1+t2) adalah 0,5 m + 4.5 m = 5 meter.

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);
}

Soal Matematika

Di bawah ini adalah sebuah contoh soal olimpiade matematika SMA yang pernah saya lihat di sebuah buku. Hitunglah nilai x dari persamaan tak berhingga berikut.

x = 1 + \frac{1}{1+\frac{1}{1+\frac{1}{1+\frac{1}{..}}}}

Kelihatannya sulit untuk dikerjakan, tapi ternyata cara pengerjakannya sangat sederhana. Jika diperhatikan, soal di atas dapat disederhanakan menjadi persamaan di bawah ini. Coba deh, nilai x pada ruas kanan pada 1/x persamaan 2 di bawah ini diganti dengan nilai x pada persamaan itu sendiri, pasti akan diperoleh persamaan di atas dengan bentuk persamaan yang tak berkesudahan.

x = 1 + \frac{1}{x}
x^{2}-x-1=0

Dengan mendapatkan penyederhanaan bentuk persamaan, maka dengan rumus A, B, C, kita bisa memperoleh nilai x.

x_{1} = \frac{1+\sqrt{5}}{2}
x_{2} = \frac{1-\sqrt{5}}{2}

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 Secant

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

Sama seperti metode newton-raphson, metode secant adalah salah satu dari metode numerik untuk mencari solusi persamaan dari sebuah fungsi. Referensi di atas sangat jelas dan bisa menerangkan lebih banyak daripada tulisan di sini.

Saya hanya ingin memberi contoh program dalam C.

\displaystyle x_n=x_{n-1}-f(x_{n-1})\dfrac{x_{n-1}-x_{n-2}}{f(x_{n-1})-f(x_{n-2})}

Fungsi yang digunakan dalam contoh ini adalah f(x)  = x^2 + x - cos(x), jika ingin mencoba dengan fungsi lain, tinggal mengganti fungsi f(x) dalam program di bawah ini.

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
/*
 * program untuk mencari solusi persamaan suatu fungsi
 * dengan menggunakan metode secant
 * coder : duken
*/
 
#include <stdio.h>
#include <math.h>
#define PHI 3.141592654
#define TOLERANCE 10E-10
 
float f(float x);
int main()
{
    float x1, x2, x3;
    int i, loop;
 
    printf("Masukkan nilai bilangan inisiasi pertama : ");
    scanf("%f", &x1);
 
    printf("Masukkan nilai bilangan inisiasi kedua : ");
    scanf("%f", &x2);
 
    printf("Masukkan jumlah maksimum perulangan : ");
    scanf("%d", &loop);
 
    printf(" x1 \t  x2 \t   x3\n ");
 
    for(i = 0; i < loop; i++){
        x3 = x2 - f(x2) * (x1 - x2) / (f(x1) - f(x2));
        printf("%f %f %f\n ", x1, x2, x3);
        if( x2 - x3 < TOLERANCE){
            break;
        }
        x1 = x2;
        x2 = x3;
    }
    printf("Solusi persamaan adalah : %20.10f", x3);
}
 
/*
 * 
 * f(x)  = x^2 + x - cos(x)
*/
float f(float x){
    return x*x + x - cos(x * PHI / 180);
}