cambridgetempFourier.frink

View or download cambridgetempFourier.frink in plain text format


// This file gives the average temperature in Cambridge, MA for any moment of
// the year.   It's based on some Fourier analysis I did of temperatures over
// a 30-year span.  Thanks to Sarang Gupta and David Bergman for providing
// raw temperature data.  It includes all Fourier terms with magnitude greater
// than 0.2 degree F.  This data is very likely overfitted to the noise in the
// original data (which you'll see if you plot it using
// plotCambridgeTemp.frink.)  You would think that it would probably be better
// and faster to remove more terms, but when you remove too many high and
// low terms, the Fourier series creates unreliable high and low temperatures.
cambridgeTemp[date] :=
{
   startOfYear = beginningOfYear[date, "US/Eastern"]

   // t is the time elapsed since the beginning of the year, as a unit with
   // dimensions of time.  We can thus get continuous variations over the
   // course of a day.
   t = date - startOfYear
   
   /* The coefficients below can be converted into the period of each
      oscillation.  For example, the term with the coefficient 1/(8784 hours)
      corresponds to a frequency of 1/(8784 hours) or once/year.  (There are
      8784 hours in 366 days.)  The period can be obtained by inverting.
      The coefficient 1/(8784 hours) corresponds to a period of (8784 hours)/1
      or 366 days.

      The next-largest coefficient with coefficient 366/(8784 hours)
      corresponds to a frequency of 366/(8784 hours) or a period of
      (8784 hours)/366 or 1 day, (which is what you would hope you would see!)
      This gives a daily swing of +/- 9.25 degrees F around the daily average.
      This means that the average daily temperature varies about 18.5 degrees
      F from coldest to hottest.

      So, we see that:

      * the average temperature over a whole year is 57.94 F,

      * the annual temperature average varies around this by plus and
        minus 21.0998 degrees F (see the component with frequency of
        1/(8784 hours)),

      * the daily temerature varies around the daily average by plus and minus
        9.25 degrees F  (see the component with frequency of 366/(8784 hours),
        which corresponds to a period of (8784 hours)/366 which is equal to
        24 hours.)

      * Interestingly, the third-largest component has a period of
        (8784 hours) / 732, which is 12 hours or 1/2 of a day.
        (Previous versions of this file got the calculation wrong and stated
         that the period was 12 days.  12 hours is much less surprising.)
   */

   return F[57.942890 +
   21.099806 cos[2 pi 1/(8784 hours) t - -2.906732] +
   1.356891 cos[2 pi 2/(8784 hours) t - 2.233304] +
   1.336084 cos[2 pi 3/(8784 hours) t - 2.193206] +
   0.223166 cos[2 pi 4/(8784 hours) t - -1.090373] +
   0.521739 cos[2 pi 5/(8784 hours) t - 1.560452] +
   0.492775 cos[2 pi 6/(8784 hours) t - 1.439721] +
   0.263230 cos[2 pi 8/(8784 hours) t - 0.417370] +
   0.556417 cos[2 pi 10/(8784 hours) t - 2.246992] +
   0.527294 cos[2 pi 11/(8784 hours) t - 1.969223] +
   0.254602 cos[2 pi 13/(8784 hours) t - -2.251578] + 
   0.217195 cos[2 pi 16/(8784 hours) t - -0.332239] +
   0.316010 cos[2 pi 17/(8784 hours) t - 0.773907] +
   0.444743 cos[2 pi 18/(8784 hours) t - 2.923433]+ 
   0.265131 cos[2 pi 19/(8784 hours) t - 3.096506] +
   0.386864 cos[2 pi 22/(8784 hours) t - 2.064502] +
   0.213935 cos[2 pi 23/(8784 hours) t - 3.138032] +
   0.209864 cos[2 pi 25/(8784 hours) t - -2.698274] +
   0.210136 cos[2 pi 26/(8784 hours) t - -0.895948] +
   0.386686 cos[2 pi 28/(8784 hours) t - -0.020524] +
   0.263972 cos[2 pi 29/(8784 hours) t - -1.972257] +
   0.273588 cos[2 pi 30/(8784 hours) t - -1.537358] +
   0.382904 cos[2 pi 31/(8784 hours) t - -0.290935] +
   0.459307 cos[2 pi 32/(8784 hours) t - 1.758215] +
   0.248827 cos[2 pi 33/(8784 hours) t - 2.639307] +
   0.321330 cos[2 pi 34/(8784 hours) t - 0.734143] +
   0.261203 cos[2 pi 36/(8784 hours) t - -0.526883] +
   0.382089 cos[2 pi 40/(8784 hours) t - 1.726138] +
   0.277952 cos[2 pi 42/(8784 hours) t - -1.709813] +
   0.351550 cos[2 pi 47/(8784 hours) t - -2.988918] +
   0.228715 cos[2 pi 50/(8784 hours) t - 0.349665] +
   0.290932 cos[2 pi 55/(8784 hours) t - -1.062905] +
   0.250276 cos[2 pi 56/(8784 hours) t - 0.899870] +
   0.215393 cos[2 pi 57/(8784 hours) t - 1.793273] +
   0.345179 cos[2 pi 62/(8784 hours) t - -0.519825] +
   0.208761 cos[2 pi 63/(8784 hours) t - -1.109292] +
   0.246095 cos[2 pi 73/(8784 hours) t - -0.547546] +
   0.297484 cos[2 pi 76/(8784 hours) t - -0.249699] +
   0.223039 cos[2 pi 79/(8784 hours) t - -2.698298] +
   0.297275 cos[2 pi 87/(8784 hours) t - -1.849753] +
   0.281730 cos[2 pi 100/(8784 hours) t - 1.104291] +
   0.299084 cos[2 pi 113/(8784 hours) t - -2.426574] +
   0.242557 cos[2 pi 363/(8784 hours) t - -2.234784] +
   0.283761 cos[2 pi 364/(8784 hours) t - 1.835604] +
   0.429462 cos[2 pi 365/(8784 hours) t - 2.729831] +
   9.249708 cos[2 pi 366/(8784 hours) t - -0.555028] +
   1.055960 cos[2 pi 367/(8784 hours) t - 1.931133] +
   0.392247 cos[2 pi 368/(8784 hours) t - -2.936348] +
   0.243464 cos[2 pi 369/(8784 hours) t - 1.750387] +
   0.426907 cos[2 pi 731/(8784 hours) t - -1.320502] +
   1.805608 cos[2 pi 732/(8784 hours) t - -2.232321] +
   0.299388 cos[2 pi 733/(8784 hours) t - -2.079456] +
   0.369901 cos[2 pi 1098/(8784 hours) t - -0.200385] +
   0.228087 cos[2 pi 1099/(8784 hours) t - 2.390151] +
   0.280292 cos[2 pi 1464/(8784 hours) t - -1.966137]]
}


View or download cambridgetempFourier.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 18289 days, 2 hours, 0 minutes ago.