【C++】太阳高度角的计算(附代码)

前言:在学习用C++计算地球某点的太阳高度角的过程中,查阅了各类资料,但内容繁杂,下面对其进行总结整理,希望可以帮到学习卫星的同学和朋友们。

太阳高度角的计算有以下公式:

 上式中h为太阳高度角,\varphi为某目标点的地理纬度,\delta为太阳赤纬,t为时角。

基本步骤如下:

①输入已知目标点的地理纬度和经度

②计算太阳赤纬\delta

③计算时角t

接下来按以上步骤进行计算,以下是我的计算思路:

①输入目标点的地理纬度和经度

	cout <<  "请输入当地经度:" << endl;
	double Longitude_position;
	cin >> Longitude_position;
	cout << "请输入当地纬度:" << endl;
	double Latitude_position;
	cin >> Latitude_position;

②计算太阳赤纬\delta

一年内任何一天的赤纬角可以用如下公式计算:

sin\delta =0.39795*cos(0.98563*(N-173))

在上式中,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可以由如下公式计算得到(单位为度):

t=15*(ST-12)

时角的解释如下:

 上式中ST为真太阳时,以24小时计。因此此时我们需要先计算出真太阳时ST。

ST的计算如下所示:

ST=date-A+X

上式中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=4*(120-当地经度)

上式A单位为分钟,因此需要将其转换为以时为单位。

具体计算A的代码如下:

	double A = 4.0 * (120-Longitude_position);//以分钟为单位
	double A_hour = A/60.0;//以时为单位

真太阳时差X的计算:

真太阳时差X一般是通过查真太阳时差表获得,但是这不利于我们的代码实现,因此我们利用近似的公式:

X = 0.0172+0.4281*cos(B_1)-7.3515*sin(B_1)-3.3495*cos(2*B_1)-9.3619*sin(2*B_1)

其中:

B_1 = 2*pi*(N)/365.0*pi/180

上式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.计算太阳赤纬\delta

#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");
}

以上为我写的代码,因为我也是初学,所以难免有错误,希望您指出,同时也希望能给您带来帮助。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值