Dosen Pengampu : Prof.Dr. Suhartono M.kom
Jurusan Teknik Informatika
Universitas Islam Negeri Maulana Malik Ibrahim Malang
1. Temukan akar persamaan dari persamaan non-linier f(x) = x^3 - 2x + 2 menggunakan metode terbuka dengan x0 = 0 dan x0 = 1/2 !
Penyelesaian
Cara Manual
turunan pertama dari persamaan tesebut:
f(x)=x^3-2x+2 -> f'(x)=3x^2-2
Tebakan awal yg digunakan adalah x=0
f(x0)=0^3-2*(0)+2=2
f'(x0)=3(0)^2-2=-2
Hitung nilai x baru:
x1=x0-f(x0)/f'(0)=0-2/-2=1
Cara Rstudio
Fungsi root_newton() merupakan fungsi yang dibuat menggunakan algoritma di atas. Fungsi tersebut dituliskan pada sintaks berikut:
root_newton <- function(f, fp, x0, tol=1e-7, N=100){
iter <- 0
xold<-x0
xnew <- xold + 10*tol
while(abs(xnew-xold)>tol){
iter <- iter+1
if(iter>N){
stop("No solutions found")
}
xold<-xnew
xnew <- xold - f(xold)/fp(xold)
}
root<-xnew
return(list(`function`=f, root=root, iter=iter))
}
Berikut adalah sintaks yang digunakan untuk menghitung persamaanya :
root_newton(function(x){x-exp(0^3-2*(0)+2)},
function(x){1+exp(3*(0)^2-2)},
x0=0)
## $`function`
## function(x){x-exp(0^3-2*(0)+2)}
## <bytecode: 0x00000000153bea20>
##
## $root
## [1] 7.389056
##
## $iter
## [1] 10
2.Temukan akar persamaan dari persamaan f(x)=sin(x)/x dengan rentang pencarian x=0.5 dan x=1!
Penyelesaian
Menemukan akar persamaan dari persamaan f(x)=sin(x)/x dengan rentang x=0.5 dan x=1 menggunakan metode uniroot
uniroot(function(x){sin(x)/0.5}, c(-pi,0.5))
## $root
## [1] -5.91174e-06
##
## $f.root
## [1] -1.182348e-05
##
## $iter
## [1] 6
##
## $init.it
## [1] NA
##
## $estim.prec
## [1] 6.103516e-05
uniroot(function(x){sin(x)/1}, c(-pi,1))
## $root
## [1] -6.388828e-08
##
## $f.root
## [1] -6.388828e-08
##
## $iter
## [1] 6
##
## $init.it
## [1] NA
##
## $estim.prec
## [1] 6.103516e-05
Menemukan akar persamaan f(x)=sin(x)/x dengan rentang x=0.5 dan x=1 menggunakan metode root table
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)
}
tabel <- root_table(f=function(x){sin(x)/0.5},
a=-1, b=0, N=10)
tabel
## x fx
## 1 -1.0 -1.6829420
## 2 -0.9 -1.5666538
## 3 -0.8 -1.4347122
## 4 -0.7 -1.2884354
## 5 -0.6 -1.1292849
## 6 -0.5 -0.9588511
## 7 -0.4 -0.7788367
## 8 -0.3 -0.5910404
## 9 -0.2 -0.3973387
## 10 -0.1 -0.1996668
## 11 0.0 0.0000000
3.Hitung integral fungsi f(x)=sin^2(x) pada domain x E[0,phi]!
Penyelesaian
Menggunakan Metode Trapezoidal
untuk membentuk sebuah program yang digunakan untuk menghitung turunan pertama suatu fungsi. Sintaks yang digunakan adalah sebagai berikut:
trapezoid <- function(ftn, a, b, n = 100) {
h <- (b-a)/n
x.vec <- seq(a, b, by = h)
f.vec <- sapply(x.vec, ftn) # ftn(x.vec)
Trap <- h*(f.vec[1]/2 + sum(f.vec[2:n]) + f.vec[n+1]/2)
return(Trap)
}
#sin^2(x) -> sin (2x)
f <- function(x){
sin(x)^2
}
trapezoid(f,0,pi,n = 6)
## [1] 1.570796
plot(f)
Menggunakan Metode findiff
Cara manual
Misalkan x=1 dan nilai h=0.05
Untuk menghitung turunan pertama menggunakan metode selisih tengah,Berikut adalah proses perhitungannya:
f'(1)=f(1+0.05)-f(1-0.05)/2X0.05=0
Cara Rstudio
untuk membentuk sebuah program yang digunakan untuk menghitung turunan pertama suatu fungsi. Sintaks yang digunakan adalah sebagai berikut:
findiff <- function(f, x, h, method=NULL){
if(is.null(method)){
warning("please select a method")
}else{
if(method == "forward"){
return((f(x+h)-f(x))/h)
}else if(method=="backward"){
return((f(x)-f(x-h))/h)
}else if(method=="central"){
return((f(x+h)-f(x-h))/(2*h))
}else{
warning("you can use method: forward, bacward, or central")
}
}
}
Dengan menggunakan fungsi findiff() hasil yang diperoleh adalah sebagai berikut:
findiff(function(x)
exp(-x)*sin(x)^2, x=1, h=0.05,
method="central")
## [1] 0.07416049
tabel
## x fx
## 1 -1.0 -1.6829420
## 2 -0.9 -1.5666538
## 3 -0.8 -1.4347122
## 4 -0.7 -1.2884354
## 5 -0.6 -1.1292849
## 6 -0.5 -0.9588511
## 7 -0.4 -0.7788367
## 8 -0.3 -0.5910404
## 9 -0.2 -0.3973387
## 10 -0.1 -0.1996668
## 11 0.0 0.0000000
plot(tabel)
Referensi :
https://bookdown.org/moh_rosidi2610/Metode_Numerik/rootfinding.html#newtonraphson
https://bookdown.org/moh_rosidi2610/Metode_Numerik/rootfinding.html#uniroot
https://bookdown.org/moh_rosidi2610/Metode_Numerik/diffinteg.html#finitediff