我的问题:我创建了程序计算太阳辐射和我需要计算太阳和地球之间的半径。
这本书基于“指南HTML、JavaScript和PHP”科学家和工程师,由大卫·r·布鲁克斯。代码来自这链接这是一个计算器。我编辑的代码。
半径计算
在我的代码被定义为半径计算o - > R = 1.000001018 * (1.0 - e * e) / (1.0 + e * cos (f));
在哪里e——地球轨道的偏心率:f-太阳真异常:
空白getSolarPosition(输入*我,SOLPOS * o){如果(我!我- > JulianDate) - > JulianDate = getJulianDate(我);/ /日期必须设置计算朱利安日期双degRad = 0.017453292519943295769236907684886;/ /π/ 180.0 / / 2451545.0 - 1月1日,2000年,在12:00:00 UT双T =(我- > juliandate - 2451545.0) / 36525.0;/ / L0——太阳的几何平均数经度:双L0 T + 0.0003032 = 280.46645 + 36000.76983 * * T * T;/ / M -意味着太阳异常:双M = 357.52910 + 35999.05030 * 0.0001559 * T * T - 0.00000048 T - T * T * T *;双M_rad = M * degRad;/ / e -地球轨道的偏心率:双e = 0.016708617 - -0.000042037 * 0.0000001236 T - * T * T;/ / C -太阳中心的双C = (1.914600 - -0.004817 * * T * 0.000014 T - T) *罪(M_rad) + (0.019993 - -0.000101 * T *罪(2。* M_rad) + 0.000290 *罪(3。* M_rad);双L_save = (10 + C) / 360。/ / L_true——太阳真经度双L_true; if (L_save < 0.) L_true = (L0+C) - ceil(L_save)*360.; else L_true = (L0+C) - floor(L_save)*360.; if (L_true < 0.) L_true+=360.; // f - true anomaly of the sun: double f = M_rad + C * degRad; // Earth-sun distance: o->R =1.000001018*(1.0-e*e)/(1.0+e*cos(f)); // Sidereal time (Theta0) double Sidereal_time=280.46061837+ 360.98564736629*( i->JulianDate-2451545.) + 0.000387933*T*T - T*T*T/38710000.; // Replacement code for Sidereal=fmod(Sidereal,360.) double S_save=Sidereal_time/360.; if (S_save < 0.) Sidereal_time=Sidereal_time-ceil(S_save)*360.; else Sidereal_time=Sidereal_time-floor(S_save)*360.; if (Sidereal_time < 0.) Sidereal_time+=360.; // Obliquity - (Axial tilt) o->obliquity=23.0+26./60.+21.448/3600.-46.8150/3600.*T-0.00059/3600.*T*T + 0.001813/3600.*T*T*T; // right_ascension: tan(alpha) o->right_ascension = atan2(sin(L_true*degRad)*cos( o->obliquity*degRad ), cos(L_true*degRad)); // declination: sin(delta) o->declination = asin(sin( o->obliquity*degRad )*sin(L_true*degRad)); // hour angle H of the sun with respect to the observer's longitude Lobs o->hour_angle=Sidereal_time + i->lon - o->right_ascension / degRad; o->elevation = (asin(sin( i->lat*degRad )*sin( o->declination)+cos(i->lat*degRad)*cos( o->declination )*cos( o->hour_angle*degRad )))/degRad; // Solar Zenit Angle o->Z = 90.-o->elevation; }
这是函数来计算太阳位置。它的工作原理完全相同的鸟和Hulstrom的太阳辐照度模型提到计算器(见上面的链接)。在这里,我使用我输入数据保存和输入对象o关于太阳能输出对象,计算数据保存位置后计算。量化——回报的主要的反正切值y / x,以弧度表示(不管它意味着什么,这是来自C / c++手册-
)。装天花板轮;地板上轮下来。
问题是如果我把旧的日期1849年/ 06/31 11:15太阳常数半径不符合纠正历史记录。在1322.3会SolConst 1367的结果。这是疯狂的。根据历史数据应该是1361.035。因此我希望半径计算是错误的。
地球和太阳的距离修正是另一个函数来计算太阳辐射。代码:
/ /地球和太阳的距离修正,Rsq = 1 / R ^ 2 / /双Rsq = (1.00011 + 0.034221 * cos (d 1) /(6.28318 * 365) + 0.00128 *罪(d 1) / (6.28318 * 365) + 0.000719 * cos (2 * (6.28318 * (d 1) / 365)) + 0.000077 *罪(2 * (6.28318 * (d 1) / 365)));双Rsq = 1.0 / (solpos.R * solpos.R);
我想问你:
1)我在哪儿能得到的历史记录来观察太阳-地球半径
2)这个公式计算出了什么问题?你能建议更好的公式吗?
编辑:我需要的代码添加到计算辐射和太阳常数修正。
空白getSolRadBird(输入我SOLPOS SOLPOS, SOLRAD * o){双degRad = 0.017453292519943295769236907684886;/ /相对空气质量双= 1。/ (cos (solpos。Z * degRad) + 0.15 *战俘(93.885 -solpos.z, -1.25));双AMp = 1013 * i.sitePressure /。/ /瑞利双Tr = exp(-0.0903 *战俘(AMp, 0.84) * (1 + AMp-pow (AMp, 1.01)));/ /臭氧双Ozm = i.ozone *点;双Toz = 1. - -0.1611 * Ozm *战俘(1 + 139.48 * Ozm, -0.3035) -0.002715 * Ozm / (1 + 0.044 * Ozm + 0.0003 *战俘(Ozm 2。));/ /混合气体双Tm = exp(-0.0127 *战俘(AMp, 0.26));/ /水蒸气双Wm =我* i.water;/ /总水汽双Tw = 1. - -2.4959 * Wm /((1。+战俘(79.034 * Wm, 0.6828)) + 6.385 * Wm); // daily turbidity // Ta5=A*sin((Dan-B)*PI/180.)+C; aerosol optical depth at 500 nm // Ta3=Ta5+0.1; double Ta5=i.AOT500; double Ta3=i.AOT380; double Tau=0.2758*Ta3+0.35*Ta5; double Ta=exp((-pow(Tau,0.873))*(1.+Tau-(pow(Tau,0.7088)))*pow(AM,0.9108)); double TAA=1.-0.1*(1.-AM+pow(AM,1.06))*(1.-Ta); double TAs=Ta/TAA; double Rs=0.0685+(1.-0.84)*(1.-TAs); // clear irradiance double Io=i.SolConst; // direct // Earth/sun distance correction, Rsq = 1/R^2 // double d=f.doy; // double Rsq=(1.00011+0.034221*cos(6.28318*(d-1)/365)+0.00128*sin(6.28318*(d-1)/365)+0.000719*cos(2*(6.28318*(d-1)/365))+0.000077*sin(2*(6.28318*(d-1)/365))); double Rsq=1.0/ (solpos.R*solpos.R) ; //alert("R= "+Rsq); double Id=Rsq*Io*.9662*Tr*Toz*Tm*Tw*Ta; // direct on horizontal surface double Idh=Id*cos(solpos.Z*degRad); // diffuse (scattered) double Ias=0.79*Io*cos(solpos.Z*degRad)*Toz*Tm*Tw*TAA; Ias=Ias*(0.5*(1.-Tr)+0.85*(1.-TAs))/(1.-AM+pow(AM,1.02)); // total dif + dir on horizontal double Itot=(Idh+Ias)/(1.-i.albedo*Rs); double Idif=Itot-Idh; // Save the values o->air_m = AM; o->direct = Idh; o->diffuse = Idif; o->total = Itot; o->S_corrected = Rsq*Io; }