Cálculo de la posición geográfica a partir de la altura de dos astros: Ejecútese la función GPS
Conocidas las alturas sobre el horizonte de dos astros (sabiendo la hora, la ascensión recta y la declinación), se calcula el lugar geométrico de los puntos que satisfacen estas condiciones. Como sólo hay 2 soluciones, con 2 evaluaciones determinamos la situación geogáfica de la observación.
TODAS LAS FUNCIONES SE DEFINEN AL FINAL DEL DOCUMENTO
La función Resultados es una versión sin inputs (la Ascensión Recta se introduce en grados)
Resultados[hor1_,dia1_,mes1_,ascrec1_,dec1_,alt1_,
hor2_,dia2_,mes2_,ascrec2_,dec2_,alt2_]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Ejemplos
GPS
Datos de la primera observación:
Hora = 11h 0m 0s Día = 2 Mes = 3
Asc.Rec. = 4h 0m 0s Dec. = 5° 0' 0'' Alt. = 6° 0' 0''
Datos de la segunda observación:
Hora = 7h 0m 0s Día = 8 Mes = 9
Asc.Rec. = 10h 0m 0s Dec. = 11° 0' 0'' Alt. = 22° 0' 0''
Lat.1 = 72° 41' 53.3538'' Lon.1 = 8° 49' 14.0664''
Lat.2 = -47° 59' 33.0502'' Lon.2 = 19° 24' 17.4701''
Resultados[11,2,3,60,5,6,7,8,9,150,11,22]
Lat.1 = 72° 41' 53.3538'' Lon.1 = 8° 49' 14.0664''
Lat.2 = -47° 59' 33.0502'' Lon.2 = 19° 24' 17.4701''
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Definiciones de funciones auxiliares
(* Se obtienen Grados, minutos y segundos *)
(* a partir de la exprexión decimal en grados *)
GraMinSeg[x_]:=Module[{w,a,b,c,d},
w=Abs[x];
a=Round[Floor[w]];
b=60(w-a);
c=Round[Floor[b]];
d=Chop[60(b-c)];
Print[Sign[x]*a,"° ",c,"' ",d,"''"]]
(* Función auxiliar similar a la anterior *)
GraMinSeg1[x_,y_]:=Module[{w,a,b,c,d,w1,a1,b1,c1,d1},
w=Abs[x];
a=Round[Floor[w]];
b=60(w-a);
c=Round[Floor[b]];
d=Chop[60(b-c)];
w1=Abs[y];
a1=Round[Floor[w1]];
b1=60(w1-a1);
c1=Round[Floor[b1]];
d1=Chop[60(b1-c1)];
Which[And[Sign[x]==-1,a==0,Sign[y]==-1,a1==0],
Print["Lat.1 = ","-0° ",c,"' ",d,"''"," ",
" Lon.1 = ","-0° ",c1,"' ",d1,"''"],
And[Sign[x]==-1,a==0],
Print["Lat.1 = ","-0° ",c,"' ",d,"''"," ",
" Lon.1 = ",Sign[y]a1,"° ",c1,"' ",d1,"''"],
And[Sign[y]==-1,a1==0],
Print["Lat.1 = ",Sign[x]a,"° ",c,"' ",d,"''"," ",
" Lon.1 = ","-0° ",c1,"' ",d1,"''"],
1==1,
Print["Lat.1 = ",Sign[x]a,"° ",c,"' ",d,"''"," ",
" Lon.1 = ",Sign[y]a1,"° ",c1,"' ",d1,"''"]]
]
(* Función auxiliar similar a la anterior *)
GraMinSeg2[x_,y_]:=Module[{w,a,b,c,d,w1,a1,b1,c1,d1},
w=Abs[x];
a=Round[Floor[w]];
b=60(w-a);
c=Round[Floor[b]];
d=Chop[60(b-c)];
w1=Abs[y];
a1=Round[Floor[w1]];
b1=60(w1-a1);
c1=Round[Floor[b1]];
d1=Chop[60(b1-c1)];
Which[And[Sign[x]==-1,a==0,Sign[y]==-1,a1==0],
Print["Lat.2 = ","-0° ",c,"' ",d,"''"," ",
" Lon.2 = ","-0° ",c1,"' ",d1,"''"],
And[Sign[x]==-1,a==0],
Print["Lat.2 = ","-0° ",c,"' ",d,"''"," ",
" Lon.2 = ",Sign[y]a1,"° ",c1,"' ",d1,"''"],
And[Sign[y]==-1,a1==0],
Print["Lat.2 = ",Sign[x]a,"° ",c,"' ",d,"''"," ",
" Lon.2 = ","-0° ",c1,"' ",d1,"''"],
1==1,
Print["Lat.2 = ",Sign[x]a,"° ",c,"' ",d,"''"," ",
" Lon.2 = ",Sign[y]a1,"° ",c1,"' ",d1,"''"]]
]
(* Se obtiene la exprexión decimal en grados *)
(* a partir de Grados, minutos y segundos *)
GraDec[x_,y_,z_]:=Sign[x]*N[Abs[x]+y/60+z/3600]
(* Cálculo de la hora sidérea media de Greenwich, *)
(* con datos del año 2001, a partir del TU *)
(* hor=hora TU, dia= dia, mes=mes *)
HorSidGre[hor_,dia_,mes_]:=Module[{hd,TiempoenDias},
hd=hor/24;
TiempoenDias=Which[mes==1,dia,mes==2,dia+31,mes==3,dia+59,
mes==4,dia+90,mes==5,dia+120,mes==6,dia+151,mes==7,dia+181,
mes==8,dia+212,mes==9,dia+243,mes==10,dia+273,mes==11,dia+304,
mes==12,dia+334]-1+hd;
Mod[6.714315277777778+24*TiempoenDias*1.00273790935,24]
]
(* Cálculo de los coeficientes de las ecuaciones *)
(* a partir de la hora sidérea media de Greenwich, *)
(* y la ascensión recta y *)
(* declinación del astro observado *)
(* ambos en grados decimales *)
Coeficientes[horsid_,ascrec_,dec_]:=Module[{lam,decrad},
lam=Mod[ascrec-15horsid,360]*Pi/180;
decrad=dec*Pi/180;
N[{Cos[decrad]*Cos[lam],Cos[decrad]*Sin[lam],
Sin[decrad]}]]
(* Ecuaciones *)
Solucion[hor1_,dia1_,mes1_,ascrec1_,dec1_,alt1_,
hor2_,dia2_,mes2_,ascrec2_,dec2_,alt2_]:=
Flatten[{x,y,z}/.
Module[
{horsid1,horsid2},Clear[x,y,z];
horsid1=HorSidGre[hor1,dia1,mes1];
horsid2=HorSidGre[hor2,dia2,mes2];
Solve[{
Coeficientes[horsid1,ascrec1,dec1].{x,y,z}-Sin[Pi alt1/180]==0,
Coeficientes[horsid2,ascrec2,dec2].{x,y,z}-Sin[Pi alt2/180]==0,
x^2+y^2+z^2-1==0},{x,y,z}]]]
(* Resultados *)
Resultados[hor1_,dia1_,mes1_,ascrec1_,dec1_,alt1_,
hor2_,dia2_,mes2_,ascrec2_,dec2_,alt2_]:=Module[
{solu,signolon1,signolon2},
solu=Solucion[hor1,dia1,mes1,ascrec1,dec1,alt1,
hor2,dia2,mes2,ascrec2,dec2,alt2];
signolon1=Which[And[solu[[1]]>=0,solu[[2]]>=0],
N[(180/Pi)ArcTan[solu[[2]]/solu[[1]]]],
And[solu[[1]]>=0,solu[[2]]<0],
N[(180/Pi)ArcTan[solu[[2]]/solu[[1]]]],
And[solu[[1]]<0,solu[[2]]>=0],
N[180+(180/Pi)ArcTan[solu[[2]]/solu[[1]]]],
And[solu[[1]]<0,solu[[2]]<0],
N[-180+(180/Pi)ArcTan[solu[[2]]/solu[[1]]]]
];
GraMinSeg1[N[(180/Pi)ArcSin[solu[[3]]]],signolon1];
Print[""];
signolon2=Which[And[solu[[4]]>=0,solu[[5]]>=0],
N[(180/Pi)ArcTan[solu[[5]]/solu[[4]]]],
And[solu[[4]]>=0,solu[[5]]<0],
N[(180/Pi)ArcTan[solu[[5]]/solu[[4]]]],
And[solu[[4]]<0,solu[[5]]>=0],
N[180+(180/Pi)ArcTan[solu[[5]]/solu[[4]]]],
And[solu[[4]]<0,solu[[5]]<0],
N[-180+(180/Pi)ArcTan[solu[[5]]/solu[[4]]]]
];
GraMinSeg2[N[(180/Pi)ArcSin[solu[[6]]]],signolon2]
]
(* Función que ejecuta el cálculo final, pidiendo *)
(* mediante diferentes inputs los datos necesarios *)
GPS:=Module[{hopp,hop,fepp,dip,mep,asrpp,asrp,decpp,decp,
alpp,alp,hoss,hos,fess,dis,mes,asrss,asrs,decss,decs,
alss,als},
hopp=Input["Hora de la primera observación: {H,M,S}"];
hop=GraDec[hopp[[1]],hopp[[2]],hopp[[3]]];
fepp=Input["Fecha de la primera observación: {Dia,Mes}"];
dip=fepp[[1]];
mep=fepp[[2]];
asrpp=Input["Ascensión Recta de la primera observación:
{H,M,S}"];
asrp=15GraDec[asrpp[[1]],asrpp[[2]],asrpp[[3]]];
decpp=Input["Declinación de la primera observación:
{G,M,S}"];
decp=GraDec[decpp[[1]],decpp[[2]],decpp[[3]]];
alpp=Input["Altura de la primera observación:
{G,M,S}"];
alp=GraDec[alpp[[1]],alpp[[2]],alpp[[3]]];
hoss=Input["Hora de la segunda observación: {H,M,S}"];
hos=GraDec[hoss[[1]],hoss[[2]],hoss[[3]]];
fess=Input["Fecha de la segunda observación: {Dia,Mes}"];
dis=fess[[1]];
mes=fess[[2]];
asrss=Input["Ascensión Recta de la segunda observación:
{H,M,S}"];
asrs=15GraDec[asrss[[1]],asrss[[2]],asrss[[3]]];
decss=Input["Declinación de la segunda observación:
{G,M,S}"];
decs=GraDec[decss[[1]],decss[[2]],decss[[3]]];
alss=Input["Altura de la segunda observación:
{G,M,S}"];
als=GraDec[alss[[1]],alss[[2]],alss[[3]]];
Print["Datos de la primera observación:"];Print[" "];
Print["Hora = ",hopp[[1]],"h ",hopp[[2]],"m ",hopp[[3]],"s ",
"Día = ",dip," Mes = ",mep];
Print["Asc.Rec. = ",asrpp[[1]],"h ",asrpp[[2]],"m ",asrpp[[3]],
"s "," Dec. = ",decpp[[1]],"° ",decpp[[2]],"' ",decpp[[3]],"'' ",
" Alt. = ",alpp[[1]],"° ",alpp[[2]],"' ",alpp[[3]],"''"];
Print[" "];
Print["Datos de la segunda observación:"];Print[" "];
Print["Hora = ",hoss[[1]],"h ",hoss[[2]],"m ",hoss[[3]],"s ",
"Día = ",dis," Mes = ",mes];
Print["Asc.Rec. = ",asrss[[1]],"h ",asrss[[2]],"m ",asrss[[3]],
"s "," Dec. = ",decss[[1]],"° ",decss[[2]],"' ",decss[[3]],"'' ",
" Alt. = ",alss[[1]],"° ",alss[[2]],"' ",alss[[3]],"''"];
Print[" "];
Resultados[hop,dip,mep,asrp,decp,alp,
hos,dis,mes,asrs,decs,als]
]
Cálculos reales
GPS
Datos de la primera observación:
Hora = 8h 44m 0s Día = 23 Mes = 9
Asc.Rec. = 12.0258h 0m 0s Dec. = -0.156715° 0' 0'' Alt. =
31.90015691° 0' 0''
Datos de la segunda observación:
Hora = 9h 29m 0s Día = 23 Mes = 9
Asc.Rec. = 12.0278h 0m 0s Dec. = -0.168885° 0' 0'' Alt. =
38.02723072° 0' 0''
Lat.1 = -43° 25' 54.73'' Lon.1 = 3° 35' 39.2389''
Lat.2 = 43° 5' 50.4348'' Lon.2 = 3° 41' 27.2633''
GPS
Datos de la primera observación:
Hora = 19h 12m 0s Día = 9 Mes = 10
Asc.Rec. = 13h 0m 49s Dec. = -4° 47' 58'' Alt. = 1° 50' 26''
Datos de la segunda observación:
Hora = 19h 12m 0s Día = 9 Mes = 10
Asc.Rec. = 19h 31m 22s Dec. = 49° 54' 5'' Alt. = 76° 56' 7''
Lat.1 = 57° 2' 13.1076'' Lon.1 = -32° 8' 36.9924''
Lat.2 = 41° 28' 44.2383'' Lon.2 = -27° 59' 57.8285''