2016-01-22 5 views
3

Я работаю над проектом для домашних животных, который включает в себя расчет данных восхода/захода солнца. Я борюсь с реализацией следующей формулы в Swift:Вычисление уравнения центра в Swift

Уравнение центра:

C = (1,9148 * sin (meanSolarAnomaly)) + (0,0200 * грех (2 * meanSolarAnomaly)) + (0,0003 * sin (3 * meanSolarAnomaly))

Вот ответ, который я должен получать для моего данного Lat/Lon:

C = 1,9148 * sin (18,30143135945) + 0,0200 * грех (2 * 18,30143135945) + 0,0003 * грех (3 * 18,30143135945) = 0,61344892821988

Вот мой код, который не дает правильное значение в качестве конечного значения:

// meanSolarAnomaly has a value of 18.30143135945036 at this point 
let center = (1.9148 * sin(meanSolarAnomaly)) + (0.0200 * sin(2*meanSolarAnomaly)) + (0.0003 * sin(3*meanSolarAnomaly)) 

Мой код говорит центр = -1.015867439183884, а правильный центр = 0,61344892821988

У меня есть двойное и тройное проверочное уравнение, но я не могу обнаружить свою ошибку. Я надеюсь, что это простая синтаксическая ошибка, но будет смущена, если она будет ...

Я работаю из уравнения и отвечаю на вопросы here.

EDIT Вот полный код:

//: Playground - noun: a place where people can play 

import UIKit 
//calculator to determine what time of day Sunset/Sunrise will occur 
func jdFromDate(date : NSDate) -> Double { 
    let JD_JAN_1_1970_0000GMT = 2440587.5 
    return JD_JAN_1_1970_0000GMT + date.timeIntervalSince1970/86400 
} 

func dateFromJd(jd : Double) -> NSDate { 
    let JD_JAN_1_1970_0000GMT = 2440587.5 
    return NSDate(timeIntervalSince1970: (jd - JD_JAN_1_1970_0000GMT) * 86400) 
} 
let julianOffset = 2451545 as Double 
let refDateFormatter = NSDateFormatter() 
refDateFormatter.dateFormat = "MM-dd-yyyy" 

let today = NSDate() 

let julianDaysToToday = round(jdFromDate(today)) 

//get the lat/lon variables set (Tampa in example) 
let lat = 27.9681 
let lon = 82.4764 

//now we need to calculate julian cycle 
let nRaw = (julianDaysToToday - julianOffset - 0.0009) - (lon/360) 
let n = round(nRaw) 

//n now contains the julian cycle 
//next we must calculate the julian date of solar noon (approximately) 
//J* = 2451545 + 0.0009 + (lw/360) + n 

let jSolarNoon = julianOffset + 0.0009 + (lon/360) + n 

//next calculate the mean solar anomaly 
//M = [357.5291 + 0.98560028 * (J* - 2451545)] mod 360 
let meanSolarAnomaly = (357.5291 + 0.98560028 * (jSolarNoon - julianOffset)) % 360 

//next calculate the equation of center 

let center = (1.9148 * sin(meanSolarAnomaly)) + (0.0200 * sin(2*meanSolarAnomaly)) + (0.0003 * sin(3*meanSolarAnomaly)) 

//Now, using Center and Mean, calculate the ecliptical longitude of the sun. 
//λ = (M + 102.9372 + C + 180) mod 360 
let eclLonOfSun = (meanSolarAnomaly + 102.9372 + center + 180) % 360 

//now we can finally get an accurate julian date for solar noon 
let jTransit = jSolarNoon + (0.0053 * sin(meanSolarAnomaly)) - (0.0069 * sin(2 * eclLonOfSun)) 

//To calculate the hour angle we need to find the declination of the sun 
//δ = arcsin(sin(λ) * sin(23.45)) 
let declinationOfSun = asin(sin(eclLonOfSun) * sin(23.45)) 

//now calculate the hour angle 
//H = arccos([sin(-0.83) - sin(ln) * sin(δ)]/[cos(ln) * cos(δ)]) 
let hourCosNum = sin(-0.83) - sin(lat) * sin(declinationOfSun) 
let hourDenom = cos(lat)*cos(declinationOfSun) 
let hourAngle = acos(hourCosNum)/hourDenom 

//time to go back through the approximation again using the hour angle 
let finalJulianApproximation = 2451545 + 0.0009 + ((hourAngle + lon)/360) + n 

//The values of M and λ from above don't really change from solar noon to sunset, so there is no need to recalculate them before calculating sunset. 
let jSet = finalJulianApproximation + (0.0053 * sin(meanSolarAnomaly)) - (0.0069 * sin(2*eclLonOfSun)) 

let sunset = dateFromJd(jSet) 
+4

Is 18.3 a degree? Я думаю, вам нужно сначала преобразовать его в радианы. – kennytm

+0

Я обновил свой ответ с полным кодом, чтобы вы могли видеть вывод meanSolarAnomaly (18.3) – Charlie

ответ

4

Как @kennytm предположил, средняя аномалия (на солнце или что-либо еще) является угол. Углы в Swift (и C, из которых приходят библиотеки математики) - все радианы, в то время как астрономы говорят в градусах. Вот ваш код в Детские площадки:

var meanSolarAnomaly = 18.30143135945036 
var c = (1.9148 * sin(meanSolarAnomaly)) + (0.0200 * sin(2 * meanSolarAnomaly)) + (0.0003 * sin(3 * meanSolarAnomaly)) 
// = -1.01586743918389 - wrong answer 

meanSolarAnomaly = meanSolarAnomaly * M_PI/180.0 
// Convert it to radians 

c = (1.9148 * sin(meanSolarAnomaly)) + (0.0200 * sin(2 * meanSolarAnomaly)) + (0.0003 * sin(3 * meanSolarAnomaly)) 
// = 0.6134489282198807 - right answer 
+0

Спасибо @kennytm и Grimxn за ваши ответы и отзывы. Это должно было быть очевидно, но это точно мой ответ! Огромное спасибо!! – Charlie

+0

Не стесняйтесь принять ответ! Сайт, на котором вы ссылаетесь, действительно виноват в том, что он не указывает единицы, хотя 18.xxx в любом случае не имеет значительного угла в радианах (по существу они находятся между 0 и 2 пи, или -pi и pi). – Grimxn

+0

Я согласен, как можно скорее. Я сталкиваюсь с аналогичной проблемой, расчитывающей declinationOfSun, но это был не оригинальный вопрос! :) Примените свою обратную связь и посмотрите, не является ли она той же ошибкой – Charlie