Dosen Pengampu : Prof. Dr. Suhartono, M.Kom
Lembaga : Universitas Islam Negeri Maulana Malik Ibrahim Malang
Jurusan : Teknik Informatika
Fakultas : Sains dan Teknologi
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()=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.
penentuan akar persamaan dengan metode tertutup
penentuan akar persamaan dengan metode terbuka
fungsi-fungsi R untuk mementukan akar persamaan non-linier
studi kasus
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 danpada masing-masing bagian dihitung nilai f(x) sehingga diperoleh nilai f(x) pada setian N bagian.
Bila nilai f(k)=0 atau mendekati nol, dimana a≤k≤b , maka dikatakan bahwa xk adalah penyelesaian persamaan f(x) . Bila tidak ditemukan, dicari nilai f(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:
Akar persamaan ditentukan oleh nilai mana yang lebih dekat. Bila f(xk≤f(xk+1) , maka akarnya xk . Bila f(xk+1) f(xk) , maka akarnya xk+1 .
Perlu dicari lagi menggunakan rentang x=[xk,x+1]
Secara grafis penyelesaian persamaan non-linier menggunakan metode table disajikan pada Gambar 7.3.
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)
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.
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))
}
root_bisection(function(x){x*exp(-x)+1},
a=-1, b=0)
## $`function`
## function(x){x*exp(-x)+1}
## <bytecode: 0x0000000015cc2938>
##
## $root
## [1] -0.5671433
##
## $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).
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, =x dan f(a=f(x)
Akar persamaan adalah 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))
}
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 15 . 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.
https://bookdown.org/moh_rosidi2610/Metode_Numerik/rootfinding.html#uniroot
https://bookdown.org/moh_rosidi2610/Metode_Numerik/rootfinding.html#bracketing
https://bookdown.org/moh_rosidi2610/Metode_Numerik/rootfinding.html#table
https://bookdown.org/moh_rosidi2610/Metode_Numerik/rootfinding.html#bisection
https://bookdown.org/moh_rosidi2610/Metode_Numerik/rootfinding.html#regulafalsi