Excel và ứng dụng tính toán Âm Dương

dontsayloveme2

Thành viên kỳ cựu
function getNewMoonDay($k, $timeZone) {
$T = $k/1236.85; // Time in Julian centuries from 1900 January 0.5
$T2 = $T * $T;
$T3 = $T2 * $T;
$dr = M_PI/180;
$Jd1 = 2415020.75933 + 29.53058868*$k + 0.0001178*$T2 - 0.000000155*$T3;
$Jd1 = $Jd1 + 0.00033*sin((166.56 + 132.87*$T - 0.009173*$T2)*$dr); // Mean new moon
$M = 359.2242 + 29.10535608*$k - 0.0000333*$T2 - 0.00000347*$T3; // Sun's mean anomaly
$Mpr = 306.0253 + 385.81691806*$k + 0.0107306*$T2 + 0.00001236*$T3; // Moon's mean anomaly
$F = 21.2964 + 390.67050646*$k - 0.0016528*$T2 - 0.00000239*$T3; // Moon's argument of latitude
$C1=(0.1734 - 0.000393*$T)*sin($M*$dr) + 0.0021*sin(2*$dr*$M);
$C1 = $C1 - 0.4068*sin($Mpr*$dr) + 0.0161*sin($dr*2*$Mpr);
$C1 = $C1 - 0.0004*sin($dr*3*$Mpr);
$C1 = $C1 + 0.0104*sin($dr*2*$F) - 0.0051*sin($dr*($M+$Mpr));
$C1 = $C1 - 0.0074*sin($dr*($M-$Mpr)) + 0.0004*sin($dr*(2*$F+$M));
$C1 = $C1 - 0.0004*sin($dr*(2*$F-$M)) - 0.0006*sin($dr*(2*$F+$Mpr));
$C1 = $C1 + 0.0010*sin($dr*(2*$F-$Mpr)) + 0.0005*sin($dr*(2*$Mpr+$M));
if ($T < -11) {
$deltat= 0.001 + 0.000839*$T + 0.0002261*$T2 - 0.00000845*$T3 - 0.000000081*$T*$T3;
} else {
$deltat= -0.000278 + 0.000265*$T + 0.000262*$T2;
};
$JdNew = $Jd1 + $C1 - $deltat;
//echo "JdNew = $JdNew\n";
return INT($JdNew + 0.5 + $timeZone/24);
}

function getSunLongitude($jdn, $timeZone) {
$T = ($jdn - 2451545.5 - $timeZone/24) / 36525; // Time in Julian centuries from 2000-01-01 12:00:00 GMT
$T2 = $T * $T;
$dr = M_PI/180; // degree to radian
$M = 357.52910 + 35999.05030*$T - 0.0001559*$T2 - 0.00000048*$T*$T2; // mean anomaly, degree
$L0 = 280.46645 + 36000.76983*$T + 0.0003032*$T2; // mean longitude, degree
$DL = (1.914600 - 0.004817*$T - 0.000014*$T2)*sin($dr*$M);
$DL = $DL + (0.019993 - 0.000101*$T)*sin($dr*2*$M) + 0.000290*sin($dr*3*$M);
$L = $L0 + $DL; // true longitude, degree
//echo "\ndr = $dr, M = $M, T = $T, DL = $DL, L = $L, L0 = $L0\n";
// obtain apparent longitude by correcting for nutation and aberration
$omega = 125.04 - 1934.136 * T;
$L = $L - 0.00569 - 0.00478 * Math.sin($omega * $dr);
$L = $L*$dr;
$L = $L - M_PI*2*(INT($L/(M_PI*2))); // Normalize to (0, 2*PI)
return INT($L/M_PI*6);
}

function getLunarMonth11($yy, $timeZone) {
$off = jdFromDate(31, 12, $yy) - 2415021;
$k = INT($off / 29.530588853);
$nm = getNewMoonDay($k, $timeZone);
$sunLong = getSunLongitude($nm, $timeZone); // sun longitude at local midnight
if ($sunLong >= 9) {
$nm = getNewMoonDay($k-1, $timeZone);
}
return $nm;
}

Một Trung khí là thời điểm mà kinh độ mặt trời có một trong những giá trị sau: 0*PI/6, 1*PI/6, 2*PI/6, 3*PI/6, 4*PI/6, 5*PI/6, 6*PI/6, 7*PI/6, 8*PI/6, 9*PI/6, 10*PI/6, 11*PI/6. Các điểm "Phân-Chí" được định nghĩa bằng các tọa độ sau: Xuân phân: 0, Hạ chí: PI/2, Thu phân: PI, Đông chí: 3*PI/2.
Đông chí thường nằm vào khoảng 19/12-22/12, như vậy trước hết ta tìm ngày Sóc trước ngày 31/12. Nếu tháng bắt đầu vào ngày đó không chứa Đông chí thì ta phải lùi lại 1 tháng nữa.

điều đáng ngờ là
- cần xem kĩ lí do làm tròn số
- lại lấy sun longitude được làm tròn của ngày sóc thứ (k-1) và ngày sóc thứ k (làm tròn theo dương lịch)
sẽ sai như sau
- sun longitude đông chí lấy bằng 9; nếu sun longitude của ngày sóc thứ n lớn hơn 9 nhưng làm tròn bằng 9 thì sẽ coi đó là ngày sóc tháng 11, thực tế có thể đó là sóc tháng 12 hoặc tháng 11 nhuận.
- đúng ra phải so sánh trực tiếp ngày Julius (gồm phần sau dấu phẩy thể hiện giờ và phút) của điểm Khí và điểm Sóc.
 

dontsayloveme2

Thành viên kỳ cựu
Trong excel thì INT(8.9)=8; ROUNDDOWN(8.9,0)=8; ROUNDUP(8.9,0)=9
TRUNC(-4.3)=-4 vì TRUNC là lệnh chặt đuôi số lẻ.
 
Top