diff options
Diffstat (limited to 'src/parameters.cpp')
-rw-r--r-- | src/parameters.cpp | 150 |
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" | ||
2 | using namespace std; | 3 | using namespace std; |
3 | 4 | ||
5 | //凡无特殊说明的函数,全部返回弧度制 | ||
6 | |||
4 | // 计算地球日心黄经 | 7 | // 计算地球日心黄经 |
5 | double parameter::get_longitude(vector<double> l,double t) | 8 | double 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 | // 计算地日距离,单位为天文单位 | ||
29 | double parameter::get_R(vector<double> r,double t) | 32 | double 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误差 |
40 | double parameter::delta_FK5(double L,double B,double T) | 43 | double 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 | //章动有关角,结果均为角度制 |
60 | vector<double> parameter::get_angle(double T) | 63 | vector<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 | //章动修正 |
78 | double parameter::nution(double T) | 80 | double 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 | //光行差修正 |
111 | double parameter::aberration(double R) | 103 | double 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为地日距离 |
122 | vector<vector<double>> parameter::get_parameters(double t) | 113 | vector<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 | // 计算太阳地心黄经,外部调用,返回角度制 | |
163 | double parameter::sun_longitude(double t) | 169 | double 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 | //{ | 202 | double 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 | } | ||