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 18234 days, 21 hours, 45 minutes ago.