--------------------------------------------
  # Student: Nate Fox | 2311568
  # Module: Statistical Programming (ADDB5021)
  # Assessment: Data Manipulation 
  # Month: November 2025
  # File: pell.r
--------------------------------------------
  
options(scipen=999) # Turns off scientific notation

# Task 1: Question 1

N<-200 # No. of terms
n<-1:N # Vector
Fibonacci<-numeric(N)
Pell<-numeric(N)

# Base Cases
Fibonacci[1]<-0
Fibonacci[2]<-1
Pell[1]<-0
Pell[2]<-1

# Generate sequences
for(i in 3:N) {
  Fibonacci[i]<-Fibonacci[i-1]+Fibonacci[i-2]
  Pell[i]<-2*Pell[i-1]+Pell[i-2]
}

# Generating the 3 column table
pelldata<-data.frame(
  n=n,
  Fibonacci=Fibonacci,Pell=Pell
)

# Checking to see if it worked
head(pelldata[, c("n","Fibonacci","Pell")],10)

# Task 1: Question 2

Approximation<-numeric(N)
Approximation[1]<-NA
Approximation[2]<-NA
Approximation[3]<-Pell[3]/Pell[2]

for(i in 4:N){
  Approximation[i]<-2+1/Approximation[i-1]
}

# Generating the additional column
pelldata$Approximation<-Approximation

# Checking to ensure it's worked
head(pelldata[,c("n","Fibonacci","Pell","Approximation")], 10)

# Task 1: Question 3

# Calculate sqrt(2)
true_value<-sqrt(2)

ApproxSqrt2<-pelldata$Approximation-1 # converting the approx into est of sqrt(2)

Difference<-numeric(N) # New vector

for(i in 1:N){
  Difference[i]<-ApproxSqrt2[i]-true_value
}

pelldata$ApproxSqrt2<-ApproxSqrt2

# Rounding results to 5 decimal places
Difference<-round(Difference, 5)

# Adding the additional column
pelldata$Difference<-Difference

# Checking to ensure it's worked
head(pelldata[,c("n","Fibonacci","Pell","Approximation","ApproxSqrt2","Difference")], 10)

# Task 1: Question 4

AccuracyDP<-numeric(N) # Creating empty vector to store accuracy

for (i in 1:N){
  err <- abs(pelldata$ApproxSqrt2[i] - true_value) # Calculating the absolute error for this term
  if (is.na(err)){
    AccuracyDP[i] <- NA
  } else {
    decimalplaces <- floor(-log10(2 * err)) # decimalplaces stores the accurate decimal places for each approximation term 
    if (decimalplaces < 0) decimalplaces <- 0
    AccuracyDP[i] <- decimalplaces
  }
}

pelldata$AccuracyDP <- AccuracyDP

head(pelldata[,c("n","Fibonacci","Pell","Approximation","ApproxSqrt2","Difference","AccuracyDP")], 10)
