# ATMARIANI NOVA LARASATI
# 5003251102
# KOMPUTASI STATISTIKA (D)
# ASSIGNMENT 3 (WEEK 6)


# ============================================================
# TUGAS 3 - KOMPUTASI STATISTIKA
# ============================================================


# ============================================================
# SOAL 1a
# Menghitung nilai eksponensial exp(x) menggunakan deret Maclaurin
# Rumus:
# exp(x) ≈ 1 + x + x^2/2! + x^3/3! + ... + x^n/n!
# Fungsi menerima input x dan n (orde deret)
# ============================================================

# Fungsi faktorial manual
faktorial <- function(n){
  hasil <- 1
  if(n == 0){
    return(1)
  }
  for(i in 1:n){
    hasil <- hasil * i
  }
  return(hasil)
}

# Fungsi exp(x) dengan pendekatan deret Maclaurin
exp_maclaurin <- function(x, n){
  jumlah <- 0
  
  for(i in 0:n){
    suku <- (x^i) / faktorial(i)   # menghitung tiap suku
    jumlah <- jumlah + suku        # menjumlahkan semua suku
  }
  
  return(jumlah)
}

# Contoh perhitungan
hasil_exp <- exp_maclaurin(-1, 5)
print(paste("Hasil exp(-1) orde 5 =", hasil_exp))
## [1] "Hasil exp(-1) orde 5 = 0.366666666666667"
# ============================================================
# SOAL 1b
# Menghitung nilai sin(x) dengan deret Maclaurin
# Rumus:
# sin(x) ≈ x - x^3/3! + x^5/5! - x^7/7! + ...
# Perhitungan berhenti jika nilai suku terakhir < 10^-5
# ============================================================

sin_maclaurin <- function(x){
  jumlah <- 0
  i <- 0
  tanda <- 1
  
  repeat{
    pangkat <- 2*i + 1
    suku <- tanda * (x^pangkat) / faktorial(pangkat)
    
    jumlah <- jumlah + suku
    
    # kondisi berhenti jika suku sangat kecil
    if(abs(suku) < 1e-5){
      break
    }
    
    i <- i + 1
    tanda <- -tanda
  }
  
  return(jumlah)
}

# Contoh perhitungan
hasil_sin <- sin_maclaurin(pi/6)
print(paste("Hasil sin(pi/6) =", hasil_sin))
## [1] "Hasil sin(pi/6) = 0.499999991869023"
# ============================================================
# SOAL 2
# Menghitung Moving Average dengan k = 3
# Rumus:
# Mt(3) = (Yt + Yt-1 + Yt-2) / 3
# ============================================================

moving_average <- function(data, k = 3){
  n <- length(data)
  
  hasil <- rep(NA, n)
  
  for(i in k:n){
    total <- 0
    
    for(j in 0:(k-1)){
      total <- total + data[i - j]
    }
    
    hasil[i] <- total / k
  }
  
  return(hasil)
}

# Data dari soal
data <- c(4.1, 4.9, 6.2, 6.9, 6.8, 4.4, 5.7, 5.8, 6.9, 4.7, 6.0, 4.9)

# Hitung Moving Average
hasil_MA <- moving_average(data, 3)

# Tampilkan hasil
t <- 1:length(data)
output <- data.frame(
  t = t,
  Data = data,
  Mt3 = round(hasil_MA, 2)
)

print(output)
##     t Data  Mt3
## 1   1  4.1   NA
## 2   2  4.9   NA
## 3   3  6.2 5.07
## 4   4  6.9 6.00
## 5   5  6.8 6.63
## 6   6  4.4 6.03
## 7   7  5.7 5.63
## 8   8  5.8 5.30
## 9   9  6.9 6.13
## 10 10  4.7 5.80
## 11 11  6.0 5.87
## 12 12  4.9 5.20