Дисклеймер: статья скорее больше познавательно-развлекательный, нежели полезный. И тут много картинок
На днях стало интересно увидеть динамику восхода и заката солнца за год, не спрашивайте зачем (просто любопытно). И тут мне открылись очень занимательные наблюдения.
Решил написать небольшую страничку, которая бы брала данные по восходам и закатам с 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/
Добавить комментарий