Friday, February 03, 2006

 

時鐘追趕問題

對於python可以運用在教學情境裡,可以用一個很有趣的例子,來作這方面的應用,「時鐘追趕問題」:如果時間在二點到三點鐘之間,分針與時針什麼時候重合?

「重合」表示2針會成為一直線,這代表會有2次重疊的時刻,一次是短針和長針同方向重合在一起,另一次則是2針反方向而成為一直線的狀態。

現在想要更一般性地來表示這個問題,如果時刻是在h時m分的時候,請問短針、長針重合的時刻為何?

我們將證明,如果時間為h時m分,和時間為h時整點,其重合的時間是一致的。

證明:假設x為重合的時間,ExtraTime為額外需要的時間,如果題目是要2針夾角成Theta度,則換算成為Theta/6分;因為分針的速度為時針的12倍,所以下列式子A成立。

x-m=t
t=t/12+ExtraTime+(5h+m/12)-m   <=== 式子A
x=(60h+12*ExtraTime)/11 

ExtraTime為0的表示同方向重合,為30則表示反方向重合的狀態,剛好與時針在整點時,所算出的結果是一致的。

import sys
from optparse import OptionParser
from math import modf
def SynClockTime(*args):
  Hour, Min=args
  MinAngle, HourAngle=Min*6, Hour*30+Min/2.
  if HourAngle>MinAngle:      #MinAngle over the HourAngle
      for ExtraMin in (30, 60):
          AlignMin=(60*Hour+ExtraMin*12)/11.
          Sec, Min=modf(AlignMin)
          Sec, Min=Sec*60, int(Min)
          if Min<60: Min%=60; Hour+=1
          print 'The next alignment is= %(Hour)s:%(Min)s:%(Sec)s'%vars()
  else:
      for ExtraMin in (0, 30):
          AlignMin=(60*Hour+ExtraMin*12)/11.
          Sec, Min=modf(AlignMin)
          Sec, Min=Sec*60, int(Min)
          if Min>60: Min%=60; Hour+=1
          print 'The next alignment is= %(Hour)s:%(Min)s:%(Sec)s'%vars()

if __name__=='__main__':
  usage='%prog [option]'
  parser=OptionParser(usage=usage,version='%prog, Reversion 0.1')
  parser.add_option('-T','--Time',nargs=2,type='int',help='-T Hour(24-format) Min')
  options,args=parser.parse_args()
  if len(sys.argv)==1:parser.print_help();raise SystemExit
  if options.Time: SynClockTime(*options.Time)

程式碼分為2個情形,如果時針所走的角度比較大,則在同一整點時刻,會有2次重合的時間,如果分針所走的角度較大,則在同一整點及下一整點時刻,分別都有一次的重合時刻。

這個問題,可以幫我們理解,如何用python來表示,追趕問題中所需的數學式子。

延伸問題:
是否可以算至重合時間精確到秒?亦即為找出"hour時min分sec秒",2針重合。


Comments: Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?