Metode Numerik
Metode Numerik
SURABAYA
INSTITUT TEKNOLOGI SEPULUH NOPEMBER
METODE NUMERIK
PENYELESAIAN PERSAMAAN NON LINIER
PENYELESAIAN SISTEM PERSAMAAN
LINIER
Niyoko Yuliawan
7409030012
1 D3 IT A
A. Metode Penyelesaian Persamaan Non Linier
Menyelesaikan persamaan atau mencari akar persamaan f(x)=0 berarti
mencari nilai-nilai x sehingga menyebabkan pernyataan f(x)=0 menjadi benar.
Dengan kata lain, akar persamaan f(x)=0 adalah absis perpotongan grafik
fungsi f(x) dengan sumbu x. Untuk menyelesaikan persamaan ini, ada dua
metode, yaitu metode tertutup dan metode terbuka. Dengan metode
tertutup, kita memberikan dua nilai misal a dan b untuk inisialisasi proses.
Dua nilai ini harus mengapit akar yang sebenarnya. Untuk melihat apakah di
antara range (a, b) ada akar atau tidak, kita bisa memanfaatkan teorema
berikut: Jika nilai fungsi di a dan b berlawanan, maka ada akar di antara a dan
b, namun hal ini tidak berlaku sebaliknya. Sedangkan dengan metode
terbuka, kita memberikan satu tebakan awal untuk inisialisasi proses,
tebakan awal ini diusahakan sedekat mungkin dengan akar sebenarnya.
1. Metode Tabel
Metode table merupakan salah satu metode tertutup untuk
menyelesaikan persamaan non linier. Metode ini adalah metode dengan
algoritma yang paling sederhana, namun lambat dan tidak bisa memberikan
hasil yang akurat. Biasanya metode ini dipakai hanya untuk memperkirakan
range awal sebelum menggunakan metode yang lebih baik. Secara
sederhana, untuk menyelesaikan persamaan non linier dapat dilakukan
dengan metode tabel atau pembagian area. Di mana untuk x=[a, b] dibagi
sebanyak n bagian dan pada masing-masing bagian dihitung f(x) sehingga
diperoleh tabel :
=a
=b
Dari tabel ini bila ditemukan f(xk)=0 atau mendekati nol, maka akar
persamaan adalah xk. Bila tidak ada, maka dicari nilai xk dan xk+1 yang
berlawanan tanda, maka akar persamaan berada di antara xk dan xk+1. Jika
selisih xk dan xk+1 kurang dari toleransi, maka kita tetapkan akar persamaan
adalah xk atau xk+1 tergantung nilai mana yang memberikan f(x) lebih dekat ke
nol. Tetapi, jika selisih xk dan xk+1 terlalu jauh maka akarnya perlu dicari lagi
dengan range xk dan xk+1.
5. xi=a.
6. Untuk i=0 hingga n
a) yi=f(xi)
b) Bila yi-1.yi ≤ 0 maka keluar looping dan nyatakan bahwa akar
berada di antara
xk-1 dan xk. START
c) xi+1=xi+h.
7. Bila tidak ada yi-1.yi yang kurang dari atau sama dengan 0, maka
Definisi f (x)
nyatakan bahwa step=0.1
akar tidak berada di range ini.
Flowchart Metode Tabel:
xi=a
F
f(xi)*f(xi+step)<0
xi=xi+step
Tampilkan akar
diantara xi dan
xi+step
END
Listing Code Metode Tabel:
#include <stdio.h>
#include <math.h>
real f(real);
real absolut(real);
main()
{
int iterasi = 0;
real a, b, i, tempSol, step = 0.1, maxerror;
printf("METODE TABEL\n");
printf("Persamaan ln(x)+tanh(x)=0\n\n");
if(f(a)*f(b)<0)
{
for(i=a; i<b; i+=step)
{
iterasi++;
if(f(i)*f(i+step)<0)
{
tempSol = i;
a = i;
b = i+step;
step /= 10;
if(absolut(f(tempSol))<=maxerror)
break;
i-=step;
}
if(iterasi==1)
{
printf("\nIterasi_ke Akar Error\n");
printf("%3d %-20.16lf %g\n", iterasi,
tempSol, absolut(f(tempSol)));
}
else
printf("%3d %-20.16lf %g\n", iterasi,
tempSol, absolut(f(tempSol)));
real f(real
} x)
{ printf("\nAkar persamaan adalah %.16lf\n\n",
return log(x)+tanh(x);
tempSol);
} }
else
real absolut(real x)
printf("\nAkar tidak berada di range ini\n\n");
{
}
if(x<0)
return -x;
return x;
}
User Guide Program:
Pada tampilan ini, user harus memasukkan batas bawah, batas atas, dan
toleransi error
Tampilan setelah user mengisikan semua data, setelah itu, program akan
melakukan komputasi berdasarkan nilai yang diberikan user dan program
akan menampilkan nilai-nilai yang diperoleh pada setiap iterasinya.
Tampilan setelah program selesai melakukan komputasi.
1. Metode Biseksi
step 3
1
2
tempSol=mid;
iterasi++;
error=absolut(tempSol-oldSol);
END
if(iterasi==1)
{
printf("\nIterasi_ke Akar
Error\n");
printf(" %3d %-20.16lf %g\n",
iterasi, tempSol, absolut((a-b)/2));
}
else
printf(" %3d %-20.16lf %g\n",
iterasi, tempSol, error);
if(f(mid)==0)
break;
if(f(mid)*f(a)<0)
b=mid;
else
a=mid;
oldSol=tempSol;
Listing Code Metode}while((iterasi
Biseksi: <= 1) || ((error > maxerr) &&
(iterasi<maxiter)));
printf("\n\n");
printf("Akarnya adalah %.16lf\n\n", tempSol);
}
else
printf("Akar tidak ada dalam range ini\n\n");
}
real f(real x)
{
return log(x) + tanh(x);
}
real absolut(real x)
{
if(x<0)
return -x;
return x;
}
User Guide Program:
y-fa=fa-fba-b(x-a)
f (a ) − f (b)
− f (a ) = ( x − a)
a −b
f (a )(b − a )
x−a =
f (a ) − f (b)
b. f (a ) − a. f (a )
x−a =
f (a ) − f (b)
b. f (a ) − a. f (a )
x= +a
f (a ) − f (b)
b. f (a ) − a. f (a ) + a. f (a) − a. f (b)
x=
f ( a ) − f (b )
b. f (a ) − a. f (b)
x=
f ( a ) − f (b )
x 21
Pada kasus tertentu, ternyata metode biseksi lebih baik daripada metode
regula falsi. Contohnya pada persamaan f(x) = x10 – 1. Kita akan mencoba
menyelesaikannya dengan metode biseksi dan metode regula falsi dengan
batas bawah 0 dan batas atas 1,3.
b=x a=x
x=a.fb-b.f(a)fb-f(a)
7. Hitung f(x).
8. Bila f(x).f(a) < 0 maka b=x dan f(b)=f(x), bila tidak, a=x dan f(a)=f(x).
9. Jika |f(x)| < e atau iterasi > n, maka proses dihentikan dan akar
persamaan adalah nilai x yang terakhir, jika tidak, ulangi langkah 6.
real f(real);
real absolut(real);
main()
{
int iterasi = 0;
real a, b, oldSol=0, tempSol, step = 0.1, error, mid, maxerr,
maxiter;
if(f(a)*f(b)<0)
{
do
{
mid = (a*f(b)-b*f(a))/(f(b)-f(a));
tempSol=mid;
iterasi++;
error=absolut(tempSol-oldSol);
if(iterasi==1)
{
printf("\nIterasi_ke Akar
Error\n");
printf(" %3d %-20.16lf %g\n", iterasi,
tempSol, absolut((a-b)/2));
}
else
printf(" %3d %-20.16lf %g\n", iterasi,
tempSol, error);
if(f(mid)==0)
break;
if(f(mid)*f(a)<0)
b=mid;
else
a=mid;
oldSol=tempSol;
Listing Code Metode Regula Falsi:
}while((iterasi <= 1) || ((error > maxerr) &&
(iterasi<maxiter)));
printf("\n\n");
printf("Akarnya adalah %.16lf\n\n", tempSol);
}
else
printf("Akar tidak ada dalam range ini\n\n");
}
real f(real x)
{
return log(x)+tanh(x);
}
real absolut(real x)
{
if(x<0)
return -x;
return x;
}
User Guide Program:
y=x
y=4/x+2 akar
Iterasi Divergen:
Tidak semua fungsi bisa dijadikan fungsi g karena pengambilan fungsi yang
salah akan menjadikan iterasi menjadi divergen, contohnya terjdi pada
fungsi g(x) = 4/x. Grafik fungsi ini simetris terhadap garis y = x. Terlihat pada
gambar bahwa hingga iterasi ke berapapun, nilai x akan berkutat pada angka
1 dan 4. Sehingga kita harus memilih fungsi yang tepat untuk fungsi g(x) ini.
Perhatikan bahwa konvergensi terjadi bila |g’(x)| < 1.
START
Masukkan pendekatan
awal x, error maksimum e
Gambar 5 : Iterasi yang divergen
dan iterasi maksimum n pada fungsi g(x) = 4/x
END
real f(real);
real g(real);
real absolut(real);
main()
{
int iterasi = 0, convDir, div=0;
real x, error, maxerr, maxiter, oddBef, evenBef;
do
{
iterasi++;
if(iterasi==1)
printf("\nIterasi_ke x f(x)\n");
else
x=g(x);
error=absolut(f(x));
printf(" %3d %-20.16lf %g\n", iterasi, x, error);
if(iterasi==1)
oddBef=x;
else if(iterasi==2)
{
convDir = x>oddBef?1:0;
evenBef=x;
Listing Code:}
else if(iterasi % 2 == 1)
{
if((x<=oddBef)==convDir)
{
div=1;
break;
}
oddBef=x;
}
else
{
if((x>=evenBef)==convDir)
{
div=1;
break;
}
evenBef=x;
}
}while(error>maxerr && iterasi<maxiter);
if(div)
printf("Iterasi divergen, proses dihentikan\n");
else
printf("\nAkar persamaannya adalah : %.16lf\n", x);
}
real f(real x)
{
return log(x) + tanh(x);
}
real g(real x)
{
return exp(-tanh(x));
}
real absolut(real x)
{
if(x<0)
return -x;
return x;
}
User Guide:
Pada tampilan ini, user harus memasukkan tebakan awal, toleransi error dan
iterasi maksimum
Selain itu, program ini juga bisa mendeteksi jika user memilih fungsi g yang
salah sehingga iterasi menjadi divergen.
y-fxi=f'(xi)(x-xi)
− f ( xi ) = f ' ( xi )( x − xi )
f ( xi )
x − xi = −
f ' ( xi )
f ( xi )
x = xi −
f ' ( xi )
?x0
?x0
i x f(x)
0 0.5 -0.999023438
1 51.65 1.35115E+17
2 46.485 4.71117E+16
3 41.8365 1.64268E+16
4 37.65285 5.72768E+15
5 33.88757 1.99712E+15
… … …
∞ 1 0
Dari tabel terlihat bahwa sebenarnya iterasi ini konvergen (kita lihat error
yang makin lama makin mengecil), namun kekonvergenannya lambat sekali,
sehingga kita butuh berjuta-juta iterasi untuk mendapatkan akarnya.
Flowchart Metode NewtonSTART
Raphson:
Masukkan pendekatan
awal x, error maksimum e
dan iterasi maksimum n
T
|f(x)|<e atau i>n
f(x)
x = x−
f' (x)
i++
Tampilkan akar
persamaan adalah x
END
Listing Code:
#include <stdio.h>
#include <math.h>
do
{
iterasi++;
if(iterasi==1)
printf("\nIterasi_ke x f(x)\n");
else
x=x-f(x)/f1(x);
error=absolut(f(x));
printf(" %3d %-20.16lf %g\n", iterasi, x, error);
}while(error>maxerr && iterasi<maxiter);
real f(real x)
{
return log(x) + tanh(x);
}
real f1(real x)
{
return (1/x) + (1/pow(cosh(x), 2));
}
real absolut(real x)
{
if(x<0)
return -x;
return x;
}
User Guide Program:
Di sini user harus memasukkan tebakan awal, toleransi error dan iterasi
maksimum
f'(x)≈fxi-f(xi-1)xi-xi-1
didapat:
xi+1=xi-f(xi)xi-xi-1fxi-fxi-1
x210
b−a
x = b − f(b)
f(b) − f(a)
T
|f(x)|<e atau i>n
a=b
b=x
i++;
Tampilkan akar
persamaannya
adalah x
END
Listing Code:
#include <stdio.h>
#include <math.h>
real f(real);
real absolut(real);
main()
{
int iterasi = 0;
do
{
i++;
x = x-f(b)*((b-a)/(f(b)-f(a)));
error = absolut(f(x));
a=b;
b=x;
if(iterasi==1)
{
printf("\nIterasi_ke Akar
Error\n");
printf(" %3d %-20.16lf %g\n", iterasi,
tempSol, absolut((a-b)/2));
}
else
printf(" %3d %-20.16lf %g\n", iterasi,
tempSol, error);
real f(real x)
{
return log(x)+tanh(x);
}
real absolut(real x)
{
if(x<0)
return -x;
User Guide Program:
return x;
}
Pada tampilan ini, user harus memasukkan 2 tebakan, diusahakan
sedekat mungkin. User juga harus memasukkan toleransi error dan
iterasi maksimum
x3210
x
1
x
2
? x
0
A. Metode
Gambar Penyelesaian
8 : Perbedaan metode Regula Sistem Persamaan
Falsi dan metode Secant Linier
Karena metode penyelesaian sistem persamaan linier di sini akan banyak
melibatkan matriks, maka terlebih dahulu akan diperkenalkan tentang
istilah-istilah yang digunakan dalam matriks. Sebuah matriks adalah
kumpulan bilangan yang disusun sedemikian rupa sehingga berbentuk
persegi panjang dan dinyatakan dengan simbol tunggal berupa huruf kapital.
• Matriks segitiga bawah adalah matriks bujur sangkar yang memenuhi aij
= 0 if j > i.
6 5 2
A = 0 2 1
0 0 3
• Matriks A dikatakan sama dengan matriks B jika dan hanya jika aij = bij
∀i, j.
• C = A + B artinya cij = aij + bij ∀i, j
• C = A – B artinya cij = aij − bij ∀i, j
• B = -A artinya bij = -aij ∀i, j
• B = k.A dengan k Є R, artinya bij = k.aij ∀i, j
• Perkalian dua matriks bisa dikerjakan dengan syarat jumlah kolom
matriks pertama sama dengan jumlah baris matriks kedua.
C = A.B artinya
cij=k=1naik.bkj
dengan n adalah jumlah kolom matriks pertama sekaligus jumlah baris
matriks kedua.
• Transpose suatu matriks adalah penukaran peran baris menjadi kolom
dan sebaliknya. Transpose suatu matriks A disimbolkan dengan AT.
4 7 5
A = 4 2 2
1 3 6
4 4 1
A = 7 2 3
T
5 2 6
Sifat-sifat Aritmatika Pada Matriks:
• Penjumlahan dan pengurangan matriks bersifat sama seperti
penjumlahan dan pengurangan bilangan real karena sifat-sifat masing-
masing elemennya diturunkan kepada matriks.
A+B=B+A
A – B = A + (-B)
(A + B) + C = A + (B + C)
• Jika dimensi matriks cocok, perkalian matriks bersifat asosiatif, tetapi
perkalian matriks tidak bersifat komutatif.
(A.B)C = A(B.C)
A.B ≠ B.A pada kasus umum, bahkan jika A.B ada, belum tentu B.A ada.
• Perkalian matriks juga bersifat distributif terhadap penjumlahan dan
pengurangan
A(B + C) = A.B + B.C
(A + B)C = A.C + B.C
• Jika A matriks bujur sangkar dengan determinan tak-nol, maka ada
matriks A-1 yang disebut invers dari A.
A.A-1 = A-1.A = I
Augmented Matrix:
Augmented matriks adalah suatu matriks yang diperluas dengan
menambahkan satu atau beberapa kolom.
Contoh:
Matriks diaugment dengan matriks menjadi
4 1 3 6 4 1 3 6
2 5 6 3 2 5 6 3
1 1 7 2 1 1 7 2
• Penukaran baris
Penukaran baris berarti menukar salah satu baris dengan baris yang
lain. Contoh:
Matriks , jika baris pertama ditukar dengan baris kedua.
4 7 6
5 2 1
3 6 4
Hasilnya adalah .
5 2 1
4 7 6
3 6 4
Hasilnya adalah .
4 7 8
2 1 4 12 3
2
1 2 5
pertama.
Hasilnya adalah .
2 2 1
6 10 10
5 6 9
a11 a12 a13 ... a1n c1 p11 p12 p13 ... p1n q1
a a 22 a 23 ... a 2 n c2 OBE 0 p 22 p 23 ... p2n q 2
21
a31 a32 a33 ... a3n c3 0 0 p33 ... p3n q3
... ... ... ... ... ... ... ... ... ... ... ...
a n1 an 2 a n 3 ... a nn c n 0 0 0 ... p nn q n
Sehingga kita mempunyai sistem persamaan linier baru yang lebih mudah
menyelesaikannya.
p11 x1 + p12 x 2 + p13 x3 + ... + p1n x n = q1
p 22 x 2 + p 23 x3 + ... + p 2 n x n = q 2
p33 x3 + ... + p1n x n = q3
......
p nn x n = q n
qn
xn =
p nn
xn −1 =
1
(q n −1 − p n −1,n x n )
p n −1,n −1
.........
1
x2 = ( q2 − p23 x3 − p24 x4 − ... − p2n xn )
p 22
1
x1 = ( q1 − p12 x2 − p13 x3 − ... − p1n xn )
p11
F
J<n
i=0
T
C i++
K=0
F
i<n
C
T F
K<=n
A[i][i]==0 F B T
A[j][k]=A[j][k]-(A[j][i]/A[i][i])*A[i][k] J++
T k++
Temp1=-1
J=i+1
F
J<n
T i=n-1
A
D
A[j][i]!=0
F
i>=0 D
Subs=0
F J=i+1
i<n
F
Temp!=-1
T
T F
xi=lr[i] J<n
K=0
T
i++
Subs+=A[i][j]*lr[j]
F J++
K<=n B
T Tampilkan bahwa
persamaan tidak
Temp=A[i][k] mempunyai lr[i]=(b[i]-subs)/a[i][i]
A[i][k]=A[temp1][k] penyelesaian tunggal i--
A[temp1][k]=Temp
K++
END
#include <stdio.h>
#include <stdlib.h>
main()
{
double **a;
double *b;
double *lr;
double subs;
int n, i, j, temp1;
printf("Masukkan n : ");
scanf("%d", &n);
if(a[n-1][n-1]==0)
goto nosolution;
else
{
printf("\n");
for(i=n-1; i>=0; i--)
{
subs=0;
for(j=i+1; j<n; j++)
subs+=lr[j]*a[i][j];
lr[i]=(b[i]-subs)/a[i][i];
}
nosolution:
printf("\nPersamaan tidak mempunyai penyelesaian tunggal\n");
temp=hasil[i1];
hasil[i1]=hasil[i2];
hasil[i2]=temp;
hasil[i1]=mult*hasil[i1];
hasil[i1]=hasil[i1]+mult*hasil[i2];
if(mult==-1)
printf("Baris ke-%d dikurangi dengan baris ke-%d\n", i1+1,
i2+1);
else if(mult==1)
printf("Baris ke-%d ditambah dengan baris ke-%d\n", i1+1,
i2+1);
else if(mult<0)
printf("Baris ke-%d dikurangi dengan %g kali baris ke-%d\n",
i1+1, -mult, i2+1);
else
printf("Baris ke-%d ditambah dengan %g kali baris ke-%d\n",
i1+1, mult, i2+1);
}
User Guide:
Pada tampilan ini, user harus memasukkan n, yatu jumlah variable
yang akan dicari nilainya.
x1 + 2 x 2 + 3 x 3 = 14
x1 + x 2 + x 3 = 6
x1 + 4 x 2 + 9 x 3 = 34
Didapat penyelesaian x1=0, x2=4, x3=2.
x1 = q1
x2 = q2
x3 = q3
...
xn = q n
Operasi baris elementer yang dilakukan di sini agak lebih rumit daripada
pada Eliminasi Gauss, tetapi keuntungannya, Eliminasi Gauss Jordan tidak
memerlukan perhitungan lagi setelah kita melakukan operasi baris
elementer.
START
B
i=0 F
k<=n
C T
F A[i][k]=A[i][k]/A[i][i]
i<n i=0 K++
Temp1=-1 T
J=i+1 xi=A[i][n]
C
D F
J==i
A
F T
J<n
K=0
T Tampilkan bahwa
persamaan tidak
D
mempunyai
F penyelesaian tunggal
A[j][i]!=0 F
K<=n
T T
END
F
Temp!=-1 A
K=0
F
K<=n B
Temp=A[i][k]
A[i][k]=A[temp1][k]
A[temp1][k]=Temp
K++
User Guide:
Kita akan menguji coba program ini dengan persamaan di bawah ini:
x1 + 2 x 2 + 3 x 3 = 14
x1 + x 2 + x 3 = 6
x1 + 4 x 2 + 9 x 3 = 34
N lnx+tanhx=0 x-4x-2=0
Metode
o Hasil Iterasi Hasil Iterasi
0.589063317478 3.236067977499
1 Tabel 89 136
3627 7894
0.589063317478 3.236067977499
2 Biseksi 55 50
3628 7898
0.589063317478 3.236067977499
3 Regula Falsi 48 68
3627 7902
3.236067977499
Newton 0.589063317478
5 7 78 7
Raphson 3627
98
0.589063317478 0.589063317478
6 Secant 8 11
3627 3627
Kesimpulan yang diperoleh adalah sebagai berikut: Jika fungsi yang akan
diselesaikan dapat dicari turunannya, gunakan metode Newton Rhapson, jika
tidak bisa, gunakan metode Secant, namun jika kedua metode tersebut
menghasilkan iterasi yang divergen, gunakanlah metode biseksi atau regula
falsi karena metode tertutup selalu menghasilkan iterasi yang konvergen.