2014-01-28 2 views
1

관찰자에서 태양까지의 시야에 장애물이 그림자를 드리 우는 시간을 알고 싶습니다.태양의 위치가 주어지면 관찰자의 시간을 계산하십시오

그래서 태양이 관측자에 비해 하늘의 특정 위치에있는 날짜/시간을 계산하고 싶습니다. (특정 연도의 모든 사건).

PyEphem을 사용하면 매우 쉽습니다. 관찰자 위치 (위도, 경도)와 시간을 계산하면 태양의 위치를 ​​알 수 있습니다.

나는이 문제에 대한 해결책을 찾지 못했지만 찾을 수 없다. 어떤 도움이라도 대단히 감사하겠습니다.

감사

답변

0

이 수학적 모델의 넓은 범위에서 흥미로운 비대칭을 제공합니다 - 그들은 우리가 값이 될 것으로 기대 우리가 시간 t에서 계산할 수있는 자연 "앞으로"방향을 가지고 (태양의 고도 또는 방위각의 가치와 같은). 그러나 다른 방향으로 수식을 풀거나 표현하는 쉬운 방법이 없습니다.

우리는 "앞으로"수식에 다른 추측을 던지면서 나오는 결과를 확인하고 출력이 충분히 가까워 질 때까지 입력을 조정하여 최적화, 근음 찾기 및 곡선 피팅과 같은 다양한 기술을 사용합니다. 우리가 필요로하는 가치.

일출, 일몰 및 춘분과 같은 루틴에서 PyEphem을 살펴 본다면 Newton의 메소드라는 것을 사용하여 상황에 맞는 반복 검색의 예가 표시됩니다.

다른 환경의 시간을 결정하는 데 같은 기술을 사용할 수 있습니다. 태양은 20 ° 고도에서 언제입니까?

import ephem 

boston = ephem.Observer() 
boston.lat = '42.37' 
boston.lon = '-71.03' 
boston.date = '2014/1/29 03:12:47' 

sun = ephem.Sun() 
sun.compute(boston) 
print 'Starting altitude:', sun.alt 

def f(x): 
    boston.date = x 
    sun.compute(boston) 
    return sun.alt - ephem.degrees('20.0') 

x = boston.date 
print 'Searching for the correct time...' 
ephem.newton(f, x, x + 0.01) 
print 'At the time and date', boston.date 
print 'the solar altitude is', sun.alt 

이 스크립트의 출력은 다음과 같습니다 태양 고도가 매우 스무도 매우 근접 할 때

Starting altitude: -57:02:36.3 
Searching for the correct time... 
At the time and date 2014/1/28 19:30:49 
the solar altitude is 20:00:00.0 

그래서 제대로 순간을 발견 - Netwon 기능의 제로 크로싱을 찾아 때문에 함수를 분석하고, Netwon 함수가 그것을보기 전에 고도에서 20 °를 뺍니다.

사용하는 반복 프로세스를 사용하고 제어하는 ​​방법에 대한 자세한 내용과 취약한 대신 사용할 수있는 최적화를 지원하는 아주 멋진 SciPy 루틴을 읽고 싶다면 최적화에 대한 온라인 리소스가 많이 있습니다. 그 이상 사용 작은 newton() 방법은 PyEphem에 내장되어 제공 :

http://docs.scipy.org/doc/scipy/reference/optimize.html

+0

덕분에이 공유를위한 - 매우 유용한! 나는이 방법을 조사 해왔다. 그리고 위 예제 코드에서 전체 숫자 (예를 들어 20.5) 이외의 각도를 입력하면 반환되는 sun.alt가 몇 분의 1도만큼 오프셋된다고 당혹 스럽다. 이 경우 다음과 같은 결과를 반환합니다. 시작 고도 : -57 : 02 : 36.3 정확한 시간을 검색 중 ... 시간 및 날짜 2014/1/28 19:26:27 태양 고도는 20 : 30 : 00.0입니다. 아마도에서 라드로의 변환 어딘가? – user3246379

+0

아니요, 코드가 완벽하게 작동하는 것 같습니다. 측정 값 "20:30:00"은 정확히 20.5 인 20 ° 30'00 "을 의미합니다. 30 분은 1 시간 반 (60 분)이기 때문입니다. –