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