summaryrefslogtreecommitdiffstats
path: root/src/parameters.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parameters.cpp')
-rw-r--r--src/parameters.cpp247
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"
3using namespace std; 3using namespace std;
4 4
5//凡无特殊说明的函数,全部返回弧度制 5//凡无特殊说明的函数,全部返回弧度制
6 6
7// 计算地球日心黄经 7// 计算地球日心黄经
8double parameter::get_longitude(vector<double> l,double t) 8double 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// 计算地球日心黄纬
20double parameter::get_latitude(vector<double> b,double t) 18double 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// 计算地日距离,单位为天文单位
32double parameter::get_R(vector<double> r,double t) 28double 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误差
43double parameter::delta_FK5(double L,double B,double T) 37double 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//章动有关角,结果均为角度制
63vector<double> parameter::get_angle(double T) 56vector<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//章动修正
80double parameter::nutation(double T) 77double 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//光行差修正
103double parameter::aberration(double R) 103double 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为地日距离
113vector<vector<double>> parameter::get_parameters(double t) 112vector<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// 计算太阳地心黄经,外部调用,返回角度制
169double parameter::sun_longitude(double t) 160double 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// 计算月球地心黄经,外部调用,返回角度制
202double parameter::moon_longitude(double t) 190double 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}