Как я развлекался с восходом солнца

от автора

Дисклеймер: статья скорее больше познавательно-развлекательный, нежели полезный. И тут много картинок

На днях стало интересно увидеть динамику восхода и заката солнца за год, не спрашивайте зачем (просто любопытно). И тут мне открылись очень занимательные наблюдения.

Решил написать небольшую страничку, которая бы брала данные по восходам и закатам с http://open-meteo.com и строила график за несколько лет. Страницу писал не совсем я, использовал ИИ. Но это не главное. Главное это то, что я получил в результате.

График восходов и закатов по координатам Сан-Франциско (ИИ такие подставил)

График восходов и закатов по координатам Сан-Франциско (ИИ такие подставил)

И вот тут мне стало очень интересно. Если приглядеться, то видно что график имеет больше пилообразный вид, чем треугольный (точнее синусоидальный). Т.е. получается в некоторых местах на планете нарастание продолжительности дня и ночи происходит плавнее чем убывание. Пытался придумать почему так происходит, но пока не нашёл нормального объяснения (понятно что это зависит от наклона оси и наклона орбиты земли, но как конкретно не понял). И тут у меня заиграло воображение и я начал экспериментировать.

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

Во-первых, первый график оказался очень забавным. Он оказался не ровным, а с какими-то «холмами». При том очень хорошо видно что с повышением широты график сглаживается.

На втором графике забавно то, что 30° и 40° широты ± очень похожи, но 50° широта отличается очень сильно. График смещён вниз и при этом увеличена амплитуда. Т.е. получается что нарастание и убывание дня в течении года тут происходит быстрее, но рассвет начинается раньше по местному времени.

А третий график очень хорошо показывает полярный день.

Начал строить «зеркальные» графики. Т.е. брал широту с + и с -. Тут чуть меньше интересного. Видно что графики в противофазе (удивительно 🙂 ). Но по первым двум графикам (10° и 20° широты) видно что график южной широты чуть ниже (т.е. рассвет происходит раньше по местному времени) и слегка растянут по оси времени (это значит что изменение длины дня в южном полушарии происходит более резко в течении года).

Третий и четвёртый графики тоже интересные. Видно что «южный» график ± на том же уровне что и график экватора, а северный выше. Т.е. получается что на севере по времени восход происходит позже (не в ≈4 утра, а в ≈6 по местному времени).

А вот график 60 широты оказался почти одинаковым как для южной части земли, так и для северной.

Ещё два графика это разные долготы. Первый график сделан на широте +30° градусов широты, второй на +60° градусов. В целом ничего необычного. Но вот если сравнивать между собой два графика, видно что с повышением широты графики становятся уже и растянутей по оси времени. Собственно это же было видно раньше.

Тут я решил построить графики долгот на +10° широте. Как видно графики практически идентичны (удивительно 🙂 ). Но интересное тут то, что есть графики которые ± совпадают про оси времени. При этом для абсолютно разных долгот. Только два верхних графика (+30° и -70° долготы) стоят особняком, остальные так или иначе совпадают друг с другом по местному времени.

В целом довольно познавательный опыт, наталкивающий на размышления :). Было бы замечательно если бы кто-нибудь из астрономов объяснил всё это, т.к. моей компетенции точно не хватит чтобы всё это разобрать по полочкам.

P.S. Ещё одно уточнение — данные точные, ИИ в них ничего не «испортил» т.к. данные брались с сервиса прогноза погоды (а они обычно точны в плане восходов и закатов). К тому же, весь код, который написал ИИ я перепроверил, так что у меня нет причин сомневаться в этих графиках.

UPD

Решил, на всякий случай выложить код скриптов, т.к. могут возникнуть ряд вопросов.

Код для построения первого графика
<!DOCTYPE html> <html> <head>   <title>Sunrise and Sunset Chart</title>   <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> </head> <body>   <canvas id="sunriseSunsetChart" width="800" height="400"></canvas>    <script>     const ctx = document.getElementById('sunriseSunsetChart').getContext('2d');      // Replace with your desired latitude and longitude     const latitude = 37.7749; // Example: San Francisco     const longitude = -122.4194;      // API parameters     const baseUrl = 'https://api.open-meteo.com/v1/forecast';     const dailyParams = 'sunrise,sunset';     const timezone = 'auto';     const startDate = `2020-01-01`;     const endDate = `2024-12-31`;      // Fetch data from Open-Meteo API     async function fetchSunData() {       const apiUrl = `${baseUrl}?latitude=${latitude}&longitude=${longitude}&daily=${dailyParams}&timezone=${timezone}&start_date=${startDate}&end_date=${endDate}`;       const response = await fetch(apiUrl);       const data = await response.json();        // Extract dates, sunrises, and sunsets       const dates = data.daily.time;       const sunrises = data.daily.sunrise.map(time => new Date(time).getHours() + new Date(time).getMinutes() / 60);       const sunsets = data.daily.sunset.map(time => new Date(time).getHours() + new Date(time).getMinutes() / 60);        createChart(dates, sunrises, sunsets);     }      // Create the chart     function createChart(dates, sunrises, sunsets) {       new Chart(ctx, {         type: 'line',         data: {           labels: dates,           datasets: [             {               label: 'Sunrise',               data: sunrises,               borderColor: 'orange',               backgroundColor: 'rgba(255, 165, 0, 0.2)',               fill: true,             },             {               label: 'Sunset',               data: sunsets,               borderColor: 'purple',               backgroundColor: 'rgba(128, 0, 128, 0.2)',               fill: true,             }           ]         },         options: {           responsive: true,           scales: {             x: {               title: {                 display: true,                 text: 'Date',               },               ticks: {                 maxTicksLimit: 12,                 callback: function(value, index) {                   return dates[index].substring(0, 10); // Show only date part                 }               }             },             y: {               title: {                 display: true,                 text: 'Time (Hours)',               },               ticks: {                 callback: function(value) {                   const hours = Math.floor(value);                   const minutes = Math.round((value - hours) * 60);                   return `${hours}:${minutes.toString().padStart(2, '0')}`;                 }               }             }           }         }       });     }      fetchSunData();   </script> </body> </html> 

Код для построения всех остальных графиков
<!DOCTYPE html> <html> <head>   <title>Sunrise Chart</title>   <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> </head> <body>   <canvas id="sunriseChart" width="800" height="400"></canvas>    <script>     const ctx = document.getElementById('sunriseChart').getContext('2d');      // Array of coordinates (latitude and longitude)     const coordinates = [       // { latitude: 80, longitude: 0, label: 'latitude — 80' },       // { latitude: 70, longitude: 0, label: 'latitude — 70' },       // { latitude: 60, longitude: 0, label: 'latitude — 60' },       // { latitude: 50, longitude: 0, label: 'latitude — 50' },       // { latitude: 40, longitude: 0, label: 'latitude — 40' },       // { latitude: 30, longitude: 0, label: 'latitude — 30' },       // { latitude: 20, longitude: 0, label: 'latitude — 20' },       { latitude: 10, longitude: 0, label: 'latitude — 10' },       { latitude: 0, longitude: 0, label: 'latitude — 0' },       { latitude: -10, longitude: 0, label: 'latitude — -10' },       // { latitude: -20, longitude: 0, label: 'latitude — -20' },       // { latitude: -30, longitude: 0, label: 'latitude — -30' },       // { latitude: -40, longitude: 0, label: 'latitude — -40' },       // { latitude: -50, longitude: 0, label: 'latitude — -50' },       // { latitude: -60, longitude: 0, label: 'latitude — -60' },       // { latitude: -70, longitude: 0, label: 'latitude — -70' },       // { latitude: -80, longitude: 0, label: 'latitude — -80' },     ];      // API parameters     const baseUrl = 'https://api.open-meteo.com/v1/forecast';     const dailyParams = 'sunrise';     const timezone = 'auto';     const startDate = `2020-01-01`;     const endDate = `2024-12-31`;      async function fetchSunriseData() {       const datasets = [];        for (const coord of coordinates) {         const apiUrl = `${baseUrl}?latitude=${coord.latitude}&longitude=${coord.longitude}&daily=${dailyParams}&timezone=${timezone}&start_date=${startDate}&end_date=${endDate}`;         const response = await fetch(apiUrl);         const data = await response.json();          // Extract dates and sunrises         const dates = data.daily.time;         const sunrises = data.daily.sunrise.map(time => new Date(time).getHours() + new Date(time).getMinutes() / 60);          datasets.push({           label: `${coord.label}`,           data: sunrises,           borderColor: getRandomColor(),           backgroundColor: 'rgba(0, 0, 0, 0)',           fill: false,         });          if (!window.chartLabels) {           window.chartLabels = dates;         }       }        createChart(window.chartLabels, datasets);     }      // Create the chart     function createChart(dates, datasets) {       new Chart(ctx, {         type: 'line',         data: {           labels: dates,           datasets: datasets         },         options: {           responsive: true,           scales: {             x: {               title: {                 display: true,                 text: 'Date',               },               ticks: {                 maxTicksLimit: 12,                 callback: function(value, index) {                   return dates[index].substring(0, 10); // Show only date part                 }               }             },             y: {               title: {                 display: true,                 text: 'Time (Hours)',               },               ticks: {                 callback: function(value) {                   const hours = Math.floor(value);                   const minutes = Math.round((value - hours) * 60);                   return `${hours}:${minutes.toString().padStart(2, '0')}`;                 }               }             }           }         }       });     }      // Generate a random color for each dataset     function getRandomColor() {       const letters = '0123456789ABCDEF';       let color = '#';       for (let i = 0; i < 6; i++) {         color += letters[Math.floor(Math.random() * 16)];       }       return color;     }      fetchSunriseData();   </script> </body> </html> 

Ещё раз уточню что код был сделан за пару минут с помощью ChatGPT и немного поправлен. Код максимально простой, в нём нет сложных формул, в нём нет кучи данных (точнее есть, но не в зашитом виде). Он не претендует на хоть сколько-нибудь серьёзные изыскания.

Не стоит воспринимать эту статью серьёзно. Это просто способ поделится интересными наблюдениями (возможно кого-то заинтересовать) и услышать ответы на некоторые вопросы от людей, которые лучше разбираются в астрономии и астрофизике.


ссылка на оригинал статьи https://habr.com/ru/articles/874520/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *