![]() |
|
|||||
|
||||||
Subject: Re: Calculators
From: Andres Ruiz (aruiz@XXX.XXX)
Date: Wed Sep 01 1999 - 09:54:54 EDT
Here you have two examples for the implementation of celestial algorithms, first for HP28S calculator, and the second written in C language, portable for all the PC's.
With these examples you can see how different are one technique from other, I think that is easier to use a programmable calculator, but the use of a program language on a PC allows you to do good source code, and maintain and change it easier than in a calculator. The messy part is to do the user interface for windows, or other OS. On the other hand, with a PC you can use electronic charts, weather faxes, ... and more and more navigation utilities, the future will be this, the use of a PC on board.
1. For HP28S:
--------------------------------------------------------------------------------
ASTR1
Determinante de la recta de altura tangente punto aproximado.
(j e,d ,P) ê (ae,Z)
MODE DEG
<<
CLLCD
"Navegacion Astronomica" 1 DISP
"Determinante Recta de Altura" 2 DISP
"LAT DECL P en gms" 3 DISP
"ALT(gms) z(º) ?" 4 DISP
HALT
{STO LAT DECL P} MENU HALT
LAT HMS-> ‘LAT’ STO
DECL HMS-> ‘DECL’ STO
P HMS-> ‘P’ STO
‘ASIN(SIN(LAT)*SIN(DECL)+COS(LAT)*COS(DECL)*COS(P)’ EVAL
‘ALT’ STO
‘ACOS((SIN(DECL)-SIN(ALT)*SIN(LAT))/COS(ALT)/COS(LAT))’ EVAL
‘Z’ STO
IF P 0 < THEN
360 Z -
‘Z’ STO
END
LAT ->HMS ‘LAT’ STO
DECL ->HMS ‘DECL’ STO
P ->HMS ‘P’ STO
ALT ->HMS ‘ALT’ STO
23 MENU HALT {LAT DECL P ALT Z} PURGE
>>
2. C Programinig for Pc:
--------------------------------------------------------------------------------
double LHA( double Lon, double GHA )
{
double lha;
lha = GHA+Lon;
if( lha > 360.0 ) lha = lha-360.0;
if( lha < 0.0 ) lha = lha+360.0;
return( lha );
}
double Hc( double Lat, double D, double LHA )
{
double HC;
HC = ASIN( SIN( Lat )*SIN( D )+COS( Lat )*COS( D )*COS( LHA ) );
return( HC );
}
double Azimut( double Lat, double D, double HC, double LHA )
{
double Z;
Z = ACOS( (SIN( D )-SIN( Lat )*SIN( HC ))/(COS( Lat )*COS( HC )) );
if( LHA <= 180.0 ) Z = 360.0-Z;
return( Z );
}
void main(void)
{
double Lat, Lon;
double GHA, D, LHA;
double Z, HC;
double X, G1, G2, SHA, D1, D2;
int body;
int limbo;
fprintf( fpOut, "[0] Estrella \n" );
fprintf( fpOut, "[1] Sol \n" );
fprintf( fpOut, "[2] Luna \n" );
fprintf( fpOut, "[3] Venus/Marte \n" );
fprintf( fpOut, "[4] Jupiter/Saturno \n" );
fprintf( fpOut, "cuerpo celeste = " );
fscanf( fpIn, "%d", &body );
fprintf( fpOut, "\n" );
if( body == 1 || body == 2 ) {
fprintf( fpOut, "Limbo [1]Inferior / [2]Superior: " );
fscanf( fpIn, "%d", &limbo );
}
dato( "Lat [deg] = ", &Lat );
dato( "Lon [deg] = ", &Lon );
dato( "GMT [h] = ", &X );
dato( "GHA en h [deg] = ", &G1 );
dato( "GHA en h+1 [deg] = ", &G2 );
if( G2 < G1 ) G2 = G2+360.0;
GHA = G1+X*(G2-G1);
if( body == 0 ) {
dato( "SHA [deg] = ", &SHA );
GHA = GHA+SHA;
}
while( GHA > 360.0 ) GHA = GHA-360.0;
if( body == 0 ) {
dato( "Declinacion [deg] = ", &D );
}
else {
dato( "Declinacion en h [deg] = ", &D1 );
dato( "Declinacion en h+1 [deg] = ", &D2 );
D = D1+X*(D2-D1);
}
fprintf( fpOut, "\n" );
LHA = AnguloHorarioLocal( Lon, GHA );
HC = Hc( Lat, D, LHA );
Z = Azimut( Lat, D, HC, LHA );
fprintf( fpOut, "LHA [deg] = %lf \n", LHA );
fprintf( fpOut, "\n" );
fprintf( fpOut, "HC [deg] = %lf \n", HC );
fprintf( fpOut, "Azimut [deg] = %lf \n", Z );
fprintf( fpOut, "\n" );
}
3. scientific calculator
--------------------------------------------------------------------------------
Of course is a good idea to have on board a standard calculator for backup, and use the formulas directly;
HC = ASIN( SIN( Lat )*SIN( D )+COS( Lat )*COS( D )*COS( LHA ) );
Z = ACOS( (SIN( D )-SIN( Lat )*SIN( HC ))/(COS( Lat )*COS( HC )) );
Andrés Ruiz
e-mail: aruiz@XXX.XXX
My Navigation page:
http://www.geocities.com/CapeCanaveral/Runway/3568/index.html
|