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''


Converted by Mathematica      March 1, 2002