赞
踩
[工程师阿伟]正在和[机器小伟]一起研究[历法的制定]。
历法的制定,在历史上各个时期,都是有不同的标准的,而且在中华帝国,
是作为重中之重进行管理的,这也是华夏灿烂文明中值得骄傲的一页。
站在现代科技的巅峰,阿伟和小伟当然会在以后的读史修炼中,用现代的理念和计算方法
去反推过去的时间,当然,可能会与当时的史书记录不同,但阿伟会详细的列出差异所在,
以供诸君研究。
首先是几个一般性的知识点:
由于平均每5次日月合朔中还有1次月球会从太阳面上走过,也就是会形成日食,
于是阿伟就想了解下这个问题:
然后是章动的概念:
其实阿伟对这些概念也不是很懂,也不打算去搞懂。下面给出寿星万年历的代码,
由它可以计算出历年的交节时间,精确到秒:
- <span style="font-size:18px;">###
- # @usage 整理《寿星万年历》算法,将其转化为python语言,至此应有C++, Java, Python版本各一份
- # @author mw
- # @date 2016年05月31日 星期二 08:21:18
- # @param
- # @return
- #
- ###
- class SolarTerm():
- def __init__(self):
- # ========角度变换===============
- self._rad = 180 * 3600 / math.pi; # 每弧度的角秒数
- self._RAD = 180 / math.pi; # 每弧度的角度数
- # ================日历计算===============
- self._J2000 = 2451545; # 2000年前儒略日数(2000-1-1 12:00:00格林威治平时)
- # =========黄赤交角及黄赤坐标变换===========
- self._hcjjB = [84381.448, -46.8150, -0.00059, 0.001813];# 黄赤交角系数表
- self._preceB = [0, 50287.92262, 111.24406, 0.07699, -0.23479, -0.00178, 0.00018, 0.00001];# Date黄道上的岁差p
- self._Y = 2000;
- self._M = 1;
- self._D = 1;
- self._h = 12;
- self._m = 0;
- self._s = 0;
- self._dts = [
- # 世界时与原子时之差计算表
- # 共101项
- -4000, 108371.7, -13036.80, 392.000, 0.0000,
- -500, 17201.0, -627.82, 16.170, -0.3413,
- -150, 12200.6, -346.41, 5.403, -0.1593,
- 150, 9113.8, -328.13, -1.647, 0.0377,
- 500, 5707.5, -391.41, 0.915, 0.3145,
- 900, 2203.4, -283.45, 13.034, -0.1778,
- 1300, 490.1, -57.35, 2.085, -0.0072,
- 1600, 120.0, -9.81, -1.532, 0.1403,
- 1700, 10.2, -0.91, 0.510, -0.0370,
- 1800, 13.4, -0.72, 0.202, -0.0193,
- 1830, 7.8, -1.81, 0.416, -0.0247,
- 1860, 8.3, -0.13, -0.406, 0.0292,
- 1880, -5.4, 0.32, -0.183, 0.0173,
- 1900, -2.3, 2.06, 0.169, -0.0135,
- 1920, 21.2, 1.69, -0.304, 0.0167,
- 1940, 24.2, 1.22, -0.064, 0.0031,
- 1960, 33.2, 0.51, 0.231, -0.0109,
- 1980, 51.0, 1.29, -0.026, 0.0032,
- 2000, 64.7, -1.66, 5.224, -0.2905,
- 2150, 279.4, 732.95, 429.579, 0.0158,
- 6000
- ];
-
- RAD = self._RAD;
- rad = self._rad;
-
- # ===============光行差==================
- self._GXC_e = [0.016708634, -0.000042037, -0.0000001267 ]; # 离心率
- self._GXC_p = [102.93735 / RAD, 1.71946 / RAD, 0.00046 / RAD ]; # 近点
- self._GXC_l = [280.4664567 / RAD,
- 36000.76982779 / RAD,
- 0.0003032028 / RAD,
- 1 / 49931000 / RAD,
- -1 / 153000000 / RAD ]; # 太平黄经
- self._GXC_k = 20.49552 / rad; # 光行差常数
-
- # ===============章动计算==================
- self._nutB = [# 章动表,共90项
- 2.1824391966, -33.757045954, 0.0000362262, 3.7340E-08, -2.8793E-10,
- -171996, -1742, 92025, 89, 3.5069406862, 1256.663930738,
- 0.0000105845, 6.9813E-10, -2.2815E-10, -13187, -16, 5736, -31,
- 1.3375032491, 16799.418221925, -0.0000511866, 6.4626E-08,
- -5.3543E-10, -2274, -2, 977, -5, 4.3648783932, -67.514091907,
- 0.0000724525, 7.4681E-08, -5.7586E-10, 2062, 2, -895, 5,
- 0.0431251803, -628.301955171, 0.0000026820, 6.5935E-10, 5.5705E-11,
- -1426, 34, 54, -1, 2.3555557435, 8328.691425719, 0.0001545547,
- 2.5033E-07, -1.1863E-09, 712, 1, -7, 0, 3.4638155059,
- 1884.965885909, 0.0000079025, 3.8785E-11, -2.8386E-10, -517, 12,
- 224, -6, 5.4382493597, 16833.175267879, -0.0000874129, 2.7285E-08,
- -2.4750E-10, -386, -4, 200, 0, 3.6930589926, 25128.109647645,
- 0.0001033681, 3.1496E-07, -1.7218E-09, -301, 0, 129, -1,
- 3.5500658664, 628.361975567, 0.0000132664, 1.3575E-09, -1.7245E-10,
- 217, -5, -95, 3 ];
-
- # ==================日位置计算===================
- self._EnnT = 0; # 调用Enn前先设置EnnT时间变量
-
- # ==================月位置计算===================
- self._MnnT = 0; # 调用Mnn前先设置MnnT时间变量
-
-
-
- #=================以下是月球及地球运动参数表===================
- '''
- /***************************************
- * 如果用记事本查看此代码,请在"格式"菜单中去除"自动换行"
- * E10是关于地球的,格式如下:
- * 它是一个数组,每3个数看作一条记录,每条记录的3个数记为A,B,C
- * rec=A*cos(B+C*t); 式中t是J2000起算的儒略千年数
- * 每条记录的计算结果(即rec)取和即得地球的日心黄经的周期量L0
- * E11格式如下: rec = A*cos*(B+C*t) *t, 取和后得泊松量L1
- * E12格式如下: rec = A*cos*(B+C*t) *t*t, 取和后得泊松量L2
- * E13格式如下: rec = A*cos*(B+C*t) *t*t*t, 取和后得泊松量L3
- * 最后地球的地心黄经:L = L0+L1+L2+L3+...
- * E20,E21,E22,E23...用于计算黄纬
- * M10,M11等是关于月球的,参数的用法请阅读Mnn()函数
- *****************************************/
- '''
- #names = ['E10', 'E11', 'E12', 'E13', 'E14', 'E15', 'E20', 'E21', 'E30', 'E31', 'E32', 'E33'];
- #E10:180项, E11:60项, E12:30项, E13:9项, E14:9项, E15:3项,
- #E20:30项, E21:6项,
- #E30:24项, E31:9项, E32:3项, E33:3项,
- #地球运动VSOP87参数
- self._E10 = [ #黄经周期项
- 1.75347045673, 0.00000000000, 0.0000000000, 0.03341656456, 4.66925680417, 6283.0758499914, 0.00034894275, 4.62610241759, 12566.1516999828, 0.00003417571, 2.82886579606, 3.5231183490,
- 0.00003497056, 2.74411800971, 5753.3848848968, 0.00003135896, 3.62767041758, 77713.7714681205, 0.00002676218, 4.41808351397, 7860.4193924392, 0.00002342687, 6.13516237631, 3930.2096962196,
- 0.00001273166, 2.03709655772, 529.6909650946, 0.00001324292, 0.74246356352, 11506.7697697936, 0.00000901855, 2.04505443513, 26.2983197998, 0.00001199167, 1.10962944315, 1577.3435424478,
- 0.00000857223, 3.50849156957, 398.1490034082, 0.00000779786, 1.17882652114, 5223.6939198022, 0.00000990250, 5.23268129594, 5884.9268465832, 0.00000753141, 2.53339053818, 5507.5532386674,
- 0.00000505264, 4.58292563052, 18849.2275499742, 0.00000492379, 4.20506639861, 775.5226113240, 0.00000356655, 2.91954116867, 0.0673103028, 0.00000284125, 1.89869034186, 796.2980068164,
- 0.00000242810, 0.34481140906, 5486.7778431750, 0.00000317087, 5.84901952218, 11790.6290886588, 0.00000271039, 0.31488607649, 10977.0788046990, 0.00000206160, 4.80646606059, 2544.3144198834,
- 0.00000205385, 1.86947813692, 5573.1428014331, 0.00000202261, 2.45767795458, 6069.7767545534, 0.00000126184, 1.08302630210, 20.7753954924, 0.00000155516, 0.83306073807, 213.2990954380,
- 0.00000115132, 0.64544911683, 0.9803210682, 0.00000102851, 0.63599846727, 4694.0029547076, 0.00000101724, 4.26679821365, 7.1135470008, 0.00000099206, 6.20992940258, 2146.1654164752,
- 0.00000132212, 3.41118275555, 2942.4634232916, 0.00000097607, 0.68101272270, 155.4203994342, 0.00000085128, 1.29870743025, 6275.9623029906, 0.00000074651, 1.75508916159, 5088.6288397668,
- 0.00000101895, 0.97569221824, 15720.8387848784, 0.00000084711, 3.67080093025, 71430.6956181291, 0.00000073547, 4.67926565481, 801.8209311238, 0.00000073874, 3.50319443167, 3154.6870848956,
- 0.00000078756, 3.03698313141, 12036.4607348882, 0.00000079637, 1.80791330700, 17260.1546546904, 0.00000085803, 5.98322631256,161000.6857376741, 0.00000056963, 2.78430398043, 6286.5989683404,
- 0.00000061148, 1.81839811024, 7084.8967811152, 0.00000069627, 0.83297596966, 9437.7629348870, 0.00000056116, 4.38694880779, 14143.4952424306, 0.00000062449, 3.97763880587, 8827.3902698748,
- 0.00000051145, 0.28306864501, 5856.4776591154, 0.00000055577, 3.47006009062, 6279.5527316424, 0.00000041036, 5.36817351402, 8429.2412664666, 0.00000051605, 1.33282746983, 1748.0164130670,
- 0.00000051992, 0.18914945834, 12139.5535091068, 0.00000049000, 0.48735065033, 1194.4470102246, 0.00000039200, 6.16832995016, 10447.3878396044, 0.00000035566, 1.77597314691, 6812.7668150860,
- 0.00000036770, 6.04133859347, 10213.2855462110, 0.00000036596, 2.56955238628, 1059.3819301892, 0.00000033291, 0.59309499459, 17789.8456197850, 0.00000035954, 1.70876111898, 2352.8661537718];
- self._E11 = [ #黄经泊松1项
- 6283.31966747491,0.00000000000, 0.0000000000, 0.00206058863, 2.67823455584, 6283.0758499914, 0.00004303430, 2.63512650414, 12566.1516999828, 0.00000425264, 1.59046980729, 3.5231183490,
- 0.00000108977, 2.96618001993, 1577.3435424478, 0.00000093478, 2.59212835365, 18849.2275499742, 0.00000119261, 5.79557487799, 26.2983197998, 0.00000072122, 1.13846158196, 529.6909650946,
- 0.00000067768, 1.87472304791, 398.1490034082, 0.00000067327, 4.40918235168, 5507.5532386674, 0.00000059027, 2.88797038460, 5223.6939198022, 0.00000055976, 2.17471680261, 155.4203994342,
- 0.00000045407, 0.39803079805, 796.2980068164, 0.00000036369, 0.46624739835, 775.5226113240, 0.00000028958, 2.64707383882, 7.1135470008, 0.00000019097, 1.84628332577, 5486.7778431750,
- 0.00000020844, 5.34138275149, 0.9803210682, 0.00000018508, 4.96855124577, 213.2990954380, 0.00000016233, 0.03216483047, 2544.3144198834, 0.00000017293, 2.99116864949, 6275.9623029906];
- self._E12 = [ #黄经泊松2项
- 0.00052918870, 0.00000000000, 0.0000000000, 0.00008719837, 1.07209665242, 6283.0758499914, 0.00000309125, 0.86728818832, 12566.1516999828, 0.00000027339, 0.05297871691, 3.5231183490,
- 0.00000016334, 5.18826691036, 26.2983197998, 0.00000015752, 3.68457889430, 155.4203994342, 0.00000009541, 0.75742297675, 18849.2275499742, 0.00000008937, 2.05705419118, 77713.7714681205,
- 0.00000006952, 0.82673305410, 775.5226113240, 0.00000005064, 4.66284525271, 1577.3435424478];
- self._E13 = [ 0.00000289226, 5.84384198723, 6283.0758499914, 0.00000034955, 0.00000000000, 0.0000000000, 0.00000016819, 5.48766912348, 12566.1516999828];
- self._E14 = [ 0.00000114084, 3.14159265359, 0.0000000000, 0.00000007717, 4.13446589358, 6283.0758499914, 0.00000000765, 3.83803776214, 12566.1516999828];
- self._E15 = [ 0.00000000878, 3.14159265359, 0.0000000000 ];
-
-
- self._E20 = [ #黄纬周期项
- 0.00000279620, 3.19870156017, 84334.6615813083, 0.00000101643, 5.42248619256, 5507.5532386674, 0.00000080445, 3.88013204458, 5223.6939198022, 0.00000043806, 3.70444689758, 2352.8661537718,
- 0.00000031933, 4.00026369781, 1577.3435424478, 0.00000022724, 3.98473831560, 1047.7473117547, 0.00000016392, 3.56456119782, 5856.4776591154, 0.00000018141, 4.98367470263, 6283.0758499914,
- 0.00000014443, 3.70275614914, 9437.7629348870, 0.00000014304, 3.41117857525, 10213.2855462110];
- self._E21 = [ 0.00000009030, 3.89729061890, 5507.5532386674, 0.00000006177, 1.73038850355, 5223.6939198022];
-
- self._E30 = [ #距离周期项
- 1.00013988799, 0.00000000000, 0.0000000000, 0.01670699626, 3.09846350771, 6283.0758499914, 0.00013956023, 3.05524609620, 12566.1516999828, 0.00003083720, 5.19846674381, 77713.7714681205,
- 0.00001628461, 1.17387749012, 5753.3848848968, 0.00001575568, 2.84685245825, 7860.4193924392, 0.00000924799, 5.45292234084, 11506.7697697936, 0.00000542444, 4.56409149777, 3930.2096962196];
- self._E31 = [ 0.00103018608, 1.10748969588, 6283.0758499914, 0.00001721238, 1.06442301418, 12566.1516999828, 0.00000702215, 3.14159265359, 0.0000000000];
- self._E32 = [ 0.00004359385, 5.78455133738, 6283.0758499914 ];
- self._E33 = [ 0.00000144595, 4.27319435148, 6283.0758499914 ];
-
-
- #names = ['M10', 'M11', 'M12', 'M20', 'M21', 'M30', 'M31', 'M1n'];
- #M10:330项, M11:48项, M12:18项,
- #M20:330项, M21:48项,
- #M30:330项, M31:48项,
- #M1n:5项,
- #月球运动参数
- self._M10 = [ # 月球黄经周期项
- 22639.5858800, 2.3555545723, 8328.6914247251, 1.5231275E-04, 2.5041111E-07,-1.1863391E-09, 4586.4383203, 8.0413790709, 7214.0628654588,-2.1850087E-04,-1.8646419E-07, 8.7760973E-10, 2369.9139357, 10.3969336431, 15542.7542901840,-6.6188121E-05, 6.3946925E-08,-3.0872935E-10, 769.0257187, 4.7111091445, 16657.3828494503, 3.0462550E-04, 5.0082223E-07,-2.3726782E-09,
- -666.4175399, -0.0431256817, 628.3019552485,-2.6638815E-06, 6.1639211E-10,-5.4439728E-11, -411.5957339, 3.2558104895, 16866.9323152810,-1.2804259E-04,-9.8998954E-09, 4.0433461E-11, 211.6555524, 5.6858244986, -1114.6285592663,-3.7081362E-04,-4.3687530E-07, 2.0639488E-09, 205.4359530, 8.0845047526, 6585.7609102104,-2.1583699E-04,-1.8708058E-07, 9.3204945E-10,
- 191.9561973, 12.7524882154, 23871.4457149091, 8.6124629E-05, 3.1435804E-07,-1.4950684E-09, 164.7286185, 10.4400593249, 14914.4523349355,-6.3524240E-05, 6.3330532E-08,-2.5428962E-10, -147.3213842, -2.3986802540, -7700.3894694766,-1.5497663E-04,-2.4979472E-07, 1.1318993E-09, -124.9881185, 5.1984668216, 7771.3771450920,-3.3094061E-05, 3.1973462E-08,-1.5436468E-10,
- -109.3803637, 2.3124288905, 8956.9933799736, 1.4964887E-04, 2.5102751E-07,-1.2407788E-09, 55.1770578, 7.1411231536, -1324.1780250970, 6.1854469E-05, 7.3846820E-08,-3.4916281E-10, -45.0996092, 5.6113650618, 25195.6237400061, 2.4270161E-05, 2.4051122E-07,-1.1459056E-09, 39.5333010, -0.9002559173, -8538.2408905558, 2.8035534E-04, 2.6031101E-07,-1.2267725E-09,
- 38.4298346, 18.4383127140, 22756.8171556428,-2.8468899E-04,-1.2251727E-07, 5.6888037E-10, 36.1238141, 7.0666637168, 24986.0742741754, 4.5693825E-04, 7.5123334E-07,-3.5590172E-09, 30.7725751, 16.0827581417, 14428.1257309177,-4.3700174E-04,-3.7292838E-07, 1.7552195E-09, -28.3971008, 7.9982533891, 7842.3648207073,-2.2116475E-04,-1.8584780E-07, 8.2317000E-10,
- -24.3582283, 10.3538079614, 16171.0562454324,-6.8852003E-05, 6.4563317E-08,-3.6316908E-10, -18.5847068, 2.8429122493, -557.3142796331,-1.8540681E-04,-2.1843765E-07, 1.0319744E-09, 17.9544674, 5.1553411398, 8399.6791003405,-3.5757942E-05, 3.2589854E-08,-2.0880440E-10, 14.5302779, 12.7956138971, 23243.1437596606, 8.8788511E-05, 3.1374165E-07,-1.4406287E-09,
- 14.3796974, 15.1080427876, 32200.1371396342, 2.3843738E-04, 5.6476915E-07,-2.6814075E-09, 14.2514576,-24.0810366320, -2.3011998397, 1.5231275E-04, 2.5041111E-07,-1.1863391E-09, 13.8990596, 20.7938672862, 31085.5085803679,-1.3237624E-04, 1.2789385E-07,-6.1745870E-10, 13.1940636, 3.3302699264, -9443.3199839914,-5.2312637E-04,-6.8728642E-07, 3.2502879E-09,
- -9.6790568, -4.7542348263,-16029.0808942018,-3.0728938E-04,-5.0020584E-07, 2.3182384E-09, -9.3658635, 11.2971895604, 24080.9951807398,-3.4654346E-04,-1.9636409E-07, 9.1804319E-10, 8.6055318, 5.7289501804, -1742.9305145148,-3.6814974E-04,-4.3749170E-07, 2.1183885E-09, -8.4530982, 7.5540213938, 16100.0685698171, 1.1921869E-04, 2.8238458E-07,-1.3407038E-09,
- 8.0501724, 10.4831850066, 14286.1503796870,-6.0860358E-05, 6.2714140E-08,-1.9984990E-10, -7.6301553, 4.6679834628, 17285.6848046987, 3.0196162E-04, 5.0143862E-07,-2.4271179E-09, -7.4474952, -0.0862513635, 1256.6039104970,-5.3277630E-06, 1.2327842E-09,-1.0887946E-10, 7.3712011, 8.1276304344, 5957.4589549619,-2.1317311E-04,-1.8769697E-07, 9.8648918E-10,
- 7.0629900, 0.9591375719, 33.7570471374,-3.0829302E-05,-3.6967043E-08, 1.7385419E-10, -6.3831491, 9.4966777258, 7004.5133996281, 2.1416722E-04, 3.2425793E-07,-1.5355019E-09, -5.7416071, 13.6527441326, 32409.6866054649,-1.9423071E-04, 5.4047029E-08,-2.6829589E-10, 4.3740095, 18.4814383957, 22128.5152003943,-2.8202511E-04,-1.2313366E-07, 6.2332010E-10,
- -3.9976134, 7.9669196340, 33524.3151647312, 1.7658291E-04, 4.9092233E-07,-2.3322447E-09, -3.2096876, 13.2398458924, 14985.4400105508,-2.5159493E-04,-1.5449073E-07, 7.2324505E-10, -2.9145404, 12.7093625336, 24499.7476701576, 8.3460748E-05, 3.1497443E-07,-1.5495082E-09, 2.7318890, 16.1258838235, 13799.8237756692,-4.3433786E-04,-3.7354477E-07, 1.8096592E-09,
- -2.5679459, -2.4418059357, -7072.0875142282,-1.5764051E-04,-2.4917833E-07, 1.0774596E-09, -2.5211990, 7.9551277074, 8470.6667759558,-2.2382863E-04,-1.8523141E-07, 7.6873027E-10, 2.4888871, 5.6426988169, -486.3266040178,-3.7347750E-04,-4.3625891E-07, 2.0095091E-09, 2.1460741, 7.1842488353, -1952.4799803455, 6.4518350E-05, 7.3230428E-08,-2.9472308E-10,
- 1.9777270, 23.1494218585, 39414.2000050930, 1.9936508E-05, 3.7830496E-07,-1.8037978E-09, 1.9336825, 9.4222182890, 33314.7656989005, 6.0925100E-04, 1.0016445E-06,-4.7453563E-09, 1.8707647, 20.8369929680, 30457.2066251194,-1.2971236E-04, 1.2727746E-07,-5.6301898E-10, -1.7529659, 0.4873576771, -8886.0057043583,-3.3771956E-04,-4.6884877E-07, 2.2183135E-09,
- -1.4371624, 7.0979974718, -695.8760698485, 5.9190587E-05, 7.4463212E-08,-4.0360254E-10, -1.3725701, 1.4552986550, -209.5494658307, 4.3266809E-04, 5.1072212E-07,-2.4131116E-09, 1.2618162, 7.5108957121, 16728.3705250656, 1.1655481E-04, 2.8300097E-07,-1.3951435E-09];
- self._M11 = [ #月球黄经泊松一项
- 1.6768000, -0.0431256817, 628.3019552485,-2.6638815E-06, 6.1639211E-10,-5.4439728E-11, 0.5164200, 11.2260974062, 6585.7609102104,-2.1583699E-04,-1.8708058E-07, 9.3204945E-10, 0.4138300, 13.5816519784, 14914.4523349355,-6.3524240E-05, 6.3330532E-08,-2.5428962E-10, 0.3711500, 5.5402729076, 7700.3894694766, 1.5497663E-04, 2.4979472E-07,-1.1318993E-09,
- 0.2756000, 2.3124288905, 8956.9933799736, 1.4964887E-04, 2.5102751E-07,-1.2407788E-09, 0.2459863,-25.6198212459, -2.3011998397, 1.5231275E-04, 2.5041111E-07,-1.1863391E-09, 0.0711800, 7.9982533891, 7842.3648207073,-2.2116475E-04,-1.8584780E-07, 8.2317000E-10, 0.0612800, 10.3538079614, 16171.0562454324,-6.8852003E-05, 6.4563317E-08,-3.6316908E-10];
- self._M12 = [ 0.0048700, -0.0431256817, 628.3019552485,-2.6638815E-06, 6.1639211E-10,-5.4439728E-11, 0.0022800,-27.1705318325, -2.3011998397, 1.5231275E-04, 2.5041111E-07,-1.1863391E-09, 0.0015000, 11.2260974062, 6585.7609102104,-2.1583699E-04,-1.8708058E-07, 9.3204945E-10];
- self._M20 = [ #月球黄纬周期项
- 18461.2400600, 1.6279052448, 8433.4661576405,-6.4021295E-05,-4.9499477E-09, 2.0216731E-11, 1010.1671484, 3.9834598170, 16762.1575823656, 8.8291456E-05, 2.4546117E-07,-1.1661223E-09, 999.6936555, 0.7276493275, -104.7747329154, 2.1633405E-04, 2.5536106E-07,-1.2065558E-09, 623.6524746, 8.7690283983, 7109.2881325435,-2.1668263E-06, 6.8896872E-08,-3.2894608E-10,
- 199.4837596, 9.6692843156, 15647.5290230993,-2.8252217E-04,-1.9141414E-07, 8.9782646E-10, 166.5741153, 6.4134738261, -1219.4032921817,-1.5447958E-04,-1.8151424E-07, 8.5739300E-10, 117.2606951, 12.0248388879, 23976.2204478244,-1.3020942E-04, 5.8996977E-08,-2.8851262E-10, 61.9119504, 6.3390143893, 25090.8490070907, 2.4060421E-04, 4.9587228E-07,-2.3524614E-09,
- 33.3572027, 11.1245829706, 15437.9795572686, 1.5014592E-04, 3.1930799E-07,-1.5152852E-09, 31.7596709, 3.0832038997, 8223.9166918098, 3.6864680E-04, 5.0577218E-07,-2.3928949E-09, 29.5766003, 8.8121540801, 6480.9861772950, 4.9705523E-07, 6.8280480E-08,-2.7450635E-10, 15.5662654, 4.0579192538, -9548.0947169068,-3.0679233E-04,-4.3192536E-07, 2.0437321E-09,
- 15.1215543, 14.3803934601, 32304.9118725496, 2.2103334E-05, 3.0940809E-07,-1.4748517E-09, -12.0941511, 8.7259027166, 7737.5900877920,-4.8307078E-06, 6.9513264E-08,-3.8338581E-10, 8.8681426, 9.7124099974, 15019.2270678508,-2.7985829E-04,-1.9203053E-07, 9.5226618E-10, 8.0450400, 0.6687636586, 8399.7091105030,-3.3191993E-05, 3.2017096E-08,-1.5363746E-10,
- 7.9585542, 12.0679645696, 23347.9184925760,-1.2754553E-04, 5.8380585E-08,-2.3407289E-10, 7.4345550, 6.4565995078, -1847.7052474301,-1.5181570E-04,-1.8213063E-07, 9.1183272E-10, -6.7314363, -4.0265854988,-16133.8556271171,-9.0955337E-05,-2.4484477E-07, 1.1116826E-09, 6.5795750, 16.8104074692, 14323.3509980023,-2.2066770E-04,-1.1756732E-07, 5.4866364E-10,
- -6.4600721, 1.5847795630, 9061.7681128890,-6.6685176E-05,-4.3335556E-09,-3.4222998E-11, -6.2964773, 4.8837157343, 25300.3984729215,-1.9206388E-04,-1.4849843E-08, 6.0650192E-11, -5.6323538, -0.7707750092, 733.0766881638,-2.1899793E-04,-2.5474467E-07, 1.1521161E-09, -5.3683961, 6.8263720663, 16204.8433027325,-9.7115356E-05, 2.7023515E-08,-1.3414795E-10,
- -5.3112784, 3.9403341353, 17390.4595376141, 8.5627574E-05, 2.4607756E-07,-1.2205621E-09, -5.0759179, 0.6845236457, 523.5272223331, 2.1367016E-04, 2.5597745E-07,-1.2609955E-09, -4.8396143, -1.6710309265, -7805.1642023920, 6.1357413E-05, 5.5663398E-09,-7.4656459E-11, -4.8057401, 3.5705615768, -662.0890125485, 3.0927234E-05, 3.6923410E-08,-1.7458141E-10,
- 3.9840545, 8.6945689615, 33419.5404318159, 3.9291696E-04, 7.4628340E-07,-3.5388005E-09, 3.6744619, 19.1659620415, 22652.0424227274,-6.8354947E-05, 1.3284380E-07,-6.3767543E-10, 2.9984815, 20.0662179587, 31190.2833132833,-3.4871029E-04,-1.2746721E-07, 5.8909710E-10, 2.7986413, -2.5281611620,-16971.7070481963, 3.4437664E-04, 2.6526096E-07,-1.2469893E-09,
- 2.4138774, 17.7106633865, 22861.5918885581,-5.0102304E-04,-3.7787833E-07, 1.7754362E-09, 2.1863132, 5.5132179088, -9757.6441827375, 1.2587576E-04, 7.8796768E-08,-3.6937954E-10, 2.1461692, 13.4801375428, 23766.6709819937, 3.0245868E-04, 5.6971910E-07,-2.7016242E-09, 1.7659832, 11.1677086523, 14809.6776020201, 1.5280981E-04, 3.1869159E-07,-1.4608454E-09,
- -1.6244212, 7.3137297434, 7318.8375983742,-4.3483492E-04,-4.4182525E-07, 2.0841655E-09, 1.5813036, 5.4387584720, 16552.6081165349, 5.2095955E-04, 7.5618329E-07,-3.5792340E-09, 1.5197528, 16.7359480324, 40633.6032972747, 1.7441609E-04, 5.5981921E-07,-2.6611908E-09, 1.5156341, 1.7023646816,-17876.7861416319,-4.5910508E-04,-6.8233647E-07, 3.2300712E-09,
- 1.5102092, 5.4977296450, 8399.6847301375,-3.3094061E-05, 3.1973462E-08,-1.5436468E-10, -1.3178223, 9.6261586339, 16275.8309783478,-2.8518605E-04,-1.9079775E-07, 8.4338673E-10, -1.2642739, 11.9817132061, 24604.5224030729,-1.3287330E-04, 5.9613369E-08,-3.4295235E-10, 1.1918723, 22.4217725310, 39518.9747380084,-1.9639754E-04, 1.2294390E-07,-5.9724197E-10,
- 1.1346110, 14.4235191419, 31676.6099173011, 2.4767216E-05, 3.0879170E-07,-1.4204120E-09, 1.0857810, 8.8552797618, 5852.6842220465, 3.1609367E-06, 6.7664088E-08,-2.2006663E-10, -1.0193852, 7.2392703065, 33629.0898976466,-3.9751134E-05, 2.3556127E-07,-1.1256889E-09, -0.8227141, 11.0814572888, 16066.2815125171, 1.4748204E-04, 3.1992438E-07,-1.5697249E-09,
- 0.8042238, 3.5274358950, -33.7870573000, 2.8263353E-05, 3.7539802E-08,-2.2902113E-10, 0.8025939, 6.7832463846, 16833.1452579809,-9.9779237E-05, 2.7639907E-08,-1.8858767E-10, -0.7931866, -6.3821400710,-24462.5470518423,-2.4326809E-04,-4.9525589E-07, 2.2980217E-09, -0.7910153, 6.3703481443, -591.1013369332,-1.5714346E-04,-1.8089785E-07, 8.0295327E-10,
- -0.6674056, 9.1819266386, 24533.5347274576, 5.5197395E-05, 2.7743463E-07,-1.3204870E-09, 0.6502226, 4.1010449356,-10176.3966721553,-3.0412845E-04,-4.3254175E-07, 2.0981718E-09, -0.6388131, 6.2958887075, 25719.1509623392, 2.3794032E-04, 4.9648867E-07,-2.4069012E-09];
- self._M21 = [ #月球黄纬泊松一项
- 0.0743000, 11.9537467337, 6480.9861772950, 4.9705523E-07, 6.8280480E-08,-2.7450635E-10, 0.0304300, 8.7259027166, 7737.5900877920,-4.8307078E-06, 6.9513264E-08,-3.8338581E-10, 0.0222900, 12.8540026510, 15019.2270678508,-2.7985829E-04,-1.9203053E-07, 9.5226618E-10, 0.0199900, 15.2095572232, 23347.9184925760,-1.2754553E-04, 5.8380585E-08,-2.3407289E-10,
- 0.0186900, 9.5981921614, -1847.7052474301,-1.5181570E-04,-1.8213063E-07, 9.1183272E-10, 0.0169600, 7.1681781524, 16133.8556271171, 9.0955337E-05, 2.4484477E-07,-1.1116826E-09, 0.0162300, 1.5847795630, 9061.7681128890,-6.6685176E-05,-4.3335556E-09,-3.4222998E-11, 0.0141900, -0.7707750092, 733.0766881638,-2.1899793E-04,-2.5474467E-07, 1.1521161E-09];
- self._M30 = [ #月球距离周期项
- 385000.5290396, 1.5707963268, 0.0000000000, 0.0000000E+00, 0.0000000E+00, 0.0000000E+00,-20905.3551378, 3.9263508990, 8328.6914247251, 1.5231275E-04, 2.5041111E-07,-1.1863391E-09,-3699.1109330, 9.6121753977, 7214.0628654588,-2.1850087E-04,-1.8646419E-07, 8.7760973E-10,-2955.9675626, 11.9677299699, 15542.7542901840,-6.6188121E-05, 6.3946925E-08,-3.0872935E-10,
- -569.9251264, 6.2819054713, 16657.3828494503, 3.0462550E-04, 5.0082223E-07,-2.3726782E-09, 246.1584797, 7.2566208254, -1114.6285592663,-3.7081362E-04,-4.3687530E-07, 2.0639488E-09, -204.5861179, 12.0108556517, 14914.4523349355,-6.3524240E-05, 6.3330532E-08,-2.5428962E-10, -170.7330791, 14.3232845422, 23871.4457149091, 8.6124629E-05, 3.1435804E-07,-1.4950684E-09,
- -152.1378118, 9.6553010794, 6585.7609102104,-2.1583699E-04,-1.8708058E-07, 9.3204945E-10, -129.6202242, -0.8278839272, -7700.3894694766,-1.5497663E-04,-2.4979472E-07, 1.1318993E-09, 108.7427014, 6.7692631483, 7771.3771450920,-3.3094061E-05, 3.1973462E-08,-1.5436468E-10, 104.7552944, 3.8832252173, 8956.9933799736, 1.4964887E-04, 2.5102751E-07,-1.2407788E-09,
- 79.6605685, 0.6705404095, -8538.2408905558, 2.8035534E-04, 2.6031101E-07,-1.2267725E-09, 48.8883284, 1.5276706450, 628.3019552485,-2.6638815E-06, 6.1639211E-10,-5.4439728E-11, -34.7825237, 20.0091090408, 22756.8171556428,-2.8468899E-04,-1.2251727E-07, 5.6888037E-10, 30.8238599, 11.9246042882, 16171.0562454324,-6.8852003E-05, 6.4563317E-08,-3.6316908E-10,
- 24.2084985, 9.5690497159, 7842.3648207073,-2.2116475E-04,-1.8584780E-07, 8.2317000E-10, -23.2104305, 8.6374600436, 24986.0742741754, 4.5693825E-04, 7.5123334E-07,-3.5590172E-09, -21.6363439, 17.6535544685, 14428.1257309177,-4.3700174E-04,-3.7292838E-07, 1.7552195E-09, -16.6747239, 6.7261374666, 8399.6791003405,-3.5757942E-05, 3.2589854E-08,-2.0880440E-10,
- 14.4026890, 4.9010662531, -9443.3199839914,-5.2312637E-04,-6.8728642E-07, 3.2502879E-09, -12.8314035, 14.3664102239, 23243.1437596606, 8.8788511E-05, 3.1374165E-07,-1.4406287E-09, -11.6499478, 22.3646636130, 31085.5085803679,-1.3237624E-04, 1.2789385E-07,-6.1745870E-10, -10.4447578, 16.6788391144, 32200.1371396342, 2.3843738E-04, 5.6476915E-07,-2.6814075E-09,
- 10.3211071, 8.7119194804, -1324.1780250970, 6.1854469E-05, 7.3846820E-08,-3.4916281E-10, 10.0562033, 7.2997465071, -1742.9305145148,-3.6814974E-04,-4.3749170E-07, 2.1183885E-09, -9.8844667, 12.0539813334, 14286.1503796870,-6.0860358E-05, 6.2714140E-08,-1.9984990E-10, 8.7515625, 6.3563649081, -9652.8694498221,-9.0458282E-05,-1.7656429E-07, 8.3717626E-10,
- -8.3791067, 4.4137085761, -557.3142796331,-1.8540681E-04,-2.1843765E-07, 1.0319744E-09, -7.0026961, -3.1834384995,-16029.0808942018,-3.0728938E-04,-5.0020584E-07, 2.3182384E-09, 6.3220032, 9.1248177206, 16100.0685698171, 1.1921869E-04, 2.8238458E-07,-1.3407038E-09, 5.7508579, 6.2387797896, 17285.6848046987, 3.0196162E-04, 5.0143862E-07,-2.4271179E-09,
- -4.9501349, 9.6984267611, 5957.4589549619,-2.1317311E-04,-1.8769697E-07, 9.8648918E-10, -4.4211770, 3.0260949818, -209.5494658307, 4.3266809E-04, 5.1072212E-07,-2.4131116E-09, 4.1311145, 11.0674740526, 7004.5133996281, 2.1416722E-04, 3.2425793E-07,-1.5355019E-09, -3.9579827, 20.0522347225, 22128.5152003943,-2.8202511E-04,-1.2313366E-07, 6.2332010E-10,
- 3.2582371, 14.8106422192, 14985.4400105508,-2.5159493E-04,-1.5449073E-07, 7.2324505E-10, -3.1483020, 4.8266068163, 16866.9323152810,-1.2804259E-04,-9.8998954E-09, 4.0433461E-11, 2.6164092, 14.2801588604, 24499.7476701576, 8.3460748E-05, 3.1497443E-07,-1.5495082E-09, 2.3536310, 9.5259240342, 8470.6667759558,-2.2382863E-04,-1.8523141E-07, 7.6873027E-10,
- -2.1171283, -0.8710096090, -7072.0875142282,-1.5764051E-04,-2.4917833E-07, 1.0774596E-09, -1.8970368, 17.6966801503, 13799.8237756692,-4.3433786E-04,-3.7354477E-07, 1.8096592E-09, -1.7385258, 2.0581540038, -8886.0057043583,-3.3771956E-04,-4.6884877E-07, 2.2183135E-09, -1.5713944, 22.4077892948, 30457.2066251194,-1.2971236E-04, 1.2727746E-07,-5.6301898E-10,
- -1.4225541, 24.7202181853, 39414.2000050930, 1.9936508E-05, 3.7830496E-07,-1.8037978E-09, -1.4189284, 17.1661967915, 23314.1314352759,-9.9282182E-05, 9.5920387E-08,-4.6309403E-10, 1.1655364, 3.8400995356, 9585.2953352221, 1.4698499E-04, 2.5164390E-07,-1.2952185E-09, -1.1169371, 10.9930146158, 33314.7656989005, 6.0925100E-04, 1.0016445E-06,-4.7453563E-09,
- 1.0656723, 1.4845449633, 1256.6039104970,-5.3277630E-06, 1.2327842E-09,-1.0887946E-10, 1.0586190, 11.9220903668, 8364.7398411275,-2.1850087E-04,-1.8646419E-07, 8.7760973E-10, -0.9333176, 9.0816920389, 16728.3705250656, 1.1655481E-04, 2.8300097E-07,-1.3951435E-09, 0.8624328, 12.4550876470, 6656.7485858257,-4.0390768E-04,-4.0490184E-07, 1.9095841E-09,
- 0.8512404, 4.3705828944, 70.9876756153,-1.8807069E-04,-2.1782126E-07, 9.7753467E-10, -0.8488018, 16.7219647962, 31571.8351843857, 2.4110126E-04, 5.6415276E-07,-2.6269678E-09, -0.7956264, 3.5134526588, -9095.5551701890, 9.4948529E-05, 4.1873358E-08,-1.9479814E-10];
- self._M31 = [ #
- 0.5139500, 12.0108556517, 14914.4523349355,-6.3524240E-05, 6.3330532E-08,-2.5428962E-10, 0.3824500, 9.6553010794, 6585.7609102104,-2.1583699E-04,-1.8708058E-07, 9.3204945E-10, 0.3265400, 3.9694765808, 7700.3894694766, 1.5497663E-04, 2.4979472E-07,-1.1318993E-09, 0.2639600, 0.7416325637, 8956.9933799736, 1.4964887E-04, 2.5102751E-07,-1.2407788E-09,
- 0.1230200, -1.6139220085, 628.3019552485,-2.6638815E-06, 6.1639211E-10,-5.4439728E-11, 0.0775400, 8.7830116346, 16171.0562454324,-6.8852003E-05, 6.4563317E-08,-3.6316908E-10, 0.0606800, 6.4274570623, 7842.3648207073,-2.2116475E-04,-1.8584780E-07, 8.2317000E-10, 0.0497000, 12.0539813334, 14286.1503796870,-6.0860358E-05, 6.2714140E-08,-1.9984990E-10];
- self._M1n = [ #月球平黄经系数
- 3.81034392032, 8.39968473021E+03,-3.31919929753E-05, 3.20170955005E-08,-1.53637455544E-10];
-
- #取整数部分
- def int2(self, v):
- v = math.floor(v);
- if (v < 0):
- return v+1;
-
- return v;
-
- # 对超过0-2PI的角度转为0-2PI
- def rad2mrad(self, v):
- v = v%(2*math.pi);
- if (v < 0):
- return v + 2*math.pi;
- return v;
-
- # 计算世界时与原子时之差,传入年
- def deltatT(self, y):
- dts = self._dts;
- for i in range(0, 100, 5):
- if (y < dts[i+5] or i == 95):
- break;
- #print('i = ', i, ', year = ', y, '>>>');
- t1 = (y - dts[i]) / (dts[i + 5] - dts[i]) * 10;
- t2 = t1 * t1;
- t3 = t2 * t1;
- return dts[i + 1] + dts[i + 2] * t1 + dts[i + 3] * t2 + dts[i + 4] * t3;
-
-
- # 传入儒略日(J2000起算),计算UTC与原子时的差(单位:日)
- def deltatT2(self, jd):
- return self.deltatT(jd / 365.2425 + 2000) / 86400.0; #一天86400秒
-
-
- # 公历转儒略日,UTC=1表示原日期是UTC
- # UTC是布尔值,取值为0或1
- def toJD(self, UTC):
- y = self._Y; # 取出年月
- m = self._M;
- n = 0;
- if (m <= 2):
- m += 12;
- y -= 1;
-
- if (self._Y * 372 + self._M * 31 + self._D >= 588829):
- # 判断是否为格里高利历日1582*372+10*31+15
- n = self.int2(y / 100);
- n = 2 - n + self.int2(n / 4);# 加百年闰
-
- n += self.int2(365.2500001 * (y + 4716)); # 加上年引起的偏移日数
- n += self.int2(30.6 * (m + 1)) + self._D; # 加上月引起的偏移日数及日偏移数
- n += ((self._s / 60 + self._m) / 60 + self._h) / 24 - 1524.5;
- if (UTC):
- return n + self.deltatT2(n - self._J2000);
- return n;
-
- # 公历转儒略日,UTC=1表示原日期是UTC
- # UTC是布尔值,取值为0或1
- # array 为[Y, M, D, h, m, s]的格式化时间阵列
- def arrayToJD(self, array, UTC = True):
- Y = array[0]; # 取出年月
- M = array[1];
- D = array[2];
- h = array[3];
- m = array[4];
- s = array[5];
-
- n = 0;
- if (M <= 2):
- M += 12;
- Y -= 1;
-
- if (Y * 372 + M * 31 + D >= 588829):
- # 判断是否为格里高利历日1582*372+10*31+15
- n = self.int2(Y / 100);
- n = 2 - n + self.int2(n / 4);# 加百年闰
-
- n += self.int2(365.2500001 * (Y + 4716)); # 加上年引起的偏移日数
- n += self.int2(30.6 * (M + 1)) + D; # 加上月引起的偏移日数及日偏移数
- n += ((s / 60 + m) / 60 + h) / 24 - 1524.5;
- if (UTC):
- return n + self.deltatT2(n - self._J2000);
- return n;
-
- # 儒略日数转公历,UTC=1表示目标公历是UTC
- #boolean UTC
- def setFromJD(self, jd, UTC):
- if (UTC):
- jd -= self.deltatT2(jd - self._J2000);
- jd += 0.5;
- # 取得日数的整数部份A及小数部分F
- A = self.int2(jd);
- F = jd - A;
- D = 0;
- if (A > 2299161):
- D = self.int2((A - 1867216.25) / 36524.25);
- A += 1 + D - self.int2(D / 4);
-
- A += 1524; # 向前移4年零2个月
- self._Y = self.int2((A - 122.1) / 365.25);# 年
- D = A - self.int2(365.25 * self._Y); # 去除整年日数后余下日数
- self._M = self.int2(D / 30.6001); # 月数
- self._D = D - self.int2(self._M * 30.6001);# 去除整月日数后余下日数
- self._Y -= 4716;
- self._M-=1;
- if (self._M > 12):
- self._M -= 12;
- if (self._M <= 2):
- self._Y+=1;
- # 日的小数转为时分秒
- F *= 24;
- self._h = self.int2(F);
- F -= self._h;
- F *= 60;
- self._m = self.int2(F);
- F -= self._m;
- F *= 60;
- self._s = F;
-
- # 设置时间,参数例:"20000101 120000"或"20000101"
- def setFromStr(self, s):
- self._Y = decimal.Decimal(s[0:4]);
- self._M = decimal.Decimal(s[4:6]);
- self._D = decimal.Decimal(s[6:8]);
-
- if (len(s) > 9):
- self._h = decimal.Decimal(s[9:11]);
- self._m = decimal.Decimal(s[11:13]);
- self._s = decimal.Decimal(s[13:15]); # 将5改为了2
- else:
- self._h = decimal.Decimal('00');
- self._m = decimal.Decimal('00');
- self._s = decimal.Decimal('00'); # 将5改为了2
-
- self._Y = float(self._Y);
- self._M = float(self._M);
- self._D = float(self._D);
- self._h = float(self._h);
- self._m = float(self._m);
- self._s = float(self._s);
-
-
- # 日期转为串
- def toStr(self):
- Y = " " + str(int(self._Y));#四个空格
- M = "0" + str(int(self._M));
- D = "0" + str(int(self._D));
- h = self._h;
- m = self._m;
- s = math.floor(self._s + 0.5);
- if (s >= 60):
- s -= 60;
- m+=1;
-
- if (m >= 60):
- m -= 60;
- h+=1;
-
- sh = "0" + str(int(h));
- sm = "0" + str(int(m));
- ss = "0" + str(int(s));
-
- Y = Y[len(Y)-5:2*len(Y)-5];
- M = M[len(M)-2:2*len(M)-2];
- D = D[len(D)-2:2*len(D)-2];
- sh = sh[len(sh)-2:2*len(sh)-2];
- sm = sm[len(sm)-2:2*len(sm)-2];
- ss = ss[len(ss)-2:2*len(ss)-2];
-
- return Y + "-" + M + "-" + D + " " + sh + ":" + sm + ":" + ss;
-
- #日期转为数组
- def toArray(self):
- Y = int(self._Y);
- M = int(self._M);
- D = int(self._D);
- h = int(self._h);
- m = int(self._m);
- s = math.floor(self._s + 0.5);
-
- return [Y, M, D, h, m, s];
-
-
-
-
- # 算出:jd转到当地UTC后,UTC日数的整数部分或小数部分
- # 基于J2000力学时jd的起算点是12:00:00时,所以跳日时刻发生在12:00:00,这与日历计算发生矛盾
- # 把jd改正为00:00:00起算,这样儒略日的跳日动作就与日期的跳日同步
- # 改正方法为jd=jd+0.5-deltatT+shiqu/24
- # 把儒略日的起点移动-0.5(即前移12小时)
- # 式中shiqu是时区,北京的起算点是-8小时,shiqu取8
- # 参数类型:double jd, int shiqu, boolean dec
- def Dint_dec(self, jd, shiqu, dec = 1):
- u = jd + 0.5 - self.deltatT2(jd) + shiqu / 24;
- if (dec):
- return math.floor(u); # 返回整数部分
- else:
- return u - math.floor(u); # 返回小数部分
-
- # 计算两个日期的相差的天数,输入字串格式日期,如:"20080101"
- def d1_d2(self, d1, d2):
- Y = self._Y;
- M = self._M;
- D = self._D;
- h = self._h;
- m = self._m
- s = self._s; # 备份原来的数据
-
- self.setFromStr(d1[0:8] + " 120000");
- jd1 = self.toJD(False);
- self.setFromStr(d2[0:8] + " 120000");
- jd2 = self.toJD(False);
- self._Y = Y;
- self._M = M;
- self._D = D;
- self._h = h;
- self._m = m;
- self._s = s; # 还原
- if (jd1 > jd2):
- return math.floor(jd1 - jd2 + .0001);
- else:
- return -math.floor(jd2 - jd1 + .0001);
-
-
- # 返回黄赤交角(常规精度),短期精度很高
- def hcjj1(self, t):
- hcjjB = self._hcjjB;
- rad = self._rad;
-
- t1 = t / 36525;
- t2 = t1 * t1;
- t3 = t2 * t1;
- return (hcjjB[0] + hcjjB[1] * t1 + hcjjB[2] * t2 + hcjjB[3] * t3) / rad;
-
-
- # 黄赤转换(黄赤坐标旋转)
- #传入经纬度数组,运算后传出
- def HCconv(self, JW, E):
- # 黄道赤道坐标变换,赤到黄E取负
- HJ = self.rad2mrad(JW[0]);
- HW = JW[1];
- sinE = math.sin(E);
- cosE = math.cos(E);
- sinW = cosE * math.sin(HW) + sinE * math.cos(HW) * math.sin(HJ);
- #如果出了错,一定要来看看这个atan2的处理
- J = math.atan2(math.sin(HJ) * cosE - math.tan(HW) * sinE, math
- .cos(HJ));
- JW[0] = self.rad2mrad(J);
- JW[1] = math.asin(sinW);
- return JW;
-
- # 补岁差
- #double jd, double[] zb
- def addPrece(self, jd, zb):
- rad = self._rad;
- preceB = self._preceB;
-
- t = 1;
- v = 0;
- t1 = jd / 365250;
- for i in range(1, 8):
- t *= t1;
- v += preceB[i] * t;
-
- zb[0] = self.rad2mrad(zb[0] + (v + 2.9965 * t1) / rad);
- return zb;
-
- # 恒星周年光行差计算(黄道坐标中)
- def addGxc(self, t, zb):
- GXC_l = self._GXC_l;
- GXC_p = self._GXC_p;
- GXC_e = self._GXC_e;
- GXC_k = self._GXC_k;
-
-
- t1 = t / 36525;
- t2 = t1 * t1;
- t3 = t2 * t1;
- t4 = t3 * t1;
- L = GXC_l[0] + GXC_l[1] * t1 + GXC_l[2] * t2 + GXC_l[3] * t3 + GXC_l[4] * t4;
- p = GXC_p[0] + GXC_p[1] * t1 + GXC_p[2] * t2;
- e = GXC_e[0] + GXC_e[1] * t1 + GXC_e[2] * t2;
- dL = L - zb[0];
- dP = p - zb[0];
- zb[0] -= GXC_k * (math.cos(dL) - e * math.cos(dP)) / math.cos(zb[1]);
- zb[1] -= GXC_k * math.sin(zb[1]) * (math.sin(dL) - e * math.sin(dP));
- zb[0] = self.rad2mrad(zb[0]);
-
- return zb;
-
- # 计算黄经章动及交角章动
- # 返回章动结构体[lon, obl]这个数值对
- def nutation(self, t):
- nutB = self._nutB;
- rad = self._rad;
-
-
- #这个是传回的章动量
- d = [0]*2;
- d[0] = 0;
- d[1] = 0;
- t /= 36525;
-
- c = 0;
- t1 = t;
- t2 = t1 * t1;
- t3 = t2 * t1;
- t4 = t3 * t1;# t5=t4*t1;
-
- for i in range(0, len(nutB), 9):
- c = nutB[i] + nutB[i + 1] * t1 + nutB[i + 2] * t2 + nutB[i + 3] * t3 + nutB[i + 4] * t4;
- d[0] += (nutB[i + 5] + nutB[i + 6] * t / 10) * math.sin(c); # 黄经章动
- d[1] += (nutB[i + 7] + nutB[i + 8] * t / 10) * math.cos(c); # 交角章动
-
- d[0] /= rad * 10000; # 黄经章动
- d[1] /= rad * 10000; # 交角章动
- return d;
-
-
- # 本函数计算赤经章动及赤纬章动
- #传入和传出zb
- def nutationRaDec(self, t, zb):
- Ra = zb[0];
- Dec = zb[1];
- E = self.hcjj1(t);
- sinE = math.sin(E);
- cosE = math.cos(E); # 计算黄赤交角
-
- #章动
- d = self.nutation(t); # 计算黄经章动及交角章动
- cosRa = math.cos(Ra);
- sinRa = math.sin(Ra);
- tanDec = math.tan(Dec);
- zb[0] += (cosE + sinE * sinRa * tanDec) * d[0] - cosRa * tanDec * d[1]; # 赤经章动
- zb[1] += sinE * cosRa * d[0] + sinRa * d[1]; # 赤纬章动
- zb[0] = self.rad2mrad(zb[0]);
- return zb;
-
-
- # 计算E10,E11,E20等,即:某一组周期项或泊松项算出,计算前先设置EnnT时间
- #传入F
- def Enn(self, F):
- v = 0;
- EnnT = self._EnnT;
-
- for i in range(0, len(F), 3):
- v += F[i] * math.cos(F[i + 1] + EnnT * F[i + 2]);
- return v;
-
- # 返回地球位置,日心Date黄道分点坐标
- def earCal(self, jd):
- E10 = self._E10;
- E11 = self._E11;
- E12 = self._E12;
- E13 = self._E13;
- E14 = self._E14;
- E15 = self._E15;
-
- E20 = self._E20;
- E21 = self._E21;
-
- E30 = self._E30;
- E31 = self._E31;
- E32 = self._E32;
- E33 = self._E33;
-
- #设置
- self._EnnT = jd / 365250;
- EnnT = self._EnnT;
- llr = [0]*3;
-
- t1 = EnnT;
- t2 = t1 * t1;
- t3 = t2 * t1;
- t4 = t3 * t1;
- t5 = t4 * t1;
- llr[0] = self.Enn(E10) + self.Enn(E11) * t1 + self.Enn(E12) * t2 + self.Enn(E13) * t3 + self.Enn(E14) * t4 + self.Enn(E15) * t5;
- llr[1] = self.Enn(E20) + self.Enn(E21) * t1;
- llr[2] = self.Enn(E30) + self.Enn(E31) * t1 + self.Enn(E32) * t2 + self.Enn(E33) * t3;
- llr[0] = self.rad2mrad(llr[0]);
- return llr;
-
- # 传回jd时刻太阳的地心视黄经及黄纬
- def sunCal2(self, jd):
- sun = self.earCal(jd);
- sun[0] += math.pi;
- sun[1] = -sun[1]; # 计算太阳真位置
-
- #章动
- d = self.nutation(jd);
- sun[0] = self.rad2mrad(sun[0] + d[0]); # 补章动
- sun = self.addGxc(jd, sun); # 补周年黄经光行差
- return sun; # 返回太阳视位置
-
-
-
- # 计算M10,M11,M20等,计算前先设置MnnT时间
- def Mnn(self, F):
- v = 0;
- t1 = self._MnnT;
- t2 = t1 * t1;
- t3 = t2 * t1;
- t4 = t3 * t1;
-
- for i in range(0, len(F), 6):
- v += F[i] * math.sin(F[i + 1] + t1 * F[i + 2] + t2 * F[i + 3] + t3 * F[i + 4] + t4 * F[i + 5]);
- return v;
-
- # 返回月球位置,返回地心Date黄道坐标
- def moonCal(self, jd):
- M10 = self._M10;
- M11 = self._M11;
- M12 = self._M12;
-
- M20 = self._M20;
- M21 = self._M21;
-
- M30 = self._M30;
- M31 = self._M31;
- M1n = self._M1n;
-
- self._MnnT = jd / 36525;
- MnnT = self._MnnT;
- rad = self._rad;
-
- t1 = MnnT;
- t2 = t1 * t1;
- t3 = t2 * t1;
- t4 = t3 * t1;
-
- llr = [0]*3;
- llr[0] = (self.Mnn(M10) + self.Mnn(M11) * t1 + self.Mnn(M12) * t2) / rad;
- llr[1] = (self.Mnn(M20) + self.Mnn(M21) * t1) / rad;
- llr[2] = (self.Mnn(M30) + self.Mnn(M31) * t1) * 0.999999949827;
- llr[0] = llr[0] + M1n[0] + M1n[1] * t1 + M1n[2] * t2 + M1n[3] * t3 + M1n[4] * t4;
- llr[0] = self.rad2mrad(llr[0]); # 地心Date黄道原点坐标(不含岁差)
- llr = self.addPrece(jd, llr); # 补岁差
- return llr;
-
- # 传回月球的地心视黄经及视黄纬
- def moonCal2(self, jd):
- moon = self.moonCal(jd);
- #章动
- d = self.nutation(jd);
- moon[0] = self.rad2mrad(moon[0] + d[0]); # 补章动
- return moon;
-
- # 传回月球的地心视赤经及视赤纬
- def moonCal3(self, jd):
- moon = self.moonCal(jd);
- moon = self.HCconv(moon, self.hcjj1(jd));
- moon = self.nutationRaDec(jd, moon); # 补赤经及赤纬章动
- # 如果黄赤转换前补了黄经章动及交章动,就不能再补赤经赤纬章动
- return moon;
-
-
-
- # ==================地心坐标中的日月位置计算===================
- def jiaoCai(self, lx, t, jiao):
- # lx=1时计算t时刻日月角距与jiao的差, lx=0计算t时刻太阳黄经与jiao的差
- sun = self.earCal(t); # 计算太阳真位置(先算出日心坐标中地球的位置)
- sun[0] += math.pi;
- sun[1] = -sun[1]; # 转为地心坐标
- sun = self.addGxc(t, sun); # 补周年光行差
- if (lx == 0):
- #章动
- d = self.nutation(t);
- sun[0] += d[0]; # 补黄经章动
- return self.rad2mrad(jiao - sun[0]);
-
- moon = self.moonCal(t); # 日月角差与章动无关
- return self.rad2mrad(jiao - (moon[0] - sun[0]));
-
-
- # ==================已知位置反求时间===================
- def jiaoCal(self, t1, jiao, lx):
- # t1是J2000起算儒略日数
- # 已知角度(jiao)求时间(t)
- # lx=0是太阳黄经达某角度的时刻计算(用于节气计算)
- # lx=1是日月角距达某角度的时刻计算(用于定朔望等)
- # 传入的t1是指定角度对应真时刻t的前一些天
- # 对于节气计算,应满足t在t1到t1+360天之间,对于Y年第n个节气(n=0是春分),t1可取值Y*365.2422+n*15.2
- # 对于朔望计算,应满足t在t1到t1+25天之间,在此范围之外,求右边的根
- t2 = t1;
- t = 0;
- v = 0;
- if (lx == 0):
- t2 += 360; # 在t1到t2范围内求解(范气360天范围),结果置于t
- else:
- t2 += 25;
- jiao *= math.pi / 180; # 待搜索目标角
- # 利用截弦法计算
- v1 = self.jiaoCai(lx, t1, jiao); # v1,v2为t1,t2时对应的黄经
- v2 = self.jiaoCai(lx, t2, jiao);
- if (v1 < v2):
- v2 -= 2 * math.pi; # 减2pi作用是将周期性角度转为连续角度
- k = 1;
- k2 = 0; # k是截弦的斜率
-
- for i in range(10): # 快速截弦求根,通常截弦三四次就已达所需精度
- k2 = (v2 - v1) / (t2 - t1); # 算出斜率
- if (abs(k2) > 1e-15):
- k = k2; # 差商可能为零,应排除
- t = t1 - v1 / k;
- v = self.jiaoCai(lx, t, jiao);# 直线逼近法求根(直线方程的根)
- if (v > 1):
- v -= 2 * math.pi; # 一次逼近后,v1就已接近0,如果很大,则应减1周
- if (abs(v) < 1e-8):
- break; # 已达精度
- t1 = t2;
- v1 = v2;
- t2 = t;
- v2 = v; # 下一次截弦
-
- return t;
-
- # 节气使计算范例,y是年分,这是个测试函数
- def JQtest(self, y):
- J2000 = self._J2000;
-
- jqB = [ #节气表
- "春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露",
- "秋分","寒露","霜降","立冬","小雪","大雪","冬至","小寒","大寒","立春","雨水","惊蛰"];
-
- jd = 365.2422 * (y - 2000);
- q = 0;
- s1 = '';
- s2 = '';
-
- for i in range(24):
- q = self.jiaoCal(jd + i * 15.2, i * 15, 0);
- q = q + J2000 + 8 / 24; # 计算第i个节气(i=0是春风),结果转为北京时
- self.setFromJD(q, True);
- s1 = self.toStr(); # 将儒略日转成世界时
- self.setFromJD(q, False);
- s2 = self.toStr(); # 将儒略日转成日期格式(输出日期形式的力学时)
- print(jqB[i] + " : " + s1 + " " + s2); # 显示
-
- # =================定朔弦望计算========================
- def dingSuo(self, y, arc): # 这是个测试函数
- J2000 = self._J2000;
-
-
- jd = 365.2422 * (y - 2000);
- q = 0;
-
- s1 = '';
- s2 = '';
-
- print("月份:世界时 原子时");
- for i in range(12):
- q = self.jiaoCal(jd + 29.5 * i, arc, 1) + J2000 + 8 / 24; # 计算第i个节气(i=0是春风),结果转为北京时
- self.setFromJD(q, True);
- s1 = self.toStr(); # 将儒略日转成世界时
- self.setFromJD(q, False);
- s2 = self.toStr(); # 将儒略日转成日期格式(输出日期形式的力学时)
- print(str(i + 1) + "月 : " + s1 + " " + s2); # 显示
-
-
- #=================农历计算========================
- '''
- /*****
- * 1.冬至所在的UTC日期保存在A[0],根据"规定1"得知在A[0]之前(含A[0])的那个UTC朔日定为年首日期
- * 冬至之后的中气分保存在A[1],A[2],A[3]...A[13],其中A[12]又回到了冬至,共计算13次中气
- * 2.连续计算冬至后14个朔日,即起算时间时A[0]+1 14个朔日编号为0,1...12,保存在C[0],C[1]...C[13]
- * 这14个朔日表示编号为0月,1月,...12月0月的各月终止日期,但要注意实际终止日是新月初一,不属本月
- * 这14个朔日同样表示编号为1月,2月...的开始日期
- * 设某月编号为n,那么开始日期为C[n-1],结束日期为C[n],如果每月都含中气,该月所含的中气为A[n]
- * 注:为了全总计算出13个月的大小月情况,须算出14个朔日。 3.闰年判断:含有13个月的年份是闰年 当第13月(月编号12月)终止日期大于冬至日,
- * 即C[12]〉A[12], 那么该月是新年,本年没月12月,本年共12个月
- * 当第13月(月编号12月)终止日期小等于冬至日,即C[12]≤A[12],那么该月是本年的有效月份,本年共13个月 4.闰年中处理闰月:
- * 13个月中至少1个月份无中气,首个无中气的月置闰,在n=1...12月中找到闰月,即C[n]≤A[n]
- * 从农历年首的定义知道,0月一定含有中气冬至,所以不可能是闰月。 首月有时很贪心,除冬至外还可能再吃掉本年或前年的另一个中气
- * 定出闰月后,该月及以后的月编号减1 5.以上所述的月编号不是日常生活中说的"正月","二月"等月名称:
- * 如果"建子",0月为首月,如果"建寅",2月的月名"正月",3月是"二月",其余类推
- *****/
- '''
-
- # 农历排月序计算,可定出农历
- def paiYue(self, y):
- J2000 = self._J2000;
- yueMing = [ "正", "二", "三", "四", "五", "六",
- "七", "八", "九", "十", "十一", "十二" ];
- jqB = [ #节气表
- "春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露",
- "秋分","寒露","霜降","立冬","小雪","大雪","冬至","小寒","大寒","立春","雨水","惊蛰"];
- #中气
- zq = [0]*20;
- #节气
- jq = [0]*20;
- #全朔表
- hs = [0]*20;
-
- # var zq=new Array(),jq=new Array(), hs=new Array(); #中气表,节气表,日月合朔表
- # 从冬至开始,连续计算14个中气时刻
- t1 = 365.2422 * (y - 2000) - 50; # 农历年首始于前一年的冬至,为了节气中气一起算,取前年大雪之前
- for i in range(14): # 计算节气(从冬至开始),注意:返回的是力学时
- zq[i] = self.jiaoCal(t1 + i * 30.4, i * 30 - 90, 0); # 中气计算,冬至的太阳黄经是270度(或-90度)
- jq[i] = self.jiaoCal(t1 + i * 30.4, i * 30 - 105, 0); # 顺便计算节气,它不是农历定朔计算所必需的
-
- # 在冬至过后,连续计算14个日月合朔时刻
- dongZhiJia1 = zq[0] + 1 - self.Dint_dec(zq[0], 8, False); # 冬至过后的第一天0点的儒略日数
- hs[0] = self.jiaoCal(dongZhiJia1, 0, 1); # 首月结束的日月合朔时刻
- for i in range(1, 14):
- hs[i] = self.jiaoCal(hs[i - 1] + 25, 0, 1);
- # 算出中气及合朔时刻的日数(不含小数的日数计数,以便计算日期之间的差值)
- A = [0]*20;
- B = [0]*20;
- C = [0]*20;
-
- # var A=new Array(), B=new Array(), C=new Array();
- for i in range(14):# 取当地UTC日数的整数部分
- A[i] = self.Dint_dec(zq[i], 8, True);
- B[i] = self.Dint_dec(jq[i], 8, True);
- C[i] = self.Dint_dec(hs[i], 8, True);
-
- # 闰月及大小月分析
- tot = 12;
- nun = -1;
- yn = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0 ]; # 月编号
- if (C[12] <= A[12]): # 闰月分析 合朔小于中气
- #print(C[12], A[12]);
-
- yn[12] = 12;
- tot = 13; # 编号为12的月是本年的有效月份,本年总月数13个
- for i in range(1, 13):
- if (C[i] <= A[i]):
- #print(i);
- break;
- nun = i-1;
- for j in range(nun, 13):
- yn[j] = j; # 注意yn中不含农历首月(所以取i-1),在公历中农历首月总是去年的所以不多做计算
- #print(nun); #打印闰月的月份
- #print(yn); #打印月序阵列
-
- syn= ['0']*20;
- for i in range(tot): # 转为建寅月名,并做大小月分析
- syn[i] = yueMing[(yn[i] + 10)%12]; # 转建寅月名
- if (i == nun):
- syn[i] += "闰";
- else:
- syn[i] += "月"; # 标记是否闰月
- if (C[i + 1] - C[i] > 29):
- syn[i] += "大";
- else:
- syn[i] += "小"; # 标记大小月
-
- # 显示
- out = '{0:^3}{1:^19}{2:^3}{3:^19}{4:^4}{5:^20}'.format('节气', '手表时', '中气', '手表时', '农历月', '朔的手表时');
- print(out);
- out = '';
- for i in range(tot):
- zm = (i * 2 + 18)%24;
- jm = (i * 2 + 17)%24; # 中气名节气名
- self.setFromJD(jq[i] + J2000 + 8 / 24, True);
- out += jqB[jm] + ":" + self.toStr() + " "; # 显示节气
- self.setFromJD(zq[i] + J2000 + 8 / 24, True);
- out += jqB[zm] + ":" + self.toStr() + " "; # 显示中气
- self.setFromJD(hs[i] + J2000 + 8 / 24, True);
- out += syn[i] + ":" + self.toStr() + "\r\n"; # 显示日月合朔
-
- print(out);
-
- # 农历排月序计算,可定出农历
- # 返回当年的各节各气,各月的一个将所有时间排序后的格式化数组
- def paiYueCalc(self, y):
- J2000 = self._J2000;
- yueMing = [ "正", "二", "三", "四", "五", "六",
- "七", "八", "九", "十", "十一", "十二" ];
- jqB = [ #节气表
- "春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露",
- "秋分","寒露","霜降","立冬","小雪","大雪","冬至","小寒","大寒","立春","雨水","惊蛰"];
- #中气
- zq = [0]*20;
- #节气
- jq = [0]*20;
- #全朔表
- hs = [0]*20;
-
- # var zq=new Array(),jq=new Array(), hs=new Array(); #中气表,节气表,日月合朔表
- # 从冬至开始,连续计算14个中气时刻
- t1 = 365.2422 * (y - 2000) - 50; # 农历年首始于前一年的冬至,为了节气中气一起算,取前年大雪之前
- for i in range(14): # 计算节气(从冬至开始),注意:返回的是力学时
- zq[i] = self.jiaoCal(t1 + i * 30.4, i * 30 - 90, 0); # 中气计算,冬至的太阳黄经是270度(或-90度)
- jq[i] = self.jiaoCal(t1 + i * 30.4, i * 30 - 105, 0); # 顺便计算节气,它不是农历定朔计算所必需的
-
- # 在冬至过后,连续计算14个日月合朔时刻
- dongZhiJia1 = zq[0] + 1 - self.Dint_dec(zq[0], 8, False); # 冬至过后的第一天0点的儒略日数
- hs[0] = self.jiaoCal(dongZhiJia1, 0, 1); # 首月结束的日月合朔时刻
- for i in range(1, 14):
- hs[i] = self.jiaoCal(hs[i - 1] + 25, 0, 1);
- # 算出中气及合朔时刻的日数(不含小数的日数计数,以便计算日期之间的差值)
- A = [0]*20;
- B = [0]*20;
- C = [0]*20;
-
- # var A=new Array(), B=new Array(), C=new Array();
- for i in range(14):# 取当地UTC日数的整数部分
- A[i] = self.Dint_dec(zq[i], 8, True);
- B[i] = self.Dint_dec(jq[i], 8, True);
- C[i] = self.Dint_dec(hs[i], 8, True);
-
- # 闰月及大小月分析
- tot = 12;
- nun = -1;
- yn = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0 ]; # 月编号
- if (C[12] <= A[12]): # 闰月分析 合朔小于中气
- #print(C[12], A[12]);
-
- yn[12] = 12;
- tot = 13; # 编号为12的月是本年的有效月份,本年总月数13个
- for i in range(1, 13):
- if (C[i] <= A[i]):
- #print(i);
- break;
- nun = i-1;
- for j in range(nun, 13):
- yn[j] = j; # 注意yn中不含农历首月(所以取i-1),在公历中农历首月总是去年的所以不多做计算
- #print(nun); #打印闰月的月份
- #print(yn); #打印月序阵列
-
- syn= ['0']*20;
- for i in range(tot): # 转为建寅月名,并做大小月分析
- syn[i] = yueMing[(yn[i] + 10)%12]; # 转建寅月名
- if (i == nun):
- syn[i] += "闰";
- else:
- syn[i] += "月"; # 标记是否闰月
- if (C[i + 1] - C[i] > 29):
- syn[i] += "大";
- else:
- syn[i] += "小"; # 标记大小月
-
- result = [];
-
- for i in range(tot):
- zm = (i * 2 + 18)%24;
- jm = (i * 2 + 17)%24; # 中气名节气名
- self.setFromJD(jq[i] + J2000 + 8 / 24, True);
- a = self.toArray();
- result.append([jqB[jm], a]);
-
- self.setFromJD(zq[i] + J2000 + 8 / 24, True);
- a = self.toArray();
- result.append([jqB[zm], a]);
-
- self.setFromJD(hs[i] + J2000 + 8 / 24, True);
- a = self.toArray();
- result.append([syn[i], a]);
-
- result = sorted(result, key=lambda a:a[1]);
-
- return result;
- '''
- # 显示
- out = '{0:^3}{1:^19}{2:^3}{3:^19}{4:^4}{5:^20}'.format('节气', '手表时', '中气', '手表时', '农历月', '朔的手表时');
- print(out);
- out = '';
- for i in range(tot):
- zm = (i * 2 + 18)%24;
- jm = (i * 2 + 17)%24; # 中气名节气名
- self.setFromJD(jq[i] + J2000 + 8 / 24, True);
- out += jqB[jm] + ":" + self.toStr() + " "; # 显示节气
- self.setFromJD(zq[i] + J2000 + 8 / 24, True);
- out += jqB[zm] + ":" + self.toStr() + " "; # 显示中气
- self.setFromJD(hs[i] + J2000 + 8 / 24, True);
- out += syn[i] + ":" + self.toStr() + "\r\n"; # 显示日月合朔
- print(out);
- '''
-
-
- def print(self):
- self.paiYue(-999);</span>

当然,还有一部分计算四柱的代码,现在阿伟不贴,等以后修炼到八字排盘和子平八字时再贴。
工具既然有了,当然要验证一下它的精准度,否则以后推算历史时间,谁能信服呢。
下面是一些对比数据:
节气是肯定没问题的了,毕竟用的是同一套代码。
下面主要看下四柱的推算:
也就是说近代以至未来的所有数据都是一样的,下面看远一点的近代。
可见年,日,时是完全没异议的,月柱上差一个月,但阿伟觉得计算的没什么问题,
所有相差时间都明白摆着呢。
所以这个可以到时结合当年的史书来对比判断,先各自保留意见。
由于不管怎么说,大家的差异只在一月或一天之间,阿伟觉得这个计算代码是可置信的。
于是历法就这么定了。
本节到此结束,欲知后事如何,请看下回分解。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。