关于12:00对称的时刻的太阳高度角相等,但是太阳方位角不相等,上午太阳方位角从90-180,下午太阳方位角从180-270
import matplotlib.pyplot as plt
import numpy as np
import math
import seaborn as sns
def cal_sin_delta(Day):
return math.sin(2 * math.pi * Day / 365) * math.sin(23.45 * math.pi/180)
def cal_omiga(direction_time):
return math.pi/12 * (direction_time - 12)
def transform_tri(old_data):
return (1 - (old_data ** 2)) ** 0.5
def cal_alpha(Day, ST, phi):
sin_delta = cal_sin_delta(Day)
omiga = cal_omiga(ST)
data = transform_tri(sin_delta) * math.cos(phi) * math.cos(omiga) + sin_delta * math.sin(phi)
if data > 1:
data = 1
elif data < -1:
data = -1
return math.asin(data) * 180 / math.pi
def cal_gamma(Day, ST, phi):
sin_alpha = math.sin(cal_alpha(Day, ST, phi) * math.pi / 180)
sin_delta = cal_sin_delta(Day)
omiga = cal_omiga(ST)
cos_gamma = (sin_delta - (sin_alpha * math.sin(phi))) / (transform_tri(sin_alpha) * math.cos(phi))
if cos_gamma > 1:
cos_gamma = 1
elif cos_gamma < -1:
cos_gamma = -1
if ST <= 12:
data = math.acos(cos_gamma) * 180 / math.pi
elif ST > 12:
data = 360-math.acos(cos_gamma) * 180 / math.pi
return data
# 重新排列months数组以从1月开始
months = [306, 337, 0, 31, 61, 92, 122, 153, 184, 214, 245, 275] # 1月到12月
ST = [9, 10.5, 12, 13.5, 15]
latitude = 37.4 * math.pi / 180
# 计算太阳高度角和方位角
elevations = np.zeros((len(months), len(ST)))
azimuths = np.zeros_like(elevations)
for i, day in enumerate(months):
for j, time in enumerate(ST):
elevation = cal_alpha(day, time, latitude)
azimuth = cal_gamma(day, time, latitude)
print(i + 1, j + 1, elevation, azimuth)
elevations[i, j] = elevation
azimuths[i, j] = azimuth
print(elevations)
print(azimuths)
plt.figure(figsize=(14, 10))
months_labels=['Jan 21', 'Feb 21', 'Mar 21', 'Apr 21', 'May 21', 'Jun 21', 'Jul 21', 'Aug 21', 'Sep 21', 'Oct 21', 'Nov 21', 'Dec 21']
New_time=["12:00", "10:30 and 13:30", "9 :00 and 15:00"]
for j, new_time in enumerate(New_time):
plt.plot(months_labels, elevations[:, j+2], '-o', label=f'{new_time}') # '-o' 创建带有标记的线
plt.title('Solar Elevation Angle on the 21st of Each Month at Different Times (Latitude 37.4°)')
plt.xlabel('Month')
plt.ylabel('Sun Elevation Angle (degrees)')
plt.xticks(rotation=45)
plt.legend(title='Time of Day')
plt.grid(True)
plt.show()
New_time1=["9:00", "10:30", "12:00", "13:30","15:00"]
for j, new_time in enumerate(New_time1):
plt.plot(months_labels, azimuths[:, j], '-o', label=f'{new_time}') # '-o' 创建带有标记的线
plt.title('Solar Azimuth Angle on the 21st of Each Month at Different Times (Latitude 37.4°)')
plt.xlabel('Month')
plt.ylabel('Solar Azimuth Angle (degrees)')
plt.xticks(rotation=45)
plt.legend(title='Time of Day')
plt.grid(True)
plt.show()