Вход на сайт
астрономия и програмирование
241
NEW 29.12.06 22:43
Написал прогу для управления телескопом.В простонародье подобные системы называют ГОТО.
Написана на языке С2 под микроконтроллер Ccontrol2 http://www.cc2net.de/Die_C-Control_II/die_c-control_ii.html
Поскольку я отношу себя к программистам-самоучкам( то есть специально на программиста нигде не учился), то ессно многих правил хорошего тона не знаю.
Если у кого есть желание покопаться в исходнике и оценить качество стиля, прошу в прикрепл╦нные файлы.
Написана на языке С2 под микроконтроллер Ccontrol2 http://www.cc2net.de/Die_C-Control_II/die_c-control_ii.html
Поскольку я отношу себя к программистам-самоучкам( то есть специально на программиста нигде не учился), то ессно многих правил хорошего тона не знаю.
Если у кого есть желание покопаться в исходнике и оценить качество стиля, прошу в прикрепл╦нные файлы.
NEW 29.12.06 23:20
в ответ Geist2006 29.12.06 22:46
основной задачей этой штуки является точное наведение телескопа на выбранный объект по заданным координатам.Поскольку координатных систем в астрономии несколько( но для выполнения данной задачи используются две системы- экваториальная и горизонтальная) то системе вначале необходимо преобразовать координаты одной системы в другую.Тут сплошные синусы и косинусы.
Далее от начальной точки контроллер запускает драйвер шаговых движков с редукторами и поочер╦дно( сначала по горизонтали, затем по вертикали) наводит телескоп на объект, после чего переводит движки на зв╦здную скорость.
к контроллеру по шине I2C-BUS приделан пульт с кнопками управления и ЖКИ, на который выводятся координаты( азимут и высота), а также название объекта,склонение и прямое восхождение.Но не все одновременно, а по очереди, так как ЖКИ 2х16.
Начальная точка иначе именуется привязкой к горизонтальной системе.То есть из массива данных выбирается любая видимая в данный момент звезда и е╦ координаты фиксируются как начальная точка . Контроллер принимает радиосигнал из Франкфурта для синхронизации времени, необходимого для расч╦та зв╦здного времени.
К контроллеру ещ╦ приделан автогид- устройство, которое корректирует скорость телескопа по гидирующей звезде.Но поскольку эту часть я позаимствовал у одного астронома-любителя из России, то описание тут приводить не буду.
Припересч╦те координат возникают небольшие неточности, то есть результат отличается от правильного в пределах от практически полного совпадения до разницы в 30 угловых минут.Для астрономии это не совсем приемлемо, поэтому прошу совета- как можно повысить точность, несмотря на то что все переменные имеют размерность float ?
Далее от начальной точки контроллер запускает драйвер шаговых движков с редукторами и поочер╦дно( сначала по горизонтали, затем по вертикали) наводит телескоп на объект, после чего переводит движки на зв╦здную скорость.
к контроллеру по шине I2C-BUS приделан пульт с кнопками управления и ЖКИ, на который выводятся координаты( азимут и высота), а также название объекта,склонение и прямое восхождение.Но не все одновременно, а по очереди, так как ЖКИ 2х16.
Начальная точка иначе именуется привязкой к горизонтальной системе.То есть из массива данных выбирается любая видимая в данный момент звезда и е╦ координаты фиксируются как начальная точка . Контроллер принимает радиосигнал из Франкфурта для синхронизации времени, необходимого для расч╦та зв╦здного времени.
К контроллеру ещ╦ приделан автогид- устройство, которое корректирует скорость телескопа по гидирующей звезде.Но поскольку эту часть я позаимствовал у одного астронома-любителя из России, то описание тут приводить не буду.
Припересч╦те координат возникают небольшие неточности, то есть результат отличается от правильного в пределах от практически полного совпадения до разницы в 30 угловых минут.Для астрономии это не совсем приемлемо, поэтому прошу совета- как можно повысить точность, несмотря на то что все переменные имеют размерность float ?
NEW 29.12.06 23:21
NEW 29.12.06 23:21
NEW 29.12.06 23:22
NEW 29.12.06 23:22
NEW 29.12.06 23:23
NEW 29.12.06 23:23
NEW 03.01.07 21:21
в ответ Geist2006 29.12.06 23:20
Float - 6 значащих цифр, double - 10. Если вы используете все переменные в float, то естественно при каждой операции получается ошибка в расчетах. Например при умножении как результат получается число, которое занимает больше чем n бит. Остальные биты просто не учитываются, а результат умножения записывается в формате float. И так при каждой операции получается ошибка, которая потом все наростает и наростает при последующих.
Чтобы уменьшить значение этой ошибки нужно увеличить разрядность числа. Для этого вам нужно придумать новый формат числа (например 64 бита) и написать функции сложения, вычитания, умножения и деления для этого формата. То есть например, умножаем число в 64 бита на число в 64 бита, как результат получаем число больше 64 бита, но сохраняем его в 64-битном формате. Существуют еще различные методы округления числа, это тоже необходимо учитывать.
Есть определенные форматы, например fract32 и fract64, которые используются в Visual DSP (можно писать на C и Assembler, но в моем случае проект был написан на С) для процессоров звуковых карт. Форматы были сделаны на основе формата integer, описания всех функций есть в руководстве. Если что, пишите в приват.
Чтобы уменьшить значение этой ошибки нужно увеличить разрядность числа. Для этого вам нужно придумать новый формат числа (например 64 бита) и написать функции сложения, вычитания, умножения и деления для этого формата. То есть например, умножаем число в 64 бита на число в 64 бита, как результат получаем число больше 64 бита, но сохраняем его в 64-битном формате. Существуют еще различные методы округления числа, это тоже необходимо учитывать.
Есть определенные форматы, например fract32 и fract64, которые используются в Visual DSP (можно писать на C и Assembler, но в моем случае проект был написан на С) для процессоров звуковых карт. Форматы были сделаны на основе формата integer, описания всех функций есть в руководстве. Если что, пишите в приват.
NEW 04.01.07 08:49
в ответ gothica1982 03.01.07 21:21
Да тут собственно и придумывать ничего не надо- всё уже придумано до нас.
Напр., координаты задаются таким форматом 20╟15.234'. У меня создан массив long с координатой 2015234.Далее, я его преобразую во float
и получаю число 20.15234 . И уже с этим числом произвожу дальнейшие вычисления.
А можно напр. сделать так - создать две переменные одной координаты напр. int 20╟ и float15.234', и затем складывать их в переменную типа float ( интересно, повысит это точность или нет?)
Некоторые сложности возникают из-за того, что первая переменная может быть отрицательной , а вторая только положительной, но и это решается.
Я как -то задумался об этом в самом начале,но почему-то решил пойти по более лёгкому пути и вот результат - недостаточная точность. Теперь придётся пол-программы перепахать.
Напр., координаты задаются таким форматом 20╟15.234'. У меня создан массив long с координатой 2015234.Далее, я его преобразую во float
и получаю число 20.15234 . И уже с этим числом произвожу дальнейшие вычисления.
А можно напр. сделать так - создать две переменные одной координаты напр. int 20╟ и float15.234', и затем складывать их в переменную типа float ( интересно, повысит это точность или нет?)
Некоторые сложности возникают из-за того, что первая переменная может быть отрицательной , а вторая только положительной, но и это решается.
Я как -то задумался об этом в самом начале,но почему-то решил пойти по более лёгкому пути и вот результат - недостаточная точность. Теперь придётся пол-программы перепахать.
04.01.07 12:14
в ответ Chipolino 04.01.07 12:00
дык создать не проблема
только выглядеть это будет прмерно так
type katalog
{
int grad;
float min;
float rest_min;
}
а вот дальше надо подумать как этот type katalog по формулам типа этой раскидать
function Prez_RA(float RA_0,float DEC_0) returns float
{ float ra0,a1,b0,S1;
ra0=var.to_dez(RA_0);//переводим в дес. форму.
b0=var.to_dez(DEC_0);//переводим в дес. форму.
a1=ra0*15.0;//переводим в градусную меру
S1=((3.07420+1.33589*math.sin(a1*constant.rad)*
math.tan(b0*constant.rad))*epocha_J_NOW())/3600.0;//4.
return S1+ra0;//в радианах с дес.дробью. xxx.xxxxxx
}//----------------OK
//#################################################################
только выглядеть это будет прмерно так
type katalog
{
int grad;
float min;
float rest_min;
}
а вот дальше надо подумать как этот type katalog по формулам типа этой раскидать
function Prez_RA(float RA_0,float DEC_0) returns float
{ float ra0,a1,b0,S1;
ra0=var.to_dez(RA_0);//переводим в дес. форму.
b0=var.to_dez(DEC_0);//переводим в дес. форму.
a1=ra0*15.0;//переводим в градусную меру
S1=((3.07420+1.33589*math.sin(a1*constant.rad)*
math.tan(b0*constant.rad))*epocha_J_NOW())/3600.0;//4.
return S1+ra0;//в радианах с дес.дробью. xxx.xxxxxx
}//----------------OK
//#################################################################
NEW 04.01.07 13:45
в ответ Geist2006 04.01.07 12:14
покопался в доках к моему контроллеру и обнаружил следующее -
float Wertbereich- +- 1.7*10^-308......+- 1.7*10^308, Speicherplatzbedarf- 8 Bytes. Тоже самое в доках по Си, только применительно к переменным типа Double. Получается , что мой float - это тоже самое , что ихний Double. Или я не догоняю чего-то?
float Wertbereich- +- 1.7*10^-308......+- 1.7*10^308, Speicherplatzbedarf- 8 Bytes. Тоже самое в доках по Си, только применительно к переменным типа Double. Получается , что мой float - это тоже самое , что ихний Double. Или я не догоняю чего-то?


