分享

万年历计算 之 节气(2)

 十八小子 2013-03-12

5.2、黄经:(算法描述请参考相关书籍,为了节省空间和时间,这里请罗列出 C++ 实现代码)

         //
         // 计算太阳黄经用参数
         const VSOP87COEFFICIENT Earth_SLG0[64] =
         {
            { 175347046.0 ,   0.0000000 ,   000000.0000000 } ,
            {   3341656.0 ,   4.6692568 ,     6283.0758500 } ,
            {     34894.0 ,   4.6261000 ,    12566.1517000 } ,
            {      3497.0 ,   2.7441000 ,     5753.3849000 } ,
            {      3418.0 ,   2.8289000 ,        3.5231000 } ,
            {      3136.0 ,   3.6277000 ,    77713.7715000 } ,
            {      2676.0 ,   4.4181000 ,     7860.4194000 } ,
            {      2343.0 ,   6.1352000 ,     3930.2097000 } ,
            {      1324.0 ,   0.7425000 ,    11506.7698000 } ,
            {      1273.0 ,   2.0371000 ,      529.6910000 } ,
            {      1199.0 ,   1.1096000 ,     1577.3435000 } ,
            {       990.0 ,   5.2330000 ,     5884.9270000 } ,
            {       902.0 ,   2.0450000 ,       26.2980000 } ,
            {       857.0 ,   3.5080000 ,      398.1490000 } ,
            {       780.0 ,   1.1790000 ,     5223.6940000 } ,
            {       753.0 ,   2.5330000 ,     5507.5530000 } ,
            {       505.0 ,   4.5830000 ,    18849.2280000 } ,
            {       492.0 ,   4.2050000 ,      775.5230000 } ,
            {       357.0 ,   2.9200000 ,   000000.0670000 } ,
            {       317.0 ,   5.8490000 ,    11790.6290000 } ,
            {       284.0 ,   1.8990000 ,      796.2880000 } ,
            {       271.0 ,   0.3150000 ,    10977.0790000 } ,
            {       243.0 ,   0.3450000 ,     5486.7780000 } ,
            {       206.0 ,   4.8060000 ,     2544.3140000 } ,
            {       205.0 ,   1.8690000 ,     5573.1430000 } ,
            {       202.0 ,   2.4580000 ,     6069.7770000 } ,
            {       156.0 ,   0.8330000 ,      213.2990000 } ,
            {       132.0 ,   3.4110000 ,     2942.4630000 } ,
            {       126.0 ,   1.0830000 ,       20.7750000 } ,
            {       115.0 ,   0.6450000 ,   000000.9800000 } ,
            {       103.0 ,   0.6360000 ,     4694.0030000 } ,
            {       102.0 ,   0.9760000 ,    15720.8390000 } ,
            {       102.0 ,   4.2670000 ,        7.1140000 } ,
            {        99.0 ,   6.2100000 ,     2146.1700000 } ,
            {        98.0 ,   0.6800000 ,      155.4200000 } ,
            {        86.0 ,   5.9800000 ,   161000.6900000 } ,
            {        85.0 ,   1.3000000 ,     6275.9600000 } ,
            {        85.0 ,   3.6700000 ,    71430.7000000 } ,
            {        80.0 ,   1.8100000 ,    17260.1500000 } ,
            {        79.0 ,   3.0400000 ,    12036.4600000 } ,
            {        75.0 ,   1.7600000 ,     5088.6300000 } ,
            {        74.0 ,   3.5000000 ,     3154.6900000 } ,
            {        74.0 ,   4.6800000 ,      801.8200000 } ,
            {        70.0 ,   0.8300000 ,     9437.7600000 } ,
            {        62.0 ,   3.9800000 ,     8827.3900000 } ,
            {        61.0 ,   1.8200000 ,     7084.9000000 } ,
            {        57.0 ,   2.7800000 ,     6286.6000000 } ,
            {        56.0 ,   4.3900000 ,    14143.5000000 } ,
            {        56.0 ,   3.4700000 ,     6279.5500000 } ,
            {        52.0 ,   0.1900000 ,    12139.5500000 } ,
            {        52.0 ,   1.3300000 ,     1748.0200000 } ,
            {        51.0 ,   0.2800000 ,     5856.4800000 } ,
            {        49.0 ,   0.4900000 ,     1194.4500000 } ,
            {        41.0 ,   5.3700000 ,     8429.2400000 } ,
            {        41.0 ,   2.4000000 ,    19651.0500000 } ,
            {        39.0 ,   6.1700000 ,    10447.3900000 } ,
            {        37.0 ,   6.0400000 ,    10213.2900000 } ,
            {        37.0 ,   2.5700000 ,     1059.3800000 } ,
            {        36.0 ,   1.7100000 ,     2352.8700000 } ,
            {        36.0 ,   1.7800000 ,     6812.7700000 } ,
            {        33.0 ,   0.5900000 ,    17789.8500000 } ,
            {        30.0 ,   0.4400000 ,    83996.8500000 } ,
            {        30.0 ,   2.7400000 ,     1349.8700000 } ,
            {        25.0 ,   3.1600000 ,     4690.4800000 }
         };
         const VSOP87COEFFICIENT Earth_SLG1[34] =
         {
            { 628331966747.0 , 0.000000 ,   00000.0000000 } ,
            {       206059.0 , 2.678235 ,    6283.0758500 } ,
            {         4303.0 , 2.635100 ,   12566.1517000 } ,
            {          425.0 , 1.590000 ,       3.5230000 } ,
            {          119.0 , 5.796000 ,     26.2980000 } ,
            {          109.0 , 2.966000 ,    1577.3440000 } ,
            {           93.0 , 2.590000 ,   18849.2300000 } ,
            {           72.0 , 1.140000 ,     529.6900000 } ,
            {           68.0 , 1.870000 ,     398.1500000 } ,
            {           67.0 , 4.410000 ,    5507.5500000 } ,
            {           59.0 , 2.890000 ,    5223.6900000 } ,
            {           56.0 , 2.170000 ,     155.4200000 } ,
            {           45.0 , 0.400000 ,     796.3000000 } ,
            {           36.0 , 0.470000 ,     775.5200000 } ,
            {           29.0 , 2.650000 ,       7.1100000 } ,
            {           21.0 , 5.430000 ,   00000.9800000 } ,
            {           19.0 , 1.850000 ,    5486.7800000 } ,
            {           19.0 , 4.970000 ,     213.3000000 } ,
            {           17.0 , 2.990000 ,    6275.9600000 } ,
            {           16.0 , 0.030000 ,    2544.3100000 } ,
            {           16.0 , 1.430000 ,    2146.1700000 } ,
            {           15.0 , 1.210000 ,   10977.0800000 } ,
            {           12.0 , 2.830000 ,    1748.0200000 } ,
            {           12.0 , 3.260000 ,    5088.6300000 } ,
            {           12.0 , 5.270000 ,    1194.4500000 } ,
            {           12.0 , 2.080000 ,    4694.0000000 } ,
            {           11.0 , 0.770000 ,     553.5700000 } ,
            {           10.0 , 1.300000 ,    6286.6000000 } ,
            {           10.0 , 4.240000 ,    1349.8700000 } ,
            {            9.0 , 2.700000 ,     242.7300000 } ,
            {            9.0 , 5.640000 ,     951.7200000 } ,
            {            8.0 , 5.300000 ,    2352.8700000 } ,
            {            6.0 , 2.650000 ,    9437.7600000 } ,
            {            6.0 , 4.670000 ,    4690.4800000 }
         };
         const VSOP87COEFFICIENT Earth_SLG2[20] =
         {
            { 52919.0 , 0.0000 ,    00000.0000 } ,
            { 8720.0 ,   1.0721 ,    6283.0758 } ,
            {   309.0 ,   0.8670 ,    12566.1520 } ,
            {    27.0 ,   0.0500 ,       3.5200 } ,
            {    16.0 ,   5.1900 ,      26.3000 } ,
            {    16.0 ,   3.6800 ,     155.4200 } ,
            {    10.0 ,   0.7600 ,   18849.2300 } ,
            {     9.0 ,   2.0600 ,   77713.7700 } ,
            {     7.0 ,   0.8300 ,     775.5200 } ,
            {     5.0 ,   4.6600 ,    1577.3400 } ,
            {     4.0 ,   1.0300 ,       7.1100 } ,
            {     4.0 ,   3.4400 ,    5573.1400 } ,
            {     3.0 ,   5.1400 ,     796.3000 } ,
            {     3.0 ,   6.0500 ,    5507.5500 } ,
            {     3.0 ,   1.1900 ,     242.7300 } ,
            {     3.0 ,   6.1200 ,     529.6900 } ,
            {     3.0 ,   0.3100 ,     398.1500 } ,
            {     3.0 ,   2.2800 ,     553.5700 } ,
            {     2.0 ,   4.3800 ,    5223.6900 } ,
            {     2.0 ,   3.7500 ,   00000.9800 }
         };
         const VSOP87COEFFICIENT Earth_SLG3[ 7] =
         {
            { 289.0 , 5.844 , 6283.076 } ,
            { 35.0 ,   0.000 , 00000.000 } ,
            { 17.0 ,   5.490 , 12566.150 } ,
            {   3.0 ,   5.200 ,   155.420 } ,
            {   1.0 ,   4.720 ,     3.520 } ,
            {   1.0 ,   5.300 , 18849.230 } ,
            {   1.0 ,   5.970 ,   242.730 }
         };
         const VSOP87COEFFICIENT Earth_SLG4[ 3] =
         {
            { 114.0 , 3.142 , 00000.00 } ,
            {   8.0 , 4.130 , 6283.08 } ,
            {   1.0 , 3.840 , 12566.15 }
         };
         const VSOP87COEFFICIENT Earth_SLG5[ 1] =
         {
            { 1.0 , 3.14 , 0.0 }
         };

               // ------------------------------------------------------------------------
          //
          // 计算太阳在黄道面上的经度(单位:度)
          //
          // dbJD[IN]:儒略日(计算该时刻太阳在黄道面上的经度)
          //
          // 返回太阳黄经度数
          // ------------------------------------------------------------------------
          double w_GetSunLongitude(const double & dbJD)
          {
                // 计算τ
                double dt = (dbJD - 2451545.0) / 365250.0;

                double dL = 0.0, dL0 = 0.0, dL1 = 0.0, dL2 = 0.0, dL3 = 0.0, dL4 = 0.0, dL5 = 0.0;

                // L0 38x3
                for(int i = 0; i < sizeof(Earth_SLG0) / sizeof(VSOP87COEFFICIENT); i++)
                    dL0 += (Earth_SLG0[i].dA * cos((Earth_SLG0[i].dB + Earth_SLG0[i].dC * dt)));

                // L1 16x3
                for(int i = 0; i < sizeof(Earth_SLG1) / sizeof(VSOP87COEFFICIENT); i++)
                    dL1 += (Earth_SLG1[i].dA * cos((Earth_SLG1[i].dB + Earth_SLG1[i].dC * dt)));

                // L2 10x3
                for(int i = 0; i < sizeof(Earth_SLG2) / sizeof(VSOP87COEFFICIENT); i++)
                    dL2 += (Earth_SLG2[i].dA * cos((Earth_SLG2[i].dB + Earth_SLG2[i].dC * dt)));

                // L3 8x3
               for(int i = 0; i < sizeof(Earth_SLG3) / sizeof(VSOP87COEFFICIENT); i++)
                    dL3 += (Earth_SLG3[i].dA * cos((Earth_SLG3[i].dB + Earth_SLG3[i].dC * dt)));

               // L4 6x3
                for(int i = 0; i < sizeof(Earth_SLG4) / sizeof(VSOP87COEFFICIENT); i++)
                    dL4 += (Earth_SLG4[i].dA * cos((Earth_SLG4[i].dB + Earth_SLG4[i].dC * dt)));

                // L5 1x3
                for(int i = 0; i < sizeof(Earth_SLG5) / sizeof(VSOP87COEFFICIENT); i++)
                    dL5 += (Earth_SLG5[i].dA * cos((Earth_SLG5[i].dB + Earth_SLG5[i].dC * dt)));

                // 计算 L = ( L0 + L1 * τ^1 + L2 * τ^2 + L3 * τ^3 + L4 * τ^4 + L5 * τ^5 ) / 10^8 ;(单位弧度)
                dL = (dL0 + (dL1 * dt) + (dL2 * (dt * dt)) + (dL3 * (dt * dt * dt)) * (dL4 * (dt * dt * dt * dt)) + (dL5 * (dt * dt * dt * dt * dt))) / 100000000.0;

                // 转化为度θ = L + 180 (单位度);
                return (w_MapTo0To360Range(w_MapTo0To360Range(dL / dbUnitRadian) + 180.0));
         }

    5.3、黄纬:(算法描述请参考相关书籍,为了节省空间和时间,这里请罗列出 C++ 实现代码)

         //
         // 计算太阳黄纬用参数
         const VSOP87COEFFICIENT Earth_SLT0[ 5] =
         {
              { 280.0 , 3.199 , 84334.662 } ,
              { 102.0 , 5.422 , 5507.553 } ,
              { 80.0 , 3.880 , 5223.690 } ,
              { 44.0 , 3.700 , 2352.870 } ,
              { 32.0 , 4.000 , 1577.340 }
         };
         const VSOP87COEFFICIENT Earth_SLT1[ 2] =
         {
              { 9.0 , 3.90 , 5507.55 } ,
             { 6.0 , 1.73 , 5223.69 }
         };
         const VSOP87COEFFICIENT Earth_SLT2[ 4] =
         {
              { 22378.0 , 3.38509 , 10213.28555 } ,
              {   282.0 , 0.00000 , 00000.00000 } ,
              {   173.0 , 5.25600 , 20426.57100 } ,
              {    27.0 , 3.87000 , 30639.86000 }
         };
         const VSOP87COEFFICIENT Earth_SLT3[ 4] =
         {
              { 647.0 , 4.992 , 10213.286 } ,
              { 20.0 , 3.140 , 00000.000 } ,
              {   6.0 , 0.770 , 20426.570 } ,
              {   3.0 , 5.440 , 30639.860 }
         };
         const VSOP87COEFFICIENT CWDCalendarEngine::Earth_SLT4[ 1] =
         {
              { 14.0 , 0.32 , 10213.29 }
         };

         // ------------------------------------------------------------------------
         //
          // 计算太阳在黄道面上的纬度(单位:度)
          //
          // dbJD[IN]:儒略日(计算该时刻太阳在黄道面上的纬度)
          //
          // 返回太阳黄纬度数
          // ------------------------------------------------------------------------
          double w_GetSunLatitude(const double & dbJD)
          {
               // 计算τ
               double dbt = (dbJD - 2451545.0) / 365250.0;

               double dbB = 0.0, dbB0 = 0.0, dbB1 = 0.0, dbB2 = 0.0, dbB3 = 0.0, dbB4 = 0.0;

               // B0 5x3
               for(int i = 0; i < sizeof(Earth_SLT0) / sizeof(VSOP87COEFFICIENT); i++)
                  dbB0 += (Earth_SLT0[i].dA * cos((Earth_SLT0[i].dB + Earth_SLT0[i].dC * dbt)));

               // B1 2x3
               for(int i = 0; i < sizeof(Earth_SLT1) / sizeof(VSOP87COEFFICIENT); i++)
                  dbB1 += (Earth_SLT1[i].dA * cos((Earth_SLT1[i].dB + Earth_SLT1[i].dC * dbt)));

               // B2 4x3
               for(int i = 0; i < sizeof(Earth_SLT2) / sizeof(VSOP87COEFFICIENT); i++)
                  dbB2 += (Earth_SLT2[i].dA * cos((Earth_SLT2[i].dB + Earth_SLT2[i].dC * dbt)));
  
               // B3 4x3
               for(int i = 0; i < sizeof(Earth_SLT3) / sizeof(VSOP87COEFFICIENT); i++)
                  dbB3 += (Earth_SLT3[i].dA * cos((Earth_SLT3[i].dB + Earth_SLT3[i].dC * dbt)));
  
               // B4 1x3
               for(int i = 0; i < sizeof(Earth_SLT4) / sizeof(VSOP87COEFFICIENT); i++)
                  dbB4 += (Earth_SLT4[i].dA * cos((Earth_SLT4[i].dB + Earth_SLT4[i].dC * dbt)));
  

               // 计算 B = ( B0 + B1 * τ^1 + B2 * τ^2 + B3 * τ^3 + B4 * τ^4 ) / 10^8 ;(单位弧度)
               dbB = (dbB0 + (dbB1 * dbt) + (dbB2 * (dbt * dbt)) + (dbB3 * (dbt * dbt * dbt)) * (dbB4 * (dbt * dbt * dbt * dbt))) / 100000000.0;

               // 计算 θ(单位度);
               return -(dbB / dbUnitRadian);
          }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多