summaryrefslogtreecommitdiffstats
path: root/src/parameters.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parameters.cpp')
-rw-r--r--src/parameters.cpp150
1 files changed, 88 insertions, 62 deletions
diff --git a/src/parameters.cpp b/src/parameters.cpp
index 704f083..8a99160 100644
--- a/src/parameters.cpp
+++ b/src/parameters.cpp
@@ -1,6 +1,9 @@
1#include "calendar.h" 1#include "calendar.h"
2#include "parameters.h"
2using namespace std; 3using namespace std;
3 4
5//凡无特殊说明的函数,全部返回弧度制
6
4// 计算地球日心黄经 7// 计算地球日心黄经
5double parameter::get_longitude(vector<double> l,double t) 8double parameter::get_longitude(vector<double> l,double t)
6{ 9{
@@ -9,7 +12,7 @@ double parameter::get_longitude(vector<double> l,double t)
9 { 12 {
10 L+=l[i]*pow(t,i); 13 L+=l[i]*pow(t,i);
11 } 14 }
12 //返回弧度制 15 //返回弧度制,太阳地心黄经=地球日心黄经+180°
13 return L+pi; 16 return L+pi;
14} 17}
15 18
@@ -21,11 +24,11 @@ double parameter::get_latitude(vector<double> b,double t)
21 { 24 {
22 B+=b[i]*pow(t,i); 25 B+=b[i]*pow(t,i);
23 } 26 }
24 //返回弧度制
25 //地心黄纬=-太阳黄纬 27 //地心黄纬=-太阳黄纬
26 return -B; 28 return -B;
27} 29}
28 30
31// 计算地日距离,单位为天文单位
29double parameter::get_R(vector<double> r,double t) 32double parameter::get_R(vector<double> r,double t)
30{ 33{
31 double R=r[0]; 34 double R=r[0];
@@ -36,7 +39,7 @@ double parameter::get_R(vector<double> r,double t)
36 return R; 39 return R;
37} 40}
38 41
39// 转换FK5误差,返回弧度制 42// 转换FK5误差
40double parameter::delta_FK5(double L,double B,double T) 43double parameter::delta_FK5(double L,double B,double T)
41{ 44{
42 //L转角度制 45 //L转角度制
@@ -47,7 +50,7 @@ double parameter::delta_FK5(double L,double B,double T)
47 L_p*=pi/180; 50 L_p*=pi/180;
48 while(L_p<0) 51 while(L_p<0)
49 L_p+=2*pi; 52 L_p+=2*pi;
50 while(L_p>2*pi) 53 while(L_p>=2*pi)
51 L_p-=2*pi; 54 L_p-=2*pi;
52 //计算delta_L,单位为角秒 55 //计算delta_L,单位为角秒
53 double delta_L=-0.09033+0.03916*(cos(L_p)+sin(L_p))*tan(B); 56 double delta_L=-0.09033+0.03916*(cos(L_p)+sin(L_p))*tan(B);
@@ -56,61 +59,49 @@ double parameter::delta_FK5(double L,double B,double T)
56 return delta_L; 59 return delta_L;
57} 60}
58 61
59//获取章动有关角 62//章动有关角,结果均为角度制
60vector<double> parameter::get_angle(double T) 63vector<double> parameter::get_angle(double T)
61{ 64{
62 vector<double> ang; 65 vector<double> ang;
63 //计算平距角 66 //平距角
64 ang.push_back(297.85036+445267.111480*T-0.0019142*T*T+T*T*T/189474); 67 ang.push_back(297.85036+445267.111480*T-0.0019142*T*T+T*T*T/189474);
65 //计算日地平近点角 68 //日地平近点角
66 ang.push_back(357.52772+35999.050340*T-0.0001603*T*T-T*T*T/300000); 69 ang.push_back(357.52772+35999.050340*T-0.0001603*T*T-T*T*T/300000);
67 //计算月球平近点角 70 //月球平近点角
68 ang.push_back(134.96298+477198.867398*T+0.0086972*T*T+T*T*T/56250); 71 ang.push_back(134.96298+477198.867398*T+0.0086972*T*T+T*T*T/56250);
69 //计算月球纬度参数 72 //月球纬度参数
70 ang.push_back(93.27191+483202.017538*T-0.0036825*T*T+T*T*T/327270); 73 ang.push_back(93.27191+483202.017538*T-0.0036825*T*T+T*T*T/327270);
71 //计算黄道与月球平轨道交点黄经 74 //黄道与月球平轨道交点黄经
72 ang.push_back(125.04452-1934.136261*T+0.0020708*T*T+T*T*T/450000); 75 ang.push_back(125.04452-1934.136261*T+0.0020708*T*T+T*T*T/450000);
73 return ang; 76 return ang;
74} 77}
75 78
76
77//章动修正 79//章动修正
78double parameter::nution(double T) 80double parameter::nutation(double T)
79{ 81{
80 vector<double> ang=get_angle(T); 82 vector<double> ang=get_angle(T);
81 fstream fr;
82 fr.open("data/nutation.txt",ios::in);
83 string str;
84 double sita; 83 double sita;
85 double s,s1,s2; 84 double s,s1,s2;
86 double c,c1,c2; 85 double c,c1,c2;
87 double m,n,o,p,q; 86 double m,n,o,p,q;
88 87
89 s=c=0; 88 s=c=0;
90 while(getline(fr,str)) 89 for(int i=0;i<nutation_size;i++)
91 { 90 {
92 sscanf(str.c_str(),"%lf%lf%lf%lf%lf%lf%lf%lf%lf",&m,&n,&o,&p,&q,&s1,&s2,&c1,&c2); 91 sita=nutation_parameters[i][0]*ang[0]+nutation_parameters[i][1]*ang[1]+nutation_parameters[i][2]*ang[2]+nutation_parameters[i][3]*ang[3]+nutation_parameters[i][4]*ang[4];
93 sita=m*ang[0]+n*ang[1]+o*ang[2]+p*ang[3]+q*ang[4];
94
95 //sita为角度制,转换为弧度制
96 sita*=pi/180; 92 sita*=pi/180;
97 //计算黄经章动,单位为0.0001角秒 93 s+=(nutation_parameters[i][5]+nutation_parameters[i][6]*T)*sin(sita);
98 s+=(s1+s2*T)*sin(sita); 94 //c+=(nutation_parameters[i][7]+nutation_parameters[i][8]*T)*cos(sita);
99 //计算交角章动,单位为0.0001角秒
100 //c+=(c1+c2*T)*cos(sita);
101 } 95 }
102 //关闭文件
103 fr.close();
104 // 计算得到的s和c单位0.0001秒,转换为弧度制 96 // 计算得到的s和c单位0.0001秒,转换为弧度制
105 s*=0.0001; 97 s*=0.0001;
106 s*=pi/(180*3600); 98 s*=pi/(180*3600);
107 return s; 99 return s;
108} 100}
109 101
110//光行差修正,返回弧度制 102//光行差修正
111double parameter::aberration(double R) 103double parameter::aberration(double R)
112{ 104{
113 //return -20.4898/R/3600.0*pi/180.0;
114 //公式,单位0.0001角秒 105 //公式,单位0.0001角秒
115 double delta=-20.4898/R; 106 double delta=-20.4898/R;
116 //转换为弧度制 107 //转换为弧度制
@@ -121,36 +112,51 @@ double parameter::aberration(double R)
121// 获取地日运行参数,L为地球日心黄经,B为地球日心黄纬,R为地日距离 112// 获取地日运行参数,L为地球日心黄经,B为地球日心黄纬,R为地日距离
122vector<vector<double>> parameter::get_parameters(double t) 113vector<vector<double>> parameter::get_parameters(double t)
123{ 114{
124 fstream fr;
125 fr.open("data/earth.txt",ios::in);
126 string s;
127 double l=0; 115 double l=0;
128 double a,b,c,num_tmp=0; 116 double a,b,c,num_tmp=0;
129 vector<vector<double>> parameters; 117 vector<vector<double>> parameters;
130 vector<double> tmp; 118 vector<double> tmp;
131 while(getline(fr,s)) 119
120 //计算L
121 tmp.resize(0);
122 for(int i=0;i<L_size;i++)
132 { 123 {
133 //当分割符为/时,表明一组参数结束,将参数存入parameters中,并清空tmp 124 num_tmp=0;
134 if(s[0]=='/') 125 for(int j=0;j<L_length[i];j++)
135 { 126 {
136 parameters.push_back(tmp); 127 num_tmp+=L[i][j][0]*cos(L[i][j][1]+L[i][j][2]*t);
137 tmp.resize(0);
138 num_tmp=0;
139 } 128 }
140 //当分割符为=时,表明一组参数中的一类结束,将参数存入tmp中,并清空num_tmp 129 tmp.push_back(num_tmp);
141 else if(s[0]=='=') 130 }
131 parameters.push_back(tmp);
132
133 //计算B
134 tmp.resize(0);
135 for(int i=0;i<B_size;i++)
136 {
137 num_tmp=0;
138 for(int j=0;j<B_length[i];j++)
142 { 139 {
143 tmp.push_back(num_tmp); 140 num_tmp+=B[i][j][0]*cos(B[i][j][1]+B[i][j][2]*t);
144 num_tmp=0;
145 } 141 }
146 else 142 tmp.push_back(num_tmp);
143 }
144 parameters.push_back(tmp);
145
146 //计算R
147 tmp.resize(0);
148 for(int i=0;i<R_size;i++)
149 {
150 num_tmp=0;
151 for(int j=0;j<R_length[i];j++)
147 { 152 {
148 sscanf(s.c_str(),"%lf%lf%lf",&a,&b,&c); 153 num_tmp+=R[i][j][0]*cos(R[i][j][1]+R[i][j][2]*t);
149 num_tmp+=a*cos(b+c*t);
150 } 154 }
155 tmp.push_back(num_tmp);
151 } 156 }
152 //关闭文件 157 parameters.push_back(tmp);
153 fr.close(); 158
159
154 /* 最终传参情况: 160 /* 最终传参情况:
155 * parameters[0]为L系列,用来计算地球日心黄经 161 * parameters[0]为L系列,用来计算地球日心黄经
156 * parameters[1]为B系列,用来计算地球日心黄纬 162 * parameters[1]为B系列,用来计算地球日心黄纬
@@ -159,7 +165,7 @@ vector<vector<double>> parameter::get_parameters(double t)
159 return parameters; 165 return parameters;
160} 166}
161 167
162 168// 计算太阳地心黄经,外部调用,返回角度制
163double parameter::sun_longitude(double t) 169double parameter::sun_longitude(double t)
164{ 170{
165 //从文件中计算地日运行参数 171 //从文件中计算地日运行参数
@@ -178,7 +184,7 @@ double parameter::sun_longitude(double t)
178 //转FK5误差,返回弧度制 184 //转FK5误差,返回弧度制
179 L+=delta_FK5(L,B,10*t); 185 L+=delta_FK5(L,B,10*t);
180 //章动修正,返回弧度制 186 //章动修正,返回弧度制
181 L+=nution(10*t); 187 L+=nutation(10*t);
182 //光行差修正,返回弧度制 188 //光行差修正,返回弧度制
183 L+=aberration(R); 189 L+=aberration(R);
184 190
@@ -189,22 +195,42 @@ double parameter::sun_longitude(double t)
189 L+=360; 195 L+=360;
190 while(L>=360) 196 while(L>=360)
191 L-=360; 197 L-=360;
192 if(360-L<=5)
193 {
194 L-=360;
195 }
196 return L; 198 return L;
197} 199}
198 200
199//double moon_longitude(double t) 201// 计算月球地心黄经,外部调用,返回角度制
200//{ 202double parameter::moon_longitude(double t)
201// //文件中获取地月运行参数 203{
202// vector<vector<double>> p=get_moon_parameters(t); 204 double T=10*t;
203// vector<double> l=p[0],b=p[1],r=p[2]; 205 vector<double> angles=get_angle(T);
206 double a,b,c,d,moon_longitude_a;
207
208 double L=218.3164591+481267.88134236*T-0.0013268*T*T+T*T*T/538841-T*T*T*T/65194000;//月球平黄经
209 double EI=0,sita=0;
210 double E=1-0.002516*T-0.0000074*T*T;//地球离心率
211
212 for(int i=0;i<moon_size;i++)
213 {
214 sita=moon_longitude_parameters[i][0]*angles[0]+moon_longitude_parameters[i][1]*angles[1]+moon_longitude_parameters[i][2]*angles[2]+moon_longitude_parameters[i][3]*angles[3];
215 sita*=pi/180;
216 EI+=moon_longitude_parameters[i][4]*sin(sita)*pow(E,fabs(moon_longitude_parameters[i][1]));
217 }
218
219 //地外行星影响月球地心黄经修正项
220 double a1,a2;
221 a1=119.75+131.849*T;
222 a2=53.09+479264.290*T;
204 223
205// //计算地月日心黄经纬,返回弧度制/天文单位 224 EI+=3958.0*sin(a1*pi/180);
206// double L=get_moon_longitude(l,t); 225 EI+=1962.0*sin((L-angles[3])*pi/180);
207// double B=get_moon_latitude(b,t); 226 EI+=318.0*sin(a2*pi/180);
208// double R=get_moon_R(r,t);
209 227
210//} 228 L+=EI/1000000;
229 L+=180/pi*nutation(T);//地球章动修正
230
231 while(L<0)
232 L+=360;
233 while(L>=360)
234 L-=360;
235 return L;
236}