Buatlah program menggunakan bahasa R untuk soal persamaan diferensial berikut, jika diketahui f(0)=1 menggunakan h=0,05 dan n=100! \(f′(x,y) = \dfrac{y}{3x + 1}\)? Gunakan Metode Heun dan Runge-Kutta orde 4! berikan penjelasan?
heun <- function(f, x0, y0, h, n, iter=1){
x <- x0
y <- y0
for(i in 1:n){
ypred0 <- f(x0,y0)
ypred1 <- y0 + h*ypred0
ypred2 <- f(x0+h,ypred1)
ykor <- y0 + h*(ypred0+ypred2)/2
if(iter!=1){
for(i in 1:iter){
ykor <- y0 + h*(ypred0+f(x0+h,ykor))/2
}
}
y0 <- ykor
x0 <- x0 + h
x <- c(x, x0)
y <- c(y, y0)
}
return(data.frame(x=x,y=y))
}
f1 <- function(x,y){y/(3*x+1)}
num_heun <- heun(f1, x0=0, y0=1, h=0.05, n=100)
head(num_heun, 10)## x y
## 1 0.00 1.000000
## 2 0.05 1.047826
## 3 0.10 1.091632
## 4 0.15 1.132170
## 5 0.20 1.169990
## 6 0.25 1.205507
## 7 0.30 1.239044
## 8 0.35 1.270855
## 9 0.40 1.301147
## 10 0.45 1.330090
rk4 <- function(f, x0, y0, h, n){
x <- x0
y <- y0
for(i in 1:n){
k1 <- f(x0,y0)
k2 <- f(x0+0.5*h,y0+0.5*k1*h)
k3 <- f(x0+0.5*h,y0+0.5*k2*h)
k4 <- f(x0+h,y0+k3*h)
y0 <- y0 + (1/6)*(k1+2*k2+2*k3+k4)*h
x0 <- x0 + h
x <- c(x, x0)
y <- c(y, y0)
}
return(data.frame(x=x,y=y))
}
num_rk4 <- rk4(f1, x0=0, y0=1, h=0.05, n=100)
head(num_rk4, 10)## x y
## 1 0.00 1.000000
## 2 0.05 1.047690
## 3 0.10 1.091393
## 4 0.15 1.131851
## 5 0.20 1.169607
## 6 0.25 1.205071
## 7 0.30 1.238563
## 8 0.35 1.270334
## 9 0.40 1.300592
## 10 0.45 1.329503
f2 <- function(x){sqrt(2*x+1)}
x0 <- 0
y0 <- 1
x <- x0
y <- y0
for(i in 1:100){
y0 <- f2(x0+0.05)
x0 <- x0+0.05
x <- c(x, x0)
y <- c(y, y0)
}
num_analitik <- data.frame(x=x, y=y)
head(num_analitik,10)## x y
## 1 0.00 1.000000
## 2 0.05 1.048809
## 3 0.10 1.095445
## 4 0.15 1.140175
## 5 0.20 1.183216
## 6 0.25 1.224745
## 7 0.30 1.264911
## 8 0.35 1.303840
## 9 0.40 1.341641
## 10 0.45 1.378405
data <- data.frame(num_heun$x,num_heun$y,num_rk4$y,num_analitik$y)
plot(data$num_heun.x,data$num_rk4.y,col = "green", type="o", cex=1.5) # rk4
par(new = TRUE)
plot(data$num_heun.x,data$num_analitik.y,col = "red", type="l", cex=1.5) # analitik
par(new=TRUE)
plot(data$num_heun.x,data$num_heun.y,col = "blue") # heunPada plot diatas merupakan penggabungan dari seluruh metode. Grafik warna merah merupakan hasil analitiknya, atau dapat disebut sebagai hasil yang sebenarnya. Terlihat bahwa grafik metode Heun (warna biru) dan grafik metode Runge-Kutta orde 4 (warna hijau) tidak memberikan hasil yang tepat terhadap analitiknya. Namun keduanya memiliki hasil yang identik.