Телескопы покупают здесь


A A A A Автор Тема: Положение Солнца на небе  (Прочитано 39329 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн nopnop

  • Новичок
  • *
  • Сообщений: 6
  • Благодарностей: 0
    • Сообщения от nopnop
Re: Положение Солнца на небе
« Ответ #20 : 23 Июн 2009 [11:15:31] »
Добрый день, Tau.
Подтвердите правильность вычисленной величины M = 357.528 + 35999.05 * T0 + 0.04107 * UT ‘ средняя аномалия. Непонятно каким образом получилось М=164.83..., если среди суммі есть величина 357.528.
Спасибо.

Tau

  • Гость
Re: Положение Солнца на небе
« Ответ #21 : 23 Июн 2009 [11:26:16] »
M = 3764.83032633812 градусов.
Так как градусная мера циклична, то M также равна и 164.83032633812 градусам. Переменная М фигурирует в качестве аргумента тригонометрических функций, поэтому можно и не приводить ее в диапазон от 0 до 360 градусов.  
P.S. Все аргументы используемых синусов и косинусов даны в градусах, так что не забудьте перевести их в радианы, если программные тригонометрические функции требуют аргумнтов в радианах.
« Последнее редактирование: 23 Июн 2009 [11:30:16] от Tau »

Оффлайн nopnop

  • Новичок
  • *
  • Сообщений: 6
  • Благодарностей: 0
    • Сообщения от nopnop
Re: Положение Солнца на небе
« Ответ #22 : 25 Июн 2009 [11:24:21] »
Добрый день, Tau.
Почему-то не получается у меня с вычислением Az. Я подставил Ваши значения в tg (Az) = Sin(Th) * Cos(Dec) * Cos(Lat) / (sin(H) * Sin(Lat) - Sin(Dec))
Результат получается отрицательный, а само значение  Az=atan(Sin(Th) * Cos(Dec) * Cos(Lat) / (sin(H) * Sin(Lat) - Sin(Dec))) равно -1.47127914 радиан. В чем я не прав?

Tau

  • Гость
Re: Положение Солнца на небе
« Ответ #23 : 26 Июн 2009 [05:52:23] »
Азимут измеряется от 0 до 360 градусов (или от -180 до 180, что одно и то же). Простейшая функция арктангенса atan(x), в которой один аргумент, выдает в результате угол от -90 до 90 градусов. Нужно использовать функцию арктангенса, в которой 2 аргумента atan(x,y) :  числитель x и знаменатель y.  Не знаю, на чем вы пишите, но посмотрите внимательнее: эта функция должна быть или встроенная, или в подключаемой математической библиотеке.

И зачем  вы подставляли мои значения? У вас они получились другие? Или вообще не получились?

Оффлайн judge

  • Новичок
  • *
  • Сообщений: 32
  • Благодарностей: 0
  • космос - это загадка
    • Сообщения от judge
Re: Положение Солнца на небе
« Ответ #24 : 26 Июн 2009 [08:31:16] »
равно -1.47127914 радиан.
Если подставить приведенные значения в Градусах то получится где-то -10,53552098,
арктангенс которого дает -84,5779007947, так как круговые функции не однозначны необходио добавить 180 => 95.4220991915847
Я как все, люблю смотреть в небо...

Оффлайн Freddykrug

  • *****
  • Сообщений: 15 565
  • Благодарностей: 403
  • Мечта: остров посреди океана, 300 ночей, > 500 мм.
    • Сообщения от Freddykrug
Re: Положение Солнца на небе
« Ответ #25 : 26 Июн 2009 [08:35:15] »
азимут (A) и высоту (h) любого светила, который занесен в её родной каталог, в любое время и в любом месте на Земле может указать Winstars http://winstars.net/  Есть еще в первой версии. Два клика правой кнопкой мышки - и там указан не только азимут...
Sky-Watcher Dob 8", Celestron Omni XLT 120, БЦП 20х60,  forum.boinc.ru

Tau

  • Гость
Re: Положение Солнца на небе
« Ответ #26 : 26 Июн 2009 [09:14:13] »
Цитата
азимут (A) и высоту (h) любого светила, который занесен в её родной каталог, в любое время и в любом месте на Земле может указать Winstars http://winstars.net/  Есть еще в первой версии. Два клика правой кнопкой мышки - и там указан не только азимут...
Любую программу-планетарий взять и не мучаться :).

to nopnop judge (сорри, не заметила, что еще один собеседник появился)
По какому принципу вы будете добавлять 180 градусов?
Возьмем примерчик: 19 июня, географические координаты те же самые, считаем азимутальные координаты Солнца с шагом в 1 час:
Первый столбец - время
Второй столбец - азимут как арктангенс - функция двух аргументов
Третий столбец - азимут как простой арктангенс
Четвертый столбец - это третий столбец + 180 градусов.
Жирным шрифтом отмечены правильные азимуты (если азимут отрицателен, то +360 градусов и он в нужном диапазоне).

UT      atn(x,y)    atn(x)   atn(x)+180   h
час
00.0    218.27    038.27    218.27 -13.1    
01.0    229.93    049.93    229.93    -05.5
02.0    240.43    060.43    240.43    03.4
03.0    250.14    070.14    250.14    13.3
04.0    259.58    079.58    259.58    23.7
05.0    269.38    089.38    269.38    34.5
06.0    280.54    -079.46    100.54    45.3
07.0    294.94    -065.06    114.94    55.6
08.0    316.34    -043.66    136.34    64.5
09.0    349.71    -010.29    169.71    69.5
10.0    027.87    027.87    207.87    67.8
11.0    055.14    055.14    235.14    60.5
12.0    072.54    072.54    252.54    50.8
13.0    085.07    085.07    265.07    40.2
14.0    095.42    -084.58    095.42    29.3
15.0    104.95    -075.05    104.95    18.7
16.0    114.45    -065.55    114.45    08.4
17.0    124.49    -055.51    124.49    -01.0
18.0    135.50    -044.50    135.50    -09.3
19.0    147.80    -032.20    147.80    -16.0
20.0    161.45    -018.55    161.45    -20.7
21.0    176.09    -003.91    176.09    -22.8
22.0    190.96    010.96     190.96    -22.2
23.0    205.20    025.20     205.20    -18.8
24.0    218.22    038.22     218.22    -13.1    

Систему какую-нибудь видите? :) Если да, то используйте на здоровье простую функцию  арктангенса.
По-моему, это еще в школе изучают: чтобы определить угол на круге (в диапазоне от 0 до 360 градусов), то нужно анализировать знаки синуса и косинуса... Простой арктангенс в половине случаев гасит знаки и результат получается неверный.
« Последнее редактирование: 26 Июн 2009 [09:16:00] от Tau »

Оффлайн nopnop

  • Новичок
  • *
  • Сообщений: 6
  • Благодарностей: 0
    • Сообщения от nopnop
Re: Положение Солнца на небе
« Ответ #27 : 26 Июн 2009 [13:20:46] »
Здравствуйте, Tau.
Я подставил Ваши исходные данные в свою программу, чтобы убедиться, что ход ее выполнения правильный. В результате все вычисленные значения кроме Az совпали. Az же получилось равным -1.47127914 радиан, поэтому я испосил Вас в чем я не прав. При подстановке Ваших же вычисленных данных в формулу вычисления Az и проверке с помощью обычного калькулятора результат тоже -1.47127914 радиан, т.е. не соответствует Вашему. Так в чем же дело?

Оффлайн nopnop

  • Новичок
  • *
  • Сообщений: 6
  • Благодарностей: 0
    • Сообщения от nopnop
Re: Положение Солнца на небе
« Ответ #28 : 26 Июн 2009 [16:40:09] »
Tau, внимательно перечитал все Ваши  замечания по этой теме. Вы рекомендуете использовать функцию арктангенса с двумя аргументами. Если по приведенной Вами формуле вычисления тангенса азимута найти это значение, дальше, как я понимаю, нужно использовать функцию арктангенса, чтобы найти угол. Что будет аргументами x, y в этой функции?
Спасибо.

Tau

  • Гость
Re: Положение Солнца на небе
« Ответ #29 : 26 Июн 2009 [23:30:32] »
tg (Az) = Sin(Th) * Cos(Dec) * Cos(Lat) / (sin(H) * Sin(Lat) - Sin(Dec))
следовательно
x = Sin(Th) * Cos(Dec) * Cos(Lat)   числитель
y =  sin(H) * Sin(Lat) - Sin(Dec)      знаменатель
Вы функцию нашли? В С++ это функция atan2(x,y), например. Так что строка вычисления азимута будет выглядеть как-то так:

Az = atan2(Sin(Th) * Cos(Dec) * Cos(Lat) , sin(H) * Sin(Lat) - Sin(Dec))
« Последнее редактирование: 26 Июн 2009 [23:35:52] от Tau »

Оффлайн judge

  • Новичок
  • *
  • Сообщений: 32
  • Благодарностей: 0
  • космос - это загадка
    • Сообщения от judge
Re: Положение Солнца на небе
« Ответ #30 : 27 Июн 2009 [06:45:05] »
По какому принципу вы будете добавлять 180 градусов?
так как круговые функции не однозначны
Руководствуясь двумя соображениями:
анализировать знаки синуса и косинуса...
смотреть на знак часового угла

Поэтому если расширить вашу таблицу то систему увидеть можно)
Я как все, люблю смотреть в небо...

Оффлайн kikiriki0

  • Новичок
  • *
  • Сообщений: 16
  • Благодарностей: 0
    • Skype - nun_68
    • Сообщения от kikiriki0
Re: Положение Солнца на небе
« Ответ #31 : 25 Июл 2009 [23:14:16] »
Я извиняюсь если вопрос не совсем сюда. просто не знал куда турнуть его.

Пишу на паскале по книге Астрономия с калькулятором. Возникают косяки. Помогите устранить.

program sun;

{$APPTYPE CONSOLE}

uses
  Windows;

type
  Time = type Double;
  TimeB = record
    Day : Byte;
    Mon : Byte;
    Yr  : WORD;
    Hr  : Byte;
    Min : Byte;
    Sec : Byte;
    MS  : WORD;
  end;

type
  PDayTable = ^TDayTable;
  TDayTable = array[1..12] of Word;
 
const
  MonthDays: array [Boolean] of TDayTable =
    ((31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
     (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31));
  HoursPerDay = 24;
  MSecsPerSec = 1000;
  MinsPerDay  = HoursPerDay * 60;
  SecsPerDay  = MinsPerDay  * 60;
  SecPerHour  = 3600;
  MSecsPerDay = SecsPerDay  * MSecsPerSec;
  MSecsPerMin = MSecsPerSec * 60;
  MSecsPerHour= MSecsPerMin * 60;

  JulMonth    = 30.6001;
  JulYear     = 365.25;

  GST_A       = 0.0657098;
  GST_C       = 1.002738;
  GST_D       = 0.997270;
  e_g         = 278.833540;
  w_g         = 282.596403;
  e_          = 0.016718;
  r_0         = 1.495985*100000000;
  t_0         = 0.533128;
  rad         = Pi/180;
  int360      = 360;

//тригонометрические функции взяты из модуля Math

function ArcTan2(const Y, X: Extended): Extended;
asm
        FLD     Y
        FLD     X
        FPATAN
        FWAIT
end;

function Tan(const X: Extended): Extended;
{  Tan := Sin(X) / Cos(X) }
asm
        FLD    X
        FPTAN
        FSTP   ST(0)      { FPTAN pushes 1.0 after result }
        FWAIT
end;

function ArcCos(const X: Extended): Extended;
begin Result := ArcTan2(Sqrt(1 - X * X), X);end;

function ArcSin(const X: Extended): Extended;
begin Result := ArcTan2(X, Sqrt(1 - X * X))end;

function DegToRad(const Degrees: Double): Double;
begin Result := Degrees * rad;end;

function RadToDeg(const Radians: Double): Double;
begin Result := Radians / rad;end;

function IsLeapYear(const Year: Word): Boolean;begin
Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0));end;
//Взято из стандартного модуля SysUtils
function DateToInt(T:TimeB): Time;
var //  $3
  I: Integer;
  DayTable: PDayTable;
begin
  DayTable := @MonthDays[IsLeapYear(T.Yr)];
  if (T.Yr >= 1) and (T.Yr <= 9999) and (T.Mon >= 1) and (T.Mon <= 12) and
    (T.Day >= 1) and (T.Day <= DayTable^[T.Mon]) then
    begin
      Result := T.Day;
      for I := 1 to T.Mon - 1 do
        Result := Result+DayTable^[I];
    end
  else
    Result := -1;
end;

function TimeToDec(const T:TimeB): Time;
begin //  $7
  Result := (((((T.MS/1000)+T.Sec)/60)+T.Min)/60)+T.Hr;
  {Так как функция применяется не только для времени а и для
   перевода градусов то выключил за ненадобностью if T.Hr < 24...
  if (T.Hr < 24) and (T.Min < 60) and (T.Sec < 60) and (T.MS < 1000) then
    Result := (((((T.MS/1000)+T.Sec)/60)+T.Min)/60)+T.Hr
  else
    Result := -1;}
end;

function DecToTime(const T:Time): TimeB;
var //  $8
  m,s:Real;
begin
  with Result do
    begin
      Hr := Trunc(T);
      m := (T-Hr)*60;
      Min := Trunc(m);
      s := (m-Min)*60;
      Sec := Trunc(s);
      MS := Trunc((s-Sec)*1000);
    end;
end;

function TimeToStr(Time:Time):String;
function ziro(S:String):String;begin
  if Length(S)<2then Result:='0'+S
  else Result := S;end;
var
  T:TimeB;
  S:String;
begin
  T := DecToTime(Time);
  Str(T.Hr,S);
  Result := ziro(S)+':';
  Str(T.Min,S);
  Result := Result+ziro(S)+':';
  Str(T.Sec,S);
  Result := Result+ziro(S)+'.';
  Str(T.MS,S);
  Result := Result+ziro(S);
end;

function Jul(const Day,Month:Byte;const Year:Word): Time;
begin
  Result := (1461 * (Year + 4800 + (Month - 14) div 12)) div 4 +
            (367 * (Month - 2 - 12 * ((Month - 14) div 12))) div 12 -
            (3 * ((Year + 4900 + (Month - 14) div 12) div 100)) div 4 +
            Day - 32075.5;//Взято из стандартного модуля DateUtils
end;

function BackTo360(const Val:Time):Time;
begin
  Result := Val;
  while Result >= int360 do
    Result := Result-int360;
  while Result < 0 do
    Result := Result+int360;
end;

function BackTo24(const Val:Time):Time;
begin
  Result := Val;
  while Result >= HoursPerDay do
    Result := Result-HoursPerDay;
  while Result < 0 do
    Result := Result+HoursPerDay;
end;

function GST2GMT(const T:TimeB;const TimeInDec:Time):Time;
function GetGST_B(const Year:WORD):Double;var T,R:Double;begin
  T := (Jul(0,1,Year) - 2415020)/36525;
  R := 6.6460656+T*(2400.051262+0.00002581*T);
  Result := 24-(R-24*(Year-1900));end;
begin //  $13 Гринвическое время!
  Result := BackTo24(DateToInt(T)*GST_A-GetGST_B(T.Yr));
  Result := BackTo24(TimeInDec-Result);
  Result := Result*GST_D;
end;

function LST2GST(const Angle:Time;const East:Boolean;T:Time):Time;
var //  $15
  R : Time;
begin
  R := Angle / 15;
  if East then
    Result := BackTo24(T-R)
  else
    Result := BackTo24(T+R);
end;

procedure  EclipToEquCoords(const YearNow:WORD;
                            Lam,Ba:Time;
                            var Alif,Dal:Time);
function Get_T(const Year:WORD):Time;
  begin Result := (Jul(Year,1,0)-2415020)/36525;end;
function Get_E(const Year:WORD):Time;var T : Time;
  const c : array [1..4] of Double = (23.452294,46.845,0.0059,0.001811);
  begin T := Get_T(Year);Result := c[1]-(T*(c[2]-T*(c[3]+c[4]*T))/3600);end;
var //  $27
  sinD,x,y,E:Double;
begin
  Lam := DegToRad(Lam);
  Ba  := DegToRad(Ba);
  E   := DegToRad(23.441884);//Get_E(YearNow);
  sinD:= Sin(Ba) * Cos(E) +
         Cos(Ba) * Sin(E) * Sin(Lam);
  Dal := RadToDeg(ArcSin(SinD));
  y   := Sin(Lam)* Cos(E) -
         Tan(Ba) * Sin(E);
  x   := Cos(Lam);
  alif:= RadToDeg(ArcTan2{SmartATan}(Y,X))/15;
end;

procedure VoshodZahod__(Alif,Dal,
                        NS:Time;
                        var VosAz,ZahAz,Voshod,Zahod:Time);
var
  H:Time;
begin
  VosAz := RadToDeg(arccos(sin(dal)/cos(NS)));
  ZahAz := 360-VosAz;
  H     := RadToDeg(arccos(-tan(NS)*tan(Dal)))/15;
  Voshod:= BackTo24(HoursPerDay+Alif-H);
  Zahod := BackTo24(Alif+H);
end;

procedure VoshodZahod(const T:TimeB;
                      Alif,Dal,
                      NS,WE:Time;
                      var VosAz,ZahAz,Voshod,Zahod:Time);
begin// $32
  Dal   := DegToRad(Dal);
  NS    := DegToRad(NS);
  VoshodZahod__(Alif,Dal,NS,VosAz,ZahAz,Voshod,Zahod);
  if WE >= 0 then
    begin
      Voshod:= LST2GST(WE,True,Voshod);
      Zahod := LST2GST(WE,True,Zahod);
    end
  else
    begin
      Voshod:= LST2GST(abs(WE),False,Voshod);
      Zahod := LST2GST(abs(WE),False,Zahod);
    end;
  Voshod:= GST2GMT(T,Voshod);
  Zahod := GST2GMT(T,Zahod);
end;


procedure VoshodZahodPlus(const T:TimeB;
                          Ref,Alif,Dal,
                          NS,WE:Time;
                          var VosAz,ZahAz,Voshod,Zahod:Time);
var //  $32
  psi,DeltaA,
  A_r,A_s,
  y,DeltaT,
  LSTr,LSTs : Time;
begin
  //Alif  := DegToRad(Alif);
  Dal   := DegToRad(Dal);
  Ref   := DegToRad(Ref);
  NS    := DegToRad(NS);

  VoshodZahod__(Alif,Dal,NS,A_r,A_s,LSTr,LSTs);

  psi   := arccos(sin(NS)/cos(dal));
  DeltaA:= arcsin(tan(Ref)/tan(psi));
  VosAz := A_r-DeltaA;
  ZahAz := A_s+DeltaA;

  y     := arcsin(sin(Ref)/sin(psi));
  DeltaT:= RadToDeg(240*y/cos(dal))/SecPerHour;

  LSTr  := LSTr - DeltaT;
  LSTs  := LSTs + DeltaT;
  if WE >= 0 then
    begin
      Voshod:= LST2GST(WE,True,LSTr);
      Zahod := LST2GST(WE,True,LSTs);
    end
  else
    begin
      Voshod:= LST2GST(abs(WE),False,LSTr);
      Zahod := LST2GST(abs(WE),False,LSTs);
    end;
  Voshod:= GST2GMT(T,Voshod);
  Zahod := GST2GMT(T,Zahod);
end;

procedure SunCentr(T:TimeB;var Lam,Alif,Dal:Time);

function R2(const M:Time):Time;
const
  eps = 0.0000001;
var
  E,D,DE:Extended;
begin
  E  := M;
  D := E-e_*sin(E)-M;
  while abs(D) > eps do
    begin
      DE := D/(1-(e_*cos(E)));
      E := E-DE;
      D := E-e_*sin(E)-M;
    end;
  Result := E;
end;

var
  D,E,M,N,Tg05N,Atn05N:Time;
begin
  D := Jul(T.Day,T.Mon,T.Yr)-Jul(0,1,1980);
  N := BackTo360(((360/365.2422)*(D)));
  M := BackTo360(N + e_g - w_g);
  E := R2(DegToRad(M));
  tg05N := Sqrt((1+e_)/(1-e_))*Tan(E/2);
  Atn05N := arctan(tg05N);
  N := RadToDeg(2*Atn05N);
  Lam := BackTo360(N+w_g);
  EclipToEquCoords(T.Yr,Lam,0,Alif,Dal);
end;

procedure SunSet( const T:TimeB;
                  const Visota,
                  NS,WE,TimeZone,
                  Dim,Par,Ref : Time;
                  var Voshod,
                  Zahod:Time);
var
  Lam,
  Alif,Dal,
  VosAz,ZahAz,
  STr,STs : Array [1..2] of Time;
  Tr,Ts,
  DalU,psi,x,y,DeltaT: Time;
begin
  SunCentr(T,Lam[1],Alif[1],Dal[1]);
  //косяк 1
  //результаты функции расходятся с книгой на сотые доли
  //поэтому я взял данные полученные авторами из книги
  Lam[2]  := Lam[1]+0.985647;
  EclipToEquCoords(T.Yr,Lam[2],0,Alif[2],Dal[2]);
  VoshodZahod(T,Alif[1],Dal[1],NS,WE,VosAz[1],ZahAz[1],STr[1],STs[1]);
  VoshodZahod(T,Alif[2],Dal[2],NS,WE,VosAz[2],ZahAz[2],STr[2],STs[2]);
  //косяк 2
  //результаты функции по черному расходятся с книгой
  Tr    := (24.07*STr[1]) / (24.07+STr[1]-STr[2]);
  TS    := (24.07*STs[1]) / (24.07+STs[1]-STs[2]);
  DalU  := DegToRad((Dal[1]+Dal[2])/2);
  psi   := arccos(sin(DegToRad(NS))/cos(DalU));
  x     := (Dim/2)+Par+Ref;
  y     := RadToDeg(arcsin(sin(DegToRad(x))/sin(psi)));
  DeltaT:= (240*y/cos(DalU))/SecPerHour;
  Voshod:= Tr-DeltaT+TimeZone;
  Zahod := Ts+DeltaT+TimeZone;

  WriteLn(DeltaT:6:6,#10,
          Tr:6:6,' ',Ts:6:6,#10,
          TimeToStr(Voshod),' ',TimeToStr(Zahod));
end;

var
  T:TimeB;
  Visota,
  NS,WE,V,Z,
  Dim,Par,Ref:Time;
begin
  T.Day := 26;
  T.Mon := 7;
  T.Yr  := 2009;
  T.Hr:=51;T.Min:=30;T.Sec:=00;
  NS := 44.95;//TimeToDec(T);//широта
  WE := 34.1;//долгота
  T.Hr:=00;T.Min:=34;T.Sec:=00;
  Ref := TimeToDec(T);//Рефракция
  T.Hr:=00;T.Min:=00;T.Sec:=8;T.MS:=790;
  Par := TimeToDec(T);//Паралакс
  T.Hr:=00;T.Min:=16;T.Sec:=0;T.MS:=0;
  Dim := 0.533;//TimeToDec(T);//диаметр солнца
  Visota := 0;                       //V [Z] - время восхода [захода]
  SunSet(T,Visota,NS,WE,3,Dim,Par,Ref,V,Z);//смотрите процедуру
  ReadLn;
end.
« Последнее редактирование: 26 Июл 2009 [20:59:37] от kikiriki0 »

Оффлайн Андрей Антонов

  • *****
  • Сообщений: 1 375
  • Благодарностей: 20
  • Горы исполняют желания.
    • Сообщения от Андрей Антонов
    • Я в VK
Re: Положение Солнца на небе
« Ответ #32 : 25 Июл 2009 [23:29:36] »
Я думаю Вам вот сюда - https://astronomy.ru/forum/index.php/topic,24439.0.html
Нижегородский кружок любителей физики и астрономии (НКЛФА, осн.1888 г.)

Оффлайн kikiriki0

  • Новичок
  • *
  • Сообщений: 16
  • Благодарностей: 0
    • Skype - nun_68
    • Сообщения от kikiriki0
Re: Положение Солнца на небе
« Ответ #33 : 25 Июл 2009 [23:53:38] »
Спасибо но мне не совсем туда :)

Оффлайн Андрей Антонов

  • *****
  • Сообщений: 1 375
  • Благодарностей: 20
  • Горы исполняют желания.
    • Сообщения от Андрей Антонов
    • Я в VK
Re: Положение Солнца на небе
« Ответ #34 : 25 Июл 2009 [23:55:54] »
Там тоже люди могут помоч, они ведь тоже подобные программы пишут.
Нижегородский кружок любителей физики и астрономии (НКЛФА, осн.1888 г.)

Оффлайн xd

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: Положение Солнца на небе
« Ответ #35 : 26 Июл 2009 [00:00:30] »
Есть такое понятие, как эфемеридная астрономия. Формулы есть в Астрономическом календаре, постоянная часть, 1981 год, взяты они из книги Абалакина "Основы эфемеридной астрономии" самим автором. Там всё есть.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Tau

  • Гость
Re: Положение Солнца на небе
« Ответ #36 : 26 Июл 2009 [06:52:40] »
Не знала, что на каком-то калькуляторе был прошит Паскаль  ;D.

Пример с 1979 годом уже настораживает. Это переиздание книги? В любом случае алгоритм неоправданно заморочен.  :o
Цитата
//косяк 1
//результаты функции расходятся с книгой на сотые доли
//поэтому я взял данные полученные авторами из книги
У меня по этому алгоритму  тоже получилось расхождение в сотых долях, и хочу вас огорчить - истина чуть в стороне от тех чисел, которые привел автор и от тех чисел, которые вычисляются, тоже в стороне. Косяк тут вряд ли выловишь - грубых ошибок в логике нет, это скорее такое разложение долготы Солнца. Сейчас используют одно, 30 лет назад было другое, а 100 лет назад совсем другое.
В изучении этого кода я дошла до вычисления часового угла и азимута и там уже ошибка более заметна, хотя все равно не превышает градуса. Где там у вас
Цитата
//результаты функции по черному расходятся с книгой
мне неведомо, так как книги у меня нет. И иметь мне ее после такого вот примерчика абсолютно не хочется.

IMHO, не тратьте время на этот код. Требуемую точность вы не получите.
К тому же, вы сами-то заметили, что подменили одну задачу другой? Вам вроде бы нужно было высоту Солнца вычислить в зависимости от времени, а этот код в результате дает время восхода/захода Солнца и азимутальные координаты восхода/захода.

Оффлайн xd

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: Положение Солнца на небе
« Ответ #37 : 26 Июл 2009 [17:39:59] »
Tau: такие "косяки" могут быть просто из-за несогласованности эпох систем координат.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Tau

  • Гость
Re: Положение Солнца на небе
« Ответ #38 : 26 Июл 2009 [18:43:32] »
Deimos, вполне возможно.
Цитата
Формулы есть в Астрономическом календаре, постоянная часть, 1981 год
Не могли бы вы отсканить эти страницы и выложить в эту тему? Для общего развития. У меня Астр.календарь (постоянная часть) 1962-го года издания и там нужных формул нет.
И так как эта тема всплывает на форуме постоянно, то давно пора уже какому-нибудь грамотному эфемериднику расписать тут доступно всю математику. Хотя бы из любви к человечеству. :)

Оффлайн kikiriki0

  • Новичок
  • *
  • Сообщений: 16
  • Благодарностей: 0
    • Skype - nun_68
    • Сообщения от kikiriki0
Re: Положение Солнца на небе
« Ответ #39 : 26 Июл 2009 [20:55:00] »
Мне уже становится страшновато. почему вы думаете что книга 81 года лучше книги 79 года (у нас она издана в 82)?

очень жаль труд, писал три вечера такую бандуру и теперь не хочу выбрасывать. Дописал все таки до конца код. Вроде работает, ошибка расхождения с календарными данными восхода и захода для моего города - не более 1 минуты.

IMHO, не тратьте время на этот код. Требуемую точность вы не получите.
К тому же, вы сами-то заметили, что подменили одну задачу другой? Вам вроде бы нужно было высоту Солнца вычислить в зависимости от времени, а этот код в результате дает время восхода/захода Солнца и азимутальные координаты восхода/захода.

верно подмеченно, но просто я не знаю как и написать такую функцию :(

Поэтому стал делать наработки функций которые впоследствии будут полезны для функции высоты от времени. Так же необходимо узнать и кульминацию.

скачать астрономиеский календарь можно тут:
сайт http://www.astrolib.ru/library/45.html
прямая ссылка http://www.astrolib.ru/files/7/ak-postoyannaya-chast.pdf