前言:在学习用C++计算地球某点的太阳高度角的过程中,查阅了各类资料,但内容繁杂,下面对其进行总结整理,希望可以帮到学习卫星的同学和朋友们。
太阳高度角的计算有以下公式:
上式中h为太阳高度角,为某目标点的地理纬度,
为太阳赤纬,t为时角。
基本步骤如下:
①输入已知目标点的地理纬度和经度
②计算太阳赤纬
③计算时角t
接下来按以上步骤进行计算,以下是我的计算思路:
①输入目标点的地理纬度和经度
cout << "请输入当地经度:" << endl;
double Longitude_position;
cin >> Longitude_position;
cout << "请输入当地纬度:" << endl;
double Latitude_position;
cin >> Latitude_position;
②计算太阳赤纬
一年内任何一天的赤纬角可以用如下公式计算:
在上式中,N为年积日,为从每年的一月一日算起,当天是第几天。故此时我们还需要计算年积日N。
年积日可以如下面公式计算:
double N = floor(month*275.0/9.0)-floor((month+9)/12.0)*(floor((year-4*floor(year/4.0)+2)/3.0)+1)+day-30;
因此我们还需要输入当时时刻的日期:
cout << "请输入年月日:" << endl;
int year,month,day;
cin >> year;cin >> month;cin >> day;
计算年积日N后将其带入赤纬的计算公式即可计算出太阳赤纬。计算太阳赤纬的函数如下:
//采用简便方法计算
//计算太阳赤纬
double Solar_declination(int year,int month,int day)
{
double N = floor(month*275.0/9.0)-floor((month+9)/12.0)*(floor((year-4*floor(year/4.0)+2)/3.0)+1)+day-30;
cout << "年积日N:" << N << endl;
double Theta;
double a;
a=0.98563*(N-173)*pi/180;//转弧度
double Theta_1=asin(0.39795*cos(a));//弧度
cout << "粗略太阳赤纬" << Theta_1*180/pi << endl;
//计算赤纬的第二种方法
//double B = 2*pi*(N-1)*365*pi/180;//弧度
//Theta = 0.006918-0.399912*cos(B)+0.070257*sin(B)-0.006758*cos(2*B)+0.000907*sin(2*B)-0.002697*cos(3*B)+0.00148*sin(3*B);//弧度
//cout << "精确太阳赤纬" << Theta*180/pi << endl;
return Theta_1;
}
③计算时角t
注:在以下计算中我们都把时间单位化成小时,以便于计算。
时角t可以由如下公式计算得到(单位为度):
时角的解释如下:
上式中ST为真太阳时,以24小时计。因此此时我们需要先计算出真太阳时ST。
ST的计算如下所示:
上式中date为北京时间时分秒,A为经度时差,X为真太阳时差。
date的计算:
首先,需要输入此时北京时间:
cout << "请输入北京时间(时 分 秒):" << endl;
double H_beijing,M_beijing,S_beijing;
cin >> H_beijing;cin >> M_beijing;cin >> S_beijing;//输入北京时间的时分秒
为方便计算,将北京时间时分秒统一单位为时:
//将时间都转换为以时为单位
double minute_hour = minute/60;//以时为单位的分
double second_hour = second/3600;//以时为单位的秒
double hour_1 = hour + minute_hour + second_hour;
经度时差A的计算:
A为当地时间与北京时间的时间差,可以表示为:
上式A单位为分钟,因此需要将其转换为以时为单位。
具体计算A的代码如下:
double A = 4.0 * (120-Longitude_position);//以分钟为单位
double A_hour = A/60.0;//以时为单位
真太阳时差X的计算:
真太阳时差X一般是通过查真太阳时差表获得,但是这不利于我们的代码实现,因此我们利用近似的公式:
其中:
上式B_1以弧度表示,N为年积日。
因此,综上所述,计算太阳时ST的代码如下:
/*
真太阳时的计算
真太阳时=北京时间-A+X
其中:
A为当地时间与北京时间的时间差,A=4*(120-当地经度)(单位:分钟);
X为真平太阳时差,可以通过查表获得,也可以利用公式近似获得;
*/
double true_solar_time(int year,int month,int day,int hour,int minute,int second,double Longitude_position)//传入北京时间年月日时分秒,以及当地经度
{
//将时间都转换为以时为单位
double minute_hour = minute/60;//以时为单位的分
double second_hour = second/3600;//以时为单位的秒
double hour_1 = hour + minute_hour + second_hour;
//计算真太阳时差
//1.计算年积日
int N = floor(month*275.0/9.0)-floor((month+9)/12.0)*(floor((year-4*floor(year/4.0)+2)/3.0)+1)+day-30;
cout << "真太阳时函数里的年积日N:" << N << endl;
//2.计算太阳时差
double B = 2*pi*(N)/365.0;//年积日对应的角度(度?)
double B_1 = B*pi/180.0;//转换为弧度
double EOT = 0.0172+0.4281*cos(B_1)-7.3515*sin(B_1)-3.3495*cos(2*B_1)-9.3619*sin(2*B_1);//近似真太阳时差(以分为单位)
cout << "真太阳时差EOT(分钟):" << EOT << endl;
double EOT_hour = EOT/60.0;//以时为单位的近似真太阳时差
//3.计算经度时差
double A = 4.0 * (120-Longitude_position);//以分钟为单位
double A_hour = A/60.0;//以时为单位
//4.计算真太阳时
double ST = hour_1 - A_hour + EOT_hour;//以时为单位
return ST;
}
由此计算出了真太阳时ST后就可以计算时角t了。
计算时角t:
double ST_hour = true_solar_time(year,month,day,H_beijing,M_beijing,S_beijing,Longitude_position);//得到以时为单位的真太阳时
cout << "真太阳时ST(以时为单位)" << ST_hour << endl;
//计算时角w
double w = 15*(ST_hour-12)*pi/180;//得到以弧度为单位的时角
cout << "时角w(弧度):" << w << endl;
将以上计算的所有值代入太阳高度角的计算公式,可以得到太阳高度角h。
以下为主要代码:
1.计算太阳赤纬
#include<iostream>
#include"Sun_altitude_angle.h"
*/
//采用简便方法计算
//计算太阳赤纬
double Solar_declination(int year,int month,int day)
{
double N = floor(month*275.0/9.0)-floor((month+9)/12.0)*(floor((year-4*floor(year/4.0)+2)/3.0)+1)+day-30;
cout << "年积日N:" << N << endl;
double Theta;
double a;
a=0.98563*(N-173)*pi/180;//转弧度
double Theta_1=asin(0.39795*cos(a));//弧度
cout << "粗略太阳赤纬" << Theta_1*180/pi << endl;
//计算赤纬的第二种方法
//double B = 2*pi*(N-1)*365*pi/180;//弧度
//Theta = 0.006918-0.399912*cos(B)+0.070257*sin(B)-0.006758*cos(2*B)+0.000907*sin(2*B)-0.002697*cos(3*B)+0.00148*sin(3*B);//弧度
//cout << "精确太阳赤纬" << Theta*180/pi << endl;
return Theta_1;
}
2.计算真太阳时ST
#include<iostream>
#include"Sun_altitude_angle.h"
/*
真太阳时的计算
真太阳时=北京时间-A+X
其中:
A为当地时间与北京时间的时间差,A=4*(120-当地经度)(单位:分钟);
X为真平太阳时差,可以通过查表获得,也可以利用公式近似获得;
*/
double true_solar_time(int year,int month,int day,int hour,int minute,int second,double Longitude_position)//传入北京时间年月日时分秒,以及当地经度
{
//将时间都转换为以时为单位
double minute_hour = minute/60;//以时为单位的分
double second_hour = second/3600;//以时为单位的秒
double hour_1 = hour + minute_hour + second_hour;
//计算真太阳时差
//1.计算年积日
int N = floor(month*275.0/9.0)-floor((month+9)/12.0)*(floor((year-4*floor(year/4.0)+2)/3.0)+1)+day-30;
cout << "真太阳时函数里的年积日N:" << N << endl;
//2.计算太阳时差
double B = 2*pi*(N)/365.0;//年积日对应的角度(度?)
double B_1 = B*pi/180.0;//转换为弧度
double EOT = 0.0172+0.4281*cos(B_1)-7.3515*sin(B_1)-3.3495*cos(2*B_1)-9.3619*sin(2*B_1);//近似真太阳时差(以分为单位)
cout << "真太阳时差EOT(分钟):" << EOT << endl;
double EOT_hour = EOT/60.0;//以时为单位的近似真太阳时差
//3.计算经度时差
double A = 4.0 * (120-Longitude_position);//以分钟为单位
double A_hour = A/60.0;//以时为单位
//4.计算真太阳时
double ST = hour_1 - A_hour + EOT_hour;//以时为单位
return ST;
}
3.计算太阳高度角h
#include<iostream>
#include"Sun_altitude_angle.h"
void main()
{
cout << "请输入年月日:" << endl;
int year,month,day;
cin >> year;cin >> month;cin >> day;
//计算太阳赤纬delta
double delta = Solar_declination(year,month,day);
cout << "太阳赤纬delta(弧度)为:" << delta << endl;
//计算真太阳时ST
cout << "请输入北京时间(时 分 秒):" << endl;
double H_beijing,M_beijing,S_beijing;
cin >> H_beijing;cin >> M_beijing;cin >> S_beijing;//输入北京时间的时分秒
cout << "请输入当地经度:" << endl;
double Longitude_position;
cin >> Longitude_position;
double ST_hour = true_solar_time(year,month,day,H_beijing,M_beijing,S_beijing,Longitude_position);//得到以时为单位的真太阳时
cout << "真太阳时ST(以时为单位)" << ST_hour << endl;
//计算时角w
double w = 15*(ST_hour-12)*pi/180;//得到以弧度为单位的时角
cout << "时角w(弧度):" << w << endl;
cout << "请输入当地纬度:" << endl;
double Latitude_position;
cin >> Latitude_position;
//计算太阳高度角
double h = asin(sin(Latitude_position*pi/180)*sin(delta)+cos(Latitude_position*pi/180)*cos(delta)*cos(w));
cout << "当地太阳高度角w(度)为:" << h*180/pi << endl;
system("pause");
}
以上为我写的代码,因为我也是初学,所以难免有错误,希望您指出,同时也希望能给您带来帮助。