太阳角度
/**********************************************************************************************
*文件名: 精确太阳角度计算
*程序功能:此程序计算规定规定日期的规定时间的太阳能电池位地平方位角和视高度角
*编制时间: 2011年05月13日
*程序版本: 针对太阳角度计算做了修改
*改动部分: 对太阳赤纬角、时角等算法做了修正,加入时差等补偿
*输入参数:
*所测时间的年、月、日 y,m,d
*所测时间的时分秒 h,m,s
*所测地地理经度 LONG
*所测地地理纬度 LAT
*程序输出: 屏幕打印
说明: 程序中输入输出借用C++输入输出库 (头文件)
*************************************************************************************/
#include
#include<math.h>
using namespace std;
#define PI 3.14159265358979
/******************************************************************************
*声明积日计算函数n_ca
*输入参数为月:a、日:b
输出为当天为当年的第n天
/
unsigned int n_ca(unsigned int a,unsigned int b);
/
*声明日角计算函数
*输入参数为:年:y,积日:n
*输出为日角 angle_day
******************************************************************************/
double angle_day_ca(unsigned int n,unsigned int y);
/*******************************************************************************
*声明赤纬角的计算函数delt_sun_ca
*输入参数为:日角angle_day
*输出为赤纬角 delt_sun
********************************************************************************/
double delt_sun_ca(double a);
/******************************************************************************
*声明时差计算函数
*输入参数为日角angle_day
*输出为时差et
*******************************************************************************/
double et_ca(double a);
/*****************************************************************************
*声明时角计算函数
*输入参数为:时分秒:hour,minute,sec;时差et,地理经度LONG
*输出为时角angle_hour
*****************************************************************************/
double angle_hour_ca(unsigned int h,unsigned int m,unsigned s,double e,double l);
/****主函数计算太阳高度角与方位角/
int main()
{
/输入年月日,时刻*/
unsigned int y,m,d;
unsigned int hour,minute,sec;
cout<<“输入当前年月日:”<<endl;
cin>>y>>m>>d;
cout<<“输入当前时分秒:”<<endl;
cin>>hour>>minute>>sec;
/输入经纬度*/
double LONG,LAT;
cout<<“输入当地经度LONG与当地纬度LAT:”<<endl;
cin>>LONG>>LAT;
LONG=LONGPI/180;
LAT=LATPI/180;
cout<<“输入的经度纬度分别为:”<<LONG<<“rad,”<<LAT<<“rad\n”;
/***计算当前赤纬角/
double delt_sun,angle_day;
unsigned int n;
n=n_ca(m,d);
cout<<“现在是一年中的第”<<n<<“天。\n”;
angle_day=angle_day_ca(n,y);
delt_sun=delt_sun_ca(angle_day);
cout<<“当前的太阳赤纬为:”<<delt_sun<<“rad\n”;
cout<<“转换成角度制太阳赤纬角为”<<(delt_sun180/PI)<<“度\n”;
/**计算高度角/
double et,angle_hour;
et=et_ca(angle_day);
angle_hour=angle_hour_ca(hour,minute,sec,et,LONG);
cout<<“现在太阳的时角为”<<angle_hour<<“rad.\n”;
double sin_h, h_sun,h_sun1;
/计算高度角的正弦值/
sin_h=sin(LAT)*sin(delt_sun)+cos(LAT)*cos(delt_sun)cos(angle_hour);
h_sun=asin(sin_h);
h_sun1=h_sun180/PI;
cout<<“转换成当前太阳的高度角为:”<<h_sun1<<“度\n”;
/*计算方位角/
double cos_gam,gam_sun,gam_sun1;
cos_gam=(sin_hsin(LAT)-sin(delt_sun))/(cos(h_sun)cos(LAT));
gam_sun=acos(cos_gam);
gam_sun1=gam_sun180/PI;//转换成角度制
cout<<“当前太阳的方位角为:”<<gam_sun<<“rad,”<<gam_sun1<<" 度\n";
return 0;
}
/函数定义部分/
/积日计算函数定义/
unsigned int n_ca(unsigned int a,unsigned int b)
{
int n=0;
switch(a)
{
case 1:
n=b;break;
case 2:
n=31+b;break;
case 3:
n=31+28+b;break;
case 4:
n=31+28+31+b;break;
case 5:
n=31+28+31+30+b;break;
case 6:
n=31+28+31+30+31+b;break;
case 7:
n=31+28+31+30+31+30+b;break;
case 8:
n=31+28+31+30+31+30+31+b;break;
case 9:
n=31+28+31+30+31+30+31+31+b;break;
case 10:
n=31+28+31+30+31+30+31+31+30+b;break;
case 11:
n=31+28+31+30+31+30+31+31+30+31+b;break;
case 12:
n=31+28+31+30+31+30+31+31+30+31+30+b;break;
default:
cout<<“月份输入错误!\n”;
}
return n;
}
/日角计算函数定义/
double angle_day_ca(unsigned int n,unsigned int y)
{
double n0=79.6764+0.2433*(y-1985)-((y-1985)/4);
{
double n0=79.6764+0.2433*(y-1985)-((y-1985)/4);
double t=n-n0;
return 2PIt/365.2422;
}
/太阳赤纬角计算函数定义/
double delt_sun_ca(double a)
{
return (0.3723+23.2567sin(a)+0.1149sin(2a)-0.1712sin(3a)-0.758cos(a)+0.3656cos(2a)+0.0201cos(3a))PI/180;
}
/时差计算函数的定义/
double et_ca(double a)
{
return 0.0028-1.9857sin(a)+9.9059sin(2a)-7.0924cos(a)-0.6882cos(2a);
}
/时角计算函数定义/
double angle_hour_ca(unsigned int h,unsigned int m,unsigned s,double e,double l)
{
return (h-12)+(m-(120PI/180-l)4180/PI+e)/60+(s/3600)15PI/180;
}
/**程序结束/
=|111.229.188.116|=