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

2 thoughts on “Program Integrasi Numerik dalam C

  1. mas.. punya formula nya buat menghitung integral untuk gauss quadrature tidak mas?? saya cari kemana …kemana..belum dapet.. kalu punya buku atau link yang membantu tolong contcat saya ya mas.. ehehhe..thax

Leave a Reply

Your email address will not be published. Required fields are marked *