Ejercicio de R solucionado!!
Tras nuestra primera clase de R, Óscar nos propuso realizar un ejercicio en el cual debíamos calcular la declinación, la hora del amanecer y, finalmente, la irradiación extra-atmosférica diaria en el plano horizontal. Para ello disponemos de dos datos: el día del año y la latitud.
A continuación mostramos las dos posibles soluciones al ejercicio propuesto que hemos hecho Álvaro Bueno, Alfonso Medal y yo.
Esta es nuestra solución inicial, en la cual realizamos por separado cada función, anidándolas posteriormente.
declinacion=function(dn)23.45*sin(2*pi*(dn+284)/365) ## declinacion en grados
amanecer=function(dn,fi)-acos(-tan(declinacion(dn)*2*pi/360)*tan(fi*2*pi/360))*360/(2*pi) ##amanecer en grados
excentricidad=function(dn)1+0.033*cos(2*pi*dn/365)
radext=function(dn,fi)-24/pi*1367*excentricidad(dn)*(amanecer(dn,fi)*(2*pi/360)*sin(fi*2*pi/360)*sin(declinacion(dn)*2*pi/360)+cos(declinacion(dn)*2*pi/360)*cos(fi*2*pi/360)*sin(amanecer(dn,fi)*(2*pi/360)))
## dentro de la funcion radext convertimos a radianes lo que esta en grados
ejercicio=function(dn,fi){c(declinacion(dn),amanecer(dn,fi),radext(dn,fi))}
ejercicio=function(dn,fi){
data.frame(decl=declinacion(dn),
aman=amanecer(dn,fi),
Bo0=radext(dn,fi))
}
ejercicio(240,40)
## Si, en lugar de para el día 240 del año, queremos saber el resultado para todos los días del año, entonces pondremos:
ejercicio(1:365, 40)
Comentamos esta primera solución con Óscar, y nos recomendó esta solución alternativa, más simplificada, que incluimos a continuación.
d2r <- function(x) pi*x/180 ## de grados a radianes
r2d <- function(x) x*180/pi ## de radianes a grados
declinacion=function(dn)23.45*sin(2*pi*(dn+284)/365) ##declinacion en grados
amanecer=function(dn,fi){
decl=d2r(declinacion(dn))
lat=d2r(fi)
ws=-acos(-tan(decl)*tan(lat))
r2d(ws) ##amanecer en grados
}
excentricidad=function(dn)1+0.033*cos(2*pi*dn/365)
radext=function(dn,fi){
decl=d2r(declinacion(dn))
eo=excentricidad(dn)
ws=d2r(amanecer(dn, fi))
lat=d2r(fi)
-24/pi*1367*eo*(ws*sin(lat)*sin(decl)+cos(decl)*cos(lat)*sin(ws))
}
ejercicio=function(dn,fi){
data.frame(decl=declinacion(dn),
aman=amanecer(dn,fi),
Bo0=radext(dn,fi))
}
ejercicio(240,40)
ejercicio(1:365, 40)