Prodi : Teknik Informatika
Lembaga : UIN Maulana Malik Ibrahim Malang
Persamaan non-linier dapat diartikan sebagai persamaan yang tidak mengandung syarat seperti persamaan linier, sehingga persamaan non-linier dapat merupakan:
Persamaan yang memiliki pangkat selain satu (misal: \(x2\))
Persamaan yang mempunyai produk dua variabel (misal: \(xy\))
Dalam penyelesaian persamaan non-linier diperlukan akar-akar persamaan non-linier, dimana akar sebuah persamaan non-linier \(f(x)=0\) merupakan nilai \(x\) yang menyebabkan nilai \(f(x)\) sama dengan nol. Dalam hal ini dapat disimpulkan bahwa akar-akar penyelesaian persamaan non-linier merupakan titik potong antara kurva \(f(x)\) dengan sumbu \(x\). Ilustrasi penjelasan tersebut ditampilkan pada Gambar 7.1.
Contoh sederhana dari penentuan akar persamaan non-linier adalah penentuan akar persamaan kuadratik. Secara analitik penentuan akar persamaan kuadratik dapat dilakukan menggunakan Persamaan (7.1).
Untuk masalah yang lebih rumit, penyelesaian analitik sudah tidak mungkin dilakukan. Metode numerik dapat digunakan untuk menyelesaikan masalah yang lebih kompleks. Untuk mengetahui apakah suatu persamaan non-linier memiliki akar-akar penyelesaian atau tidak, diperlukan analisa menggunakan Teorema berikut:
Teorema 7.1 (root) Suatu range x=[a,b] mempunyai akar bila f(a) dan f(b) berlawanan tanda atau memenuhi f(a).f(b)<0
Untuk memahami teorema tersebut perhatikan ilustrasi pada Gambar 7.2.
Metode tertutup disebut juga metode bracketing. Disebut sebagai metode tertutup karena dalam pencarian akar-akar persamaan non-linier dilakukan dalam suatu selang \([a,b]\).
Penyelesaian persamaan non-linier menggunakan metode tabel dilakukan dengan membagi persamaan menjadi beberapa area, dimana untuk \(x=[a,b]\) dibagi sebanyak \(N\) bagian dan pada masing-masing bagian dihitung nilai \(f(x)\) sehingga diperoleh nilai \(f(x)\) pada setian \(N\) bagian.
Bila nilai \(f(xk)=0\) atau mendekati nol, dimana \(a≤k≤b\), maka dikatakan bahwa \(xk\) adalah penyelesaian persamaan \(f(x)\). Bila tidak ditemukan, dicari nilai \(4f(xk)\) dan \(f(xk+1)\) yang berlawanan tanda. Bila tidak ditemukan, maka persamaan tersebut dapat dikatakan tidak mempunyai akar untuk rentang \([a,b]\).
Bila akar persamaan tidak ditemukan, maka ada dua kemungkinan untuk menentukan akar persamaan, yaitu:
b. Perlu dicari lagi menggunakan rentang \(x=[xk,xk+1]\).
Secara grafis penyelesaian persamaan non-linier menggunakan metode table disajikan pada Gambar 7.3.
Algoritma Metode Tabel
Definisikan fungsi \(f(x)\)
Tentukan rentang untuk \(x\) yang berupa batas bawah \(a\) dan batas atas \(b\).
Tentukan jumlah pembagi \(N\)
Hitung step pembagi
Bila \(f(x)=0\), maka akarnya \(xk\)
Bila \(f(a)f(b)<0\), maka:
\(f(xk)≤f(xk+1)\), maka akarnya \(xk\)
Bila tida, \(xk+1\) adalah penyelesaian atau dapat dikatakan penyelesaian berada diantara \(xk\) dan \(xk+1\).
Kita dapat membuat suatu fungsi pada R untuk melakukan proses iterasi pada metode Tabel. Fungsi root_table() akan melakukan iterasi berdasarkan step algoritma 1 sampai 5. Berikut adalah sintaks yang digunakan:
root_table <- function(f, a, b, N=20){
h <- abs((a+b)/N)
x <- seq(from=a, to=b, by=h)
fx <- rep(0, N+1)
for(i in 1:(N+1)){
fx[i] <- f(x[i])
}
data <- data.frame(x=x, fx=fx)
return(data)
}
Contoh 7.1 Carilah akar persamaan \(f(x)=x+ex\) pada rentang \(x=[−1,0]\)?
Jawab:
Sebagai permulaan, jumlah pembagi yang digunakan adalah \(N=10\). Dengan menggunakan fungsi root_table() diperoleh hasil yang disajikan pada Tabel 7.1.
tabel <- root_table(f=function(x){x+exp(x)},
a=-1, b=0, N=10)
Berdasarkan Tabel 7.1 diperoleh penyelesaian di antara \(−0,6\) dan \(−0,5\) dengan nilai \(f(x)\) masing-masing sebesar \(−0,0512\) dan \(−0,1065\), sehingga dapat diambil penyelesaian \(x=−0,6\). Kita dapat terus melakukan iterasi sampai memperoleh nilai \(f(x)\) < nilai toleransi dengan terus merubah rentang yang diberikan. Iterasi berikutnya dengan nilai pembagi sama dan rentang nilai \(x=[−0,6;−0,5]\) diperoleh nilai \(x=−0,57\) dan \(f(x)=0,00447\).
Untuk melihat gambaran lokasi akar, kita dapat pulang mengeplotkan data menggunakan fungsi plot. Berikut adalah fungsi yang digunakan:
Untuk mengetahui lokasi akar dengan lebih jelas, kita dapat memperkecil lagi rentang nilai yang dimasukkan dalam fungsi curve().
Metode tabel pada dasarnya memiliki kelemahan yaitu cukup sulit untuk memdapatkan error penyelesaian yang cukup kecil, sehingga metode ini jarang sekali digunakan untuk menyelesaikan persamaan non-linier. Namun, metode ini cukup baik digunakan dalam menentukan area penyelesaian sehingga dapat dijadikan acuan metode lain yang lebih baik.
Prinsip metode bagi dua adalah mengurung akar fungsi pada interval \(x=[a,b]\) atau pada nilai \(x\) batas bawah \(a\) dan batas atas \(b\). Selanjutnya interval tersebut terus menerus dibagi 2 hingga sekecil mungkin, sehingga nilai hampiran yang dicari dapat ditentukan dengan tingkat toleransi tertentu. Untuk lebih memahami metode biseksi, perhatikan visualisasi pada Gambar 7.5.
Metode biseksi merupakan metode yang paling mudah dan paling sederhana dibanding metode lainnya. Adapun sifat metode ini antara lain:
Konvergensi lambat
Caranya mudah
Tidak dapat digunakan untuk mencari akar imaginer
Hanya dapat mencari satu akar pada satu siklus.
Algoritma Metode Biseksi
Definisikan fungsi \(f(x)\)
Tentukan rentang untuk \(x\) yang berupa batas bawah \(a\) dan batas atas \(b\).
Tentukan nilai toleransi \(e\) dan iterasi maksimum \(N\)
Hitung \(f(a)\) dan \(f(b)\)
Hitung:
Hitung \(f(x)\)
Bila \(f(x).f(a)<0\), maka \(b=x\) dan \(f(b)=f(x)\). Bila tidak, \(a=x\) dan \(f(a)=f(x)\)
Bila \(|b−a|<e\) atau iterasi maksimum maka proses dihentikan dan didapatkan akar=\(x\), dan bila tidak ulangi langkah 6.
Jika sudah diperoleh nilai dibawah nilai toleransi, nilai akar selanjutnya dihitung berdasarkan Persamaan (7.5) dengan nilai \(a\) dan \(b\) merupakan nilai baru yang diperoleh dari proses iterasi.
Berdasarkan algoritma tersebut, kita dapat menyusun suatu fungsi pada R yang dapat digunakan untuk melakukan iterasi tersebut. Fungsi root_bisection() merupakan fungsi yang telah penulis susun untuk melakukan iterasi menggunakan metode biseksi. Berikut adalah sintaks dari fungsi tersebut:
root_bisection <- function(f, a, b, tol=1e-7, N=100){
iter <- 0
fa <- f(a)
fb <- f(b)
while(abs(b-a)>tol){
iter <- iter+1
if(iter>N){
warning("iterations maximum exceeded")
break
}
x <- (a+b)/2
fx <- f(x)
if(fa*fx>0){
a <- x
fa <- fx
} else{
b <- x
fb <- fx
}
}
# iterasi nilai x sebagai return value
root <- (a+b)/2
return(list(`function`=f, root=root, iter=iter))
}
Contoh 7.2 Carilah akar persamaan \(f(x)=xe−x+1\) pada rentang \(x=[−1,0]\) dengan nilai toleransi sebesar \(10−7?\)
Jawab:
Langkah pertama dalam penghitungan adalah menghitung nilai \(x\) menggunakan Persamaan (7.5).
Hitung nilai \(f(x)\) dan \(f(a)\).
Berdasarkan hasil perhitungan diperoleh:
Sehingga \(b=x\) dan \(f(b)=f(x)\). Iterasi dilakukan kembali dengan menggunakan nilai bb tersebut.
Untuk mempersingkat waktu iterasi kita akan menggunakan fungsi root_bisection() pada R. Berikut adalah sintaks yang digunakan:
root_bisection(function(x){x*exp(-x)+1},
a=-1, b=0)
## $`function`
## function (x)
## {
## x * exp(-x) + 1
## }
## <bytecode: 0x000000001d62cab0>
##
## $root
## [1] -0.5671
##
## $iter
## [1] 24
Berdasarkan hasil iterasi diperoleh akar persamaan \(x=−2.980232e−08\) dan iterasi yang diperlukan untuk memperolehnya sebanyak \(24\) iterasi.
Metode regula falsi merupakan metode yang menyerupai metode biseksi, dimana iterasi dilakukan dengan terus melakukan pembaharuan rentang untuk memperoleh akar persamaan. Hal yang membedakan metode ini dengan metode biseksi adalah pencarian akar didasarkan pada slope (kemiringan) dan selisih tinggi dari kedua titik rentang. Titik pendekatan pada metode regula-falsi disajikan pada Persamaan (7.6).
Ilustrasi dari metode regula falsi disajikan pada Gambar 7.6.
Algoritma Metode Regula Falsi
Definisikan fungsi \(f(x)\)
Tentukan rentang untuk \(x\) yang berupa batas bawah \(a\) dan batas atas \(b\).
Tentukan nilai toleransi \(e\) dan iterasi maksimum \(N\)
Hitung \(f(a)\) dan \(f(b)\)
Untuk iterasi \(i=1\) s/d \(N\)
Hitung nilai \(x\) berdasarkan Persamaan (7.6)
Hitung \(f(x)\)
Hitung \(error=|f(x)|\)
Jika \(f(x).f(a)<0\), maka \(b=x\) dan \(f(b)=f(x)\). Jika tidak, \(a=x\) dan \(f(a)=f(x)\).
Fungsi root_rf() didasarkan pada langkah-langkah di atas. Sintaks fungsi tersebut adalah sebagai berikut:
root_rf <- function(f, a, b, tol=1e-7, N=100){
iter <- 1
fa <- f(a)
fb <- f(b)
x <- ((fb*a)-(fa*b))/(fb-fa)
fx <- f(x)
while(abs(fx)>tol){
iter <- iter+1
if(iter>N){
warning("iterations maximum exceeded")
break
}
if(fa*fx>0){
a <- x
fa <- fx
} else{
b <- x
fb <- fx
}
x <- (fb*a-fa*b)/(fb-fa)
fx <- f(x)
}
# iterasi nilai x sebagai return value
root <- x
return(list(`function`=f, root=root, iter=iter))
}
Contoh 7.3 Selesaikan persamaan non-linier pada Contoh 7.2 menggunakan metode regula falsi pada rentang \(x=[−1,0]\) dengan nilai toleransi sebesar \(10−7?\)
Jawab:
Langkah pertama penyelesaian dilakukan dengan mencari nilai \(f(a)\) dan \(f(b)\).
Hitung nilai \(x\) dan \(f(x)\).
Berdasarkan hasil perhitungan diperoleh:
Sehingga \(b=x\) dan \(f(b)=f(x)\). Iterasi dilakukan kembali dengan menggunakan nilai \(b\) tersebut.
Untuk mempercepat proses iterasi, kita dapat pula menggunakan fungsi root_rf() pada R. Berikut adalah sintaks yang digunakan:
root_rf(function(x){x*exp(-x)+1},
a=-1, b=0)
## $`function`
## function (x)
## {
## x * exp(-x) + 1
## }
## <bytecode: 0x000000001c7931a8>
##
## $root
## [1] -0.5671
##
## $iter
## [1] 15
Berdasarkan hasil perhitungan diperoleh nilai \(x=−0,5671433\) dan jumlah iterasi yang diperlukan adalah 1515. Jumlah ini lebih sedikit dari jumlah iterasi yang diperlukan pada metode iterasi biseksi yang juga menunjukkan metode ini lebih cepat memperoleh persamaan dibandingkan metode biseksi.
REFERENSI:
https://bookdown.org/moh_rosidi2610/Metode_Numerik/rootfinding.html#bracketing