这一个matlab程序,计算某一经纬度某一天的太阳高度角和太阳方位角,并把计算结果写入excel文件
时间: 2024-03-06 14:47:57 浏览: 80
这里提供一个matlab程序,计算某一经纬度某一天的太阳高度角和太阳方位角,并把计算结果写入excel文件。程序如下:
```matlab
clear;
clc;
%% 参数设置
lat = 39.9; % 纬度,单位:度
lon = 116.3; % 经度,单位:度
time_zone = 8; % 时区,单位:小时
date = '2021-07-01'; % 日期,格式为'yyyy-mm-dd'
time_start = '05:00:00'; % 起始时间,格式为'hh:mm:ss'
time_end = '18:00:00'; % 结束时间,格式为'hh:mm:ss'
time_step = 60; % 时间步长,单位:秒
%% 计算
time_seq = datetime(date + " " + time_start, 'InputFormat', 'yyyy-MM-dd HH:mm:ss'):seconds(time_step):datetime(date + " " + time_end, 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); % 生成时间序列
N = length(time_seq); % 时间序列长度
h = zeros(N, 1); % 太阳高度角序列
az = zeros(N, 1); % 太阳方位角序列
for i = 1:N
[h(i), az(i)] = SolarPosition(time_seq(i), lat, lon, time_zone);
end
%% 输出到Excel文件
filename = 'solar_position.xlsx'; % Excel文件名
sheet = 1; % 工作表编号
xlswrite(filename, [{'时间', '太阳高度角', '太阳方位角'}; datestr(time_seq, 'yyyy-mm-dd HH:MM:SS'), num2cell(h), num2cell(az)], sheet); % 写入Excel文件
%% 输出结果
fprintf('计算结果已写入Excel文件%s,工作表%d\n', filename, sheet);
fprintf('时间\t\t\t太阳高度角\t太阳方位角\n');
for i = 1:N
fprintf('%s\t%.2f\t\t%.2f\n', datestr(time_seq(i), 'yyyy-mm-dd HH:MM:SS'), h(i), az(i));
end
```
该程序使用了SolarPosition函数,需要先下载并添加到matlab的工作目录中。SolarPosition函数的代码如下:
```matlab
function [h, az] = SolarPosition(time, lat, lon, time_zone)
% SolarPosition 获取指定时间、地点的太阳高度角和太阳方位角
% 输入参数:
% time - 时间,matlab的datetime类型
% lat - 地点纬度,单位:度
% lon - 地点经度,单位:度
% time_zone - 时区,单位:小时
% 输出参数:
% h - 太阳高度角,单位:度
% az - 太阳方位角,单位:度
%% 参数设置
T = (time.Year - 2000) * 365 + fix((time.Year - 2000) / 4) + fix((time.Month - 1) * 30.6 + 0.5) + time.Day - 1; % 离2000年1月1日的天数
UT = (time.Hour + time.Minute / 60 + time.Second / 3600) - time_zone; % 本地真太阳时,单位:小时
L = 15 * lon; % 本地经度
B = lat; % 本地纬度
D = T - 1 + UT / 24; % 儒略日数
JD = D + 2451545; % 儒略日数
%% 计算
% 计算黄赤交角
T0 = D / 36525;
eps = (23.439291 - 0.0130042 * T0 - 1.64e-7 * T0^2 + 5.04e-7 * T0^3) * pi / 180;
% 计算太阳直角坐标系位置
T0 = (JD - 2451545) / 36525;
L0 = 280.46645 + 36000.76983 * T0 + 0.0003032 * T0^2;
M = 357.52910 + 35999.05030 * T0 - 0.0001559 * T0^2 - 0.00000048 * T0^3;
e = 0.016708617 - 0.000042037 * T0 - 0.0000001236 * T0^2;
C = (1.914600 - 0.004817 * T0 - 0.000014 * T0^2) * sin(M) + (0.019993 - 0.000101 * T0) * sin(2 * M) + 0.000290 * sin(3 * M);
sun_lon = L0 + C;
sun_r = (1.000001018 * (1 - e^2)) ./ (1 + e * cos(M));
sun_x = sun_r * cos(sun_lon);
sun_y = sun_r * sin(sun_lon);
sun_z = 0;
% 计算地球直角坐标系位置
N = 125.04 - 1934.136 * T0;
L = L * pi / 180;
B = B * pi / 180;
x = cos(B) * cos(L);
y = cos(B) * sin(L);
z = sin(B);
x0 = x;
y0 = y * cos(eps) - z * sin(eps);
z0 = y * sin(eps) + z * cos(eps);
% 计算太阳高度角和太阳方位角
xs = sun_x - x0;
ys = sun_y - y0;
zs = sun_z - z0;
r = sqrt(xs^2 + ys^2 + zs^2);
h = asin(zs / r) * 180 / pi;
az = atan2(xs, ys) * 180 / pi;
% 转换为0-360度范围
if az < 0
az = az + 360;
end
```
使用该程序可以得到指定时间、地点的太阳高度角和太阳方位角的计算结果,并且可以将计算结果输出到Excel文件中。
阅读全文