Email : sherlytaurinsiri@gmail.com
Instagram : https://www.instagram.com/sherlytaurin
RPubs : https://rpubs.com/sherlytaurin/
Github : https://github.com/sherlytaurin/
Telegram : @Sherlytaurin
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))
}Soal:
Jika Diketahui \(f(0)=1\) menggunakan \(h=0.05\) dan \(n=100\) dengan persamaan differensial \(f'(x,y)=\frac{y}{3x+1}\). Gunakan Metode Heun!
f <- function(x,y){y/(3*x+1)}
n = 100
h = 0.05
x0 = 0
y0 = 1
x = x0
y = y0
heunn <- heun(f,x0,y0,h,n)
heunn## 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
## 11 0.50 1.357823
## 12 0.55 1.384467
## 13 0.60 1.410123
## 14 0.65 1.434877
## 15 0.70 1.458805
## 16 0.75 1.481972
## 17 0.80 1.504436
## 18 0.85 1.526249
## 19 0.90 1.547455
## 20 0.95 1.568094
## 21 1.00 1.588205
## 22 1.05 1.607818
## 23 1.10 1.626964
## 24 1.15 1.645670
## 25 1.20 1.663960
## 26 1.25 1.681856
## 27 1.30 1.699379
## 28 1.35 1.716548
## 29 1.40 1.733380
## 30 1.45 1.749891
## 31 1.50 1.766097
## 32 1.55 1.782010
## 33 1.60 1.797644
## 34 1.65 1.813011
## 35 1.70 1.828121
## 36 1.75 1.842986
## 37 1.80 1.857615
## 38 1.85 1.872016
## 39 1.90 1.886200
## 40 1.95 1.900173
## 41 2.00 1.913944
## 42 2.05 1.927520
## 43 2.10 1.940906
## 44 2.15 1.954111
## 45 2.20 1.967140
## 46 2.25 1.979998
## 47 2.30 1.992691
## 48 2.35 2.005225
## 49 2.40 2.017604
## 50 2.45 2.029832
## 51 2.50 2.041916
## 52 2.55 2.053858
## 53 2.60 2.065662
## 54 2.65 2.077333
## 55 2.70 2.088875
## 56 2.75 2.100290
## 57 2.80 2.111582
## 58 2.85 2.122755
## 59 2.90 2.133812
## 60 2.95 2.144755
## 61 3.00 2.155588
## 62 3.05 2.166313
## 63 3.10 2.176932
## 64 3.15 2.187450
## 65 3.20 2.197866
## 66 3.25 2.208186
## 67 3.30 2.218409
## 68 3.35 2.228539
## 69 3.40 2.238578
## 70 3.45 2.248528
## 71 3.50 2.258390
## 72 3.55 2.268167
## 73 3.60 2.277860
## 74 3.65 2.287472
## 75 3.70 2.297003
## 76 3.75 2.306456
## 77 3.80 2.315833
## 78 3.85 2.325133
## 79 3.90 2.334360
## 80 3.95 2.343515
## 81 4.00 2.352599
## 82 4.05 2.361613
## 83 4.10 2.370558
## 84 4.15 2.379437
## 85 4.20 2.388250
## 86 4.25 2.396999
## 87 4.30 2.405684
## 88 4.35 2.414306
## 89 4.40 2.422868
## 90 4.45 2.431369
## 91 4.50 2.439812
## 92 4.55 2.448196
## 93 4.60 2.456524
## 94 4.65 2.464795
## 95 4.70 2.473011
## 96 4.75 2.481173
## 97 4.80 2.489282
## 98 4.85 2.497338
## 99 4.90 2.505342
## 100 4.95 2.513296
## 101 5.00 2.521199
Soal:
Jika Diketahui \(f(0)=1\) menggunakan \(h=0.05\) dan \(n=100\) dengan persamaan differensial \(f'(x,y)=\frac{y}{3x+1}\). Gunakan Metode Runge-Kutta Orde 4!
library(ggplot2)
library(stats)
f <- function(x,y){y/(3*x+1)}
n = 100
h = 0.05
x0 = 0
y0 = 1
x = x0
y = y0
rk_4 <- rk4(f, x0, y0, h, n)
rk_4## 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
## 11 0.50 1.357209
## 12 0.55 1.383828
## 13 0.60 1.409460
## 14 0.65 1.434193
## 15 0.70 1.458100
## 16 0.75 1.481249
## 17 0.80 1.503695
## 18 0.85 1.525491
## 19 0.90 1.546681
## 20 0.95 1.567306
## 21 1.00 1.587402
## 22 1.05 1.607001
## 23 1.10 1.626134
## 24 1.15 1.644827
## 25 1.20 1.663104
## 26 1.25 1.680988
## 27 1.30 1.698500
## 28 1.35 1.715658
## 29 1.40 1.732479
## 30 1.45 1.748980
## 31 1.50 1.765175
## 32 1.55 1.781078
## 33 1.60 1.796702
## 34 1.65 1.812060
## 35 1.70 1.827161
## 36 1.75 1.842016
## 37 1.80 1.856636
## 38 1.85 1.871029
## 39 1.90 1.885204
## 40 1.95 1.899169
## 41 2.00 1.912932
## 42 2.05 1.926499
## 43 2.10 1.939878
## 44 2.15 1.953075
## 45 2.20 1.966096
## 46 2.25 1.978946
## 47 2.30 1.991632
## 48 2.35 2.004159
## 49 2.40 2.016530
## 50 2.45 2.028752
## 51 2.50 2.040828
## 52 2.55 2.052763
## 53 2.60 2.064561
## 54 2.65 2.076225
## 55 2.70 2.087760
## 56 2.75 2.099169
## 57 2.80 2.110455
## 58 2.85 2.121622
## 59 2.90 2.132672
## 60 2.95 2.143609
## 61 3.00 2.154435
## 62 3.05 2.165154
## 63 3.10 2.175768
## 64 3.15 2.186279
## 65 3.20 2.196690
## 66 3.25 2.207003
## 67 3.30 2.217221
## 68 3.35 2.227345
## 69 3.40 2.237379
## 70 3.45 2.247323
## 71 3.50 2.257179
## 72 3.55 2.266951
## 73 3.60 2.276639
## 74 3.65 2.286245
## 75 3.70 2.295771
## 76 3.75 2.305219
## 77 3.80 2.314590
## 78 3.85 2.323885
## 79 3.90 2.333107
## 80 3.95 2.342257
## 81 4.00 2.351335
## 82 4.05 2.360345
## 83 4.10 2.369285
## 84 4.15 2.378159
## 85 4.20 2.386967
## 86 4.25 2.395711
## 87 4.30 2.404391
## 88 4.35 2.413009
## 89 4.40 2.421566
## 90 4.45 2.430063
## 91 4.50 2.438500
## 92 4.55 2.446880
## 93 4.60 2.455203
## 94 4.65 2.463470
## 95 4.70 2.471681
## 96 4.75 2.479839
## 97 4.80 2.487943
## 98 4.85 2.495994
## 99 4.90 2.503994
## 100 4.95 2.511944
## 101 5.00 2.519843
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)
true## x y
## 1 0.00 1.000000
## 2 0.05 1.072381
## 3 0.10 1.140175
## 4 0.15 1.204159
## 5 0.20 1.264911
## 6 0.25 1.322876
## 7 0.30 1.378405
## 8 0.35 1.431782
## 9 0.40 1.483240
## 10 0.45 1.532971
## 11 0.50 1.581139
## 12 0.55 1.627882
## 13 0.60 1.673320
## 14 0.65 1.717556
## 15 0.70 1.760682
## 16 0.75 1.802776
## 17 0.80 1.843909
## 18 0.85 1.884144
## 19 0.90 1.923538
## 20 0.95 1.962142
## 21 1.00 2.000000
## 22 1.05 2.037155
## 23 1.10 2.073644
## 24 1.15 2.109502
## 25 1.20 2.144761
## 26 1.25 2.179449
## 27 1.30 2.213594
## 28 1.35 2.247221
## 29 1.40 2.280351
## 30 1.45 2.313007
## 31 1.50 2.345208
## 32 1.55 2.376973
## 33 1.60 2.408319
## 34 1.65 2.439262
## 35 1.70 2.469818
## 36 1.75 2.500000
## 37 1.80 2.529822
## 38 1.85 2.559297
## 39 1.90 2.588436
## 40 1.95 2.617250
## 41 2.00 2.645751
## 42 2.05 2.673948
## 43 2.10 2.701851
## 44 2.15 2.729469
## 45 2.20 2.756810
## 46 2.25 2.783882
## 47 2.30 2.810694
## 48 2.35 2.837252
## 49 2.40 2.863564
## 50 2.45 2.889637
## 51 2.50 2.915476
## 52 2.55 2.941088
## 53 2.60 2.966479
## 54 2.65 2.991655
## 55 2.70 3.016621
## 56 2.75 3.041381
## 57 2.80 3.065942
## 58 2.85 3.090307
## 59 2.90 3.114482
## 60 2.95 3.138471
## 61 3.00 3.162278
## 62 3.05 3.185906
## 63 3.10 3.209361
## 64 3.15 3.232646
## 65 3.20 3.255764
## 66 3.25 3.278719
## 67 3.30 3.301515
## 68 3.35 3.324154
## 69 3.40 3.346640
## 70 3.45 3.368976
## 71 3.50 3.391165
## 72 3.55 3.413210
## 73 3.60 3.435113
## 74 3.65 3.456877
## 75 3.70 3.478505
## 76 3.75 3.500000
## 77 3.80 3.521363
## 78 3.85 3.542598
## 79 3.90 3.563706
## 80 3.95 3.584690
## 81 4.00 3.605551
## 82 4.05 3.626293
## 83 4.10 3.646917
## 84 4.15 3.667424
## 85 4.20 3.687818
## 86 4.25 3.708099
## 87 4.30 3.728270
## 88 4.35 3.748333
## 89 4.40 3.768289
## 90 4.45 3.788139
## 91 4.50 3.807887
## 92 4.55 3.827532
## 93 4.60 3.847077
## 94 4.65 3.866523
## 95 4.70 3.885872
## 96 4.75 3.905125
## 97 4.80 3.924283
## 98 4.85 3.943349
## 99 4.90 3.962323
## 100 4.95 3.981206
## 101 5.00 4.000000
data<- data.frame(heunn , rk_4, true)
plot(data$x,data$y, col="red", type="o", cex = 0.6)
par(new = TRUE)
plot(data$x, data$y.1, col="blue", type="o", cex = 0.6)
par(new = TRUE)
plot(data$x, data$y.2, col="green", type="o", cex = 0.6)Dari hasil dapat dilihat dimana:
Warna Hijau = Metode Analitik
Warna Merah = Metode Heun
*Warna Biru = Metode Runge-Kutta orde 4
Bahwa Hasil dari Metode Heun dan Runge-Kutta orde 4 saling mendekati hanya beda sedikit di beberapa titik. Tetapi keduanya memiliki perbedaan yang cukup signifikan dengan Metode Analitik yang bisa dibilang kedua metode tersebut belum memberikan hasil yang tepat untuk persamaan differensial tersebut.