太阳高度角和太阳方位角

关于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()

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值