# Voglio tracciare il grafico delle ore di luce nei giorni del 2011 e del
# 2012 in varie città. Traccio i grafici rilevando le ore di luce ogni
# 30 giorni. Tengo conto che le date corrispondenti sono:
# anno non bisestile (come il 2011), ogni 30 giorni
# 1/1, 31/1, 2/3, 1/4, 1/5, 31/5, 30/6, 30/7, 29/8, 28/9, 28/10, 27/11, 27/12
# (31+28+31+30+31+30+31+31+30+31+30+31)
# anno bisestile (come il 2012), ogni 30 giorni
# 1/1, 31/1, 1/3, 31/3, 30/4, 30/5, 29/6, 29/7, 28/8, 27/9, 27/10, 26/11, 26/12
# (31+29+31+30+31+30+31+31+30+31+30+31)
# Cerco in WolframAlpha le ore di luce a Genova ogni 30 giorni nel 2011 e 2012
# con Genoa,sun,1/1/2011, Geona,sun,31/1/2011,..., Genoa,sun,27/12/2011,
# Genoa,sun,1/1/2012,..., Genoa,sun,26/12/2012, e trovo per i due anni:
# (potrei trovarle anche per gli altri giorni, ma supponiamo che non sia possibile:
# potrei usare anche altre fonti; ad es.: http://www.aopa.it/sole.asp)
LuceGenova <- c(
8+55/60,9+47/60,11+12/60,12+45/60,14+12/60,15+17/60,15+30/60,
14+44/60,13+25/60,11+54/60,10+24/60,9+13/60,8+51/60,
8+54/60,9+47/60,11+11/60,12+44/60,14+12/60,15+16/60,15+30/60,
14+44/60,13+24/60,11+54/60,10+25/60,9+14/60,8+51/60)
# I giorni, in questi due anni, sono;
giorni1 <-seq(1,365,30); giorni2 <- seq(1,366,30)
giorni <- c(giorni1, giorni2+365)
# Il grafico delle ore di luce a Genova usando una spline cubica
# (f.polin. di 3° grado passante per i punti, ivi derivabile fino al 2° ordine)
dev.new(width=6,height=4)
OreLuce <- LuceGenova; plot(giorni,OreLuce)
abline(v=axTicks(1), h=axTicks(2), col="blue",lty=3)
lines(spline(giorni,OreLuce),col="brown")
abline(v=365.5,h=12,lty=2)
# Altra citta', recuperando i dati in modo analogo:
LuceMelbourne <- c(
14+44/60,14+3/60,12+55/60,11+41/60,10+33/60,9+45/60,9+34/60,
10+8/60,11+9/60,12+20/60,13+31/60,14+29/60,14+47/60,
14+44/60,14+3/60,12+55/60,11+42/60,10+34/60,9+45/60,9+34/60,
10+8/60,11+8/60,12+19/60,13+30/60,14+28/60,14+47/60)
OreLuce <- LuceMelbourne; points(giorni,OreLuce)
lines(spline(giorni,OreLuce),col="red")
# Invece che le spline, in una scuola media inferiore avrei potuto usare:
...
lines(giorni,OreLuce,lty=2,col="brown")
...
lines(giorni,OreLuce,lty=2,col="red")
# Stima della durata minima e massima del dì:
min(LuceGenova); max(LuceGenova);min(LuceMelbourne); max(LuceMelbourne)
# 8.85  15.5    9.566667  14.78333
.85*60;.5*60;.566667*60;.78333*60
# 51  30    34.00002  46.9998
# 8 h 51 min; 15 h 30 min; 9 h 34 min; 14 h 47 min
# Vediamo la durata minima e massima del dì a Genova con le spline:
OreLuce <- LuceGenova
min(spline(giorni,OreLuce)$y); max(spline(giorni,OreLuce)$y)
#   8.838997   15.54231
0.838997*60; 0.54231*60
#  50.33982   32.5386
# 8:50 e 15:33 sono le durate minima e massima del dì a Genova
# Volendo calcolare la funzione nei vari giorni posso, invece che
# tracciare solo la spline, esprimerla esplicitamente:
# function(x) splinefun(giorni,OreLuce)(x,n) con n  0, 1 o 2
# è la funzione polinomiale, o la sua derivata 1ª o 2ª
f <- function(x) splinefun(giorni,OreLuce)(x,0)
# Voglio trovare un dì che è durato 12 ore:
k <- function(x) f(x)-12
uniroot(k, c(200, 400))$root
# 269.0581
31+28+31+30+31+30+31+31+26
# 269
# approssimativamente il 26 settembre 2011 il dì è durato 12 ore
# Voglio trovare un dì di durata minima:
g <- function(x) splinefun(giorni,OreLuce)(x,1)
uniroot(g, c(300, 400))$root
# 356.2351
31+28+31+30+31+30+31+31+30+31+30+22
# 356
# Approssimativamente il 22 dicembre 2011 è il dì più breve.
# Il dì è durato:
f(uniroot(g, c(300, 400))$root)
# 8.834599
.834599*60
# 50.07594
# Ritroviamo che è durato 8 h e 50 min
#
# Come segnare i "mesi"
g <- c(31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31)
n <- sum(g)
gg <- NULL; gg[1] <- 0; for(i in 1:24) gg[i+1] <- sum(g[1:i])
dev.new(width=6,height=4)
f <- function(x) splinefun(giorni,LuceGenova)(x,0)
plot(f,0,n,xaxt="n")
abline(v=gg, h=axTicks(2), col="blue",lty=3)
f <- function(x) splinefun(giorni,LuceMelbourne)(x,0)
plot(f,0,n,add=TRUE,col="red")
title(main="2011 e 2012, mese per mese")
abline(v=gg[13],lty=2)
# Col comando seguente otterremmo scritte piu' piccole e non in grassetto 
# title(main=list("2011 e 2012, mese per mese",cex=1,font=1))