library(ggplot2)
library(plotly)
library(latticeExtra)
library(dplyr)

f1 <- function(x,y){y/(3*x+1)}

1 Soal

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)=\frac{y}{(3x + 1)}\) Gunakan Metode Heun dan Runge-Kutta orde 4! berikan penjelasan?

1.1 Metode Analitik

# metode analitik
f2 <- function(x){sqrt(3*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)
}
true <- data.frame(x=x, y=y)

1.2 Metode Heun

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))
}

num1 <- heun(f1, x0=0, y0=1, h=0.05, n=100)


plot1 <- num1 %>% ggplot() + aes(x = x, y = y) + geom_line()
plot1

1.3 Metode Runge-Kutta Orde 4

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))
}

num2 <- rk4(f1, x0=0, y0=1, h=0.05, n=100)
plot2 <- num2 %>% ggplot() + aes(x = x, y = y) + geom_line()
plot2

2 Kesimpulan

data <- data.frame(num1$x, num1$y, num2$y, true$y)

plot(data$num1.x,data$num1.y, col="red", type="o", cex=0.5)
par(new=TRUE)
plot(data$num1.x,data$num2.y, col="blue", type="o", cex=0.5)
par(new=TRUE)
plot(data$num1.x,data$true.y, col="purple", type="o", cex=0.5)

Pada plot diatas, Warna ungu merupakah hasil dari metode analitik (nilai sebenarnya), merah merupakan nilai dari Metode Heun dan biru merupakan nilai dari Metode Runge-Kutta Orde 4, dapat dilihat dengan jelas bahwa metode Heun dan Runge-Kutta Orde 4 tidak memberikan hasil yang cukup tepat, namun keduanya memiliki nilai yang mirip (terdapat perbedaan sedikit pada lingkaran yang terlihat warna merah).