library(ggplot2)
library(plotly)
library(latticeExtra)
library(dplyr)
f1 <- function(x,y){y/(3*x+1)}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?
# 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)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()
plot1rk4 <- 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()
plot2data <- 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).