source("eigenvalueRanking.R") source("formattedOutput.R") db_games <- readRDS("db_data.Rda") # Seasons s201516_start <- as.Date("2015-08-24") s201516_end <- as.Date("2016-05-14") s201617_start <- as.Date("2016-08-26") s201617_end <- as.Date("2017-05-20") s201718_start <- as.Date("2017-08-18") s201718_end <- as.Date("2018-05-12") s201819_start <- as.Date("2018-08-24") s201829_1half <- as.Date("2018-12-23") s201819_end <- as.Date("2019-05-18") s201920_start <- as.Date("2019-08-16") s201920_1half <- as.Date("2019-12-22") db_201516 <- subset(db_games, Date >= s201516_start & Date <= s201516_end & League == "Bundesliga") db_201617 <- subset(db_games, Date >= s201617_start & Date <= s201617_end & League == "Bundesliga") db_201718 <- subset(db_games, Date >= s201718_start & Date <= s201718_end & League == "Bundesliga") db_201819 <- subset(db_games, Date >= s201819_start & Date <= s201819_end & League == "Bundesliga") db_201819_1half <- subset(db_games, Date >= s201819_start & Date <= s201829_1half & League == "Bundesliga") db_201920_1half <- subset(db_games, Date >= s201920_start & Date <= s201920_1half & League == "Bundesliga") games <- db_201819 games <- na.omit(games) games <- games[order(games$Date),] teams <- as.character(unique(games$HomeTeam)) n <- length(teams) ##### Solve LGS ##### # fill A A <- matrix(-1, nrow = n+1, ncol = n+1) rownames(A) <- c(teams, "mu") colnames(A) <- c(teams, "mu") diag(A) <- n-1 A[n+1,n+1] <- 0 print(A) # fill b S <- generateA(games, type = 1) b <- numeric(n+1) for (i in 1:n) { sum <- 0 if (i > 1) { for (j in 1:(i-1)) { sum <- sum - qnorm((S[j,i]+1)/(S[i,j]+S[j,i]+2)) } } if (i < n) { for (j in (i+1):n) { sum <- sum + qnorm((S[i,j]+1)/(S[i,j]+S[j,i]+2)) } } b[i] <- sum } v <- solve(A,b) printStandings(v[1:n]) lgs_solution <- v ##### Integrate ##### S <- generateA(games, type = 1) h <- 0.01 treshold <- 10^(-10) maxIter <- 10000 v <- rep(1, n + 1) names(v) <- c(teams, "mu") c <- 0 repeat #Euler Verfahren { c <- c + 1 dv <- numeric(n+1) for(k in 1:n) { dv[k] <- n*v[k] - sum(v) if (k > 1) { for (i in 1:(k-1)) { dv[k] <- dv[k] + qnorm((S[i,k]+1)/(S[i,k]+S[k,i]+2)) } } if (k < n) { for (j in (k+1):n) { dv[k] <- dv[k] - qnorm((S[k,j]+1)/(S[k,j]+S[j,k]+2)) } } } dv[n+1] <- sum(v) v_old <- v print(dv) v <- v - h*dv print(paste0("Iterations: ", c, " Error: ", norm(t(v-v_old),'F'))) if (norm(t(v-v_old),'F') < treshold) # Abbruchbedingung! Konvergenz! { print(paste0("Found solution after ", c, " iterations.")) break } if (c > maxIter) { print(paste0("Can't find solution within maxIter = ", maxIter, " iterations.")) break } } print(sum(v[1:n])) print("-----ODE Solution-----") printStandings(v[1:n]) print(sum(v[1:n])) print("-----LGS Solution-----") printStandings(lgs_solution[1:n]) print(sum(lgs_solution[1:n])) print(paste0("Fehler zwischen ODE und LGS: ", sum(v-lgs_solution)))