There is some python code available to read in one minute sample weather data here.
Hourly Surface Data:
Roughly the same information taken on an hourly basis. Wind speed measurements are instantaneous, not averaged. Data from the MET office is available here
LCD
Daily average wind speed and direction, available from present to 1957. Data from the MET office is available here.
Plotting a CDF over winters for 2005-2009 results in the below:
The code used to process the data for this plot is available here. An example of how to read this plot is that in 2008 50% of wind speed measurements where at 9.5 knots or lower.
From the above:
The weibull distribution is a two-parameter function commonly used to fit wind speed frequency distribution. This family of curves has been shown to give a good fit to measured wind speed data. The weibull distrubtion provides a convienti representation of the wind speed data for wind energy calculation purposes.
The above paper describes a maximum likelihood method for fitting a weibull distrubtion to time series data. Code that implements that method is available here. As output this code produces an excel spreadsheet.
References
http://en.wikipedia.org/wiki/Log_wind_profile
http://amsglossary.allenpress.com/glossary/search?id=aerodynamic-roughness-length1
This formulation requires a minimum parameter of z0 for wind speed corrections at a given height ( assuming neutral stability ). A 1978 paper found that the roughness length at the south pole depended on the orientation of the wind to the sastrugi. The reference is:
Aerodynamic Roughness as a Function Of Wind Direction Over Asymmetric
Surface Elements Boundary Layer Meteorology 14(1978) p 323-330
http://www.idl.ku.edu/ara/AARPS/Documents/Structural/Jackson&Carroll.pdf
Note that if reproducing this results is desired that this is a logarithmic function and changes of the largest amplitude are at the lower tower heights. A piece of code that implements this correction as described in Jackson & Carroll is below.
def towerHeightCorrection(windDirection, windSpeedMS, measureHeight, newHeight): """Aerodynamic roughness as a function of wind direction over asymmetric surface elements Boundary-layer meterology B.S. Jackson, J.J. Carroll 1978 Gives a measurement of roughness length at the south pole given the wind direction. """ if(windDirection>=10 and windDirection<=15): """ kutzbach - 1961 reports a range of .01009-.01024 cm for dry ice and snow.. this z0 is the average of these two values""" z0 = 0.010165 elif(windDirection>15 and windDirection<24): """ linear interpolation between the above and below a = .0877594 b = -1.30623 """ z0 = .0877594 * windDirection -1.30623 elif(windDirection>=24 and windDirection<=45): z0 = 0.8 elif(windDirection>45 and windDirection<60): """linear interpolation between the above and below a = 0.28 b = -11.8 z0 = a*winddirection + b """ z0 = .28 * windDirection -11.8 elif(windDirection>=60 and windDirection<=100): z0 = 5.0 else: """ a catch all number for the surface roughness.. kutzbach - 1961 reports a range of .01009-.01024 cm for dry ice and snow.. this z0 is the average of these two values""" z0 = 0.01065 # z0 is in centimeters. # when it should be in meters z0 = z0/100.0 # solve for the friction velocity ustar = windSpeedMS * 0.4 / ( math.log(measureHeight/z0)) newSpeed = (ustar / 0.4) * math.log(newHeight/z0) return newSpeed
def wattsAtMSL(ms): """This fit was generated by the zunzun web curve fitting service. The data points where taken from: http://www.bergey.com/Technical/XL.1.R.xls RMSE: 3.308 watts Note that this curve is assumed to be referenced to MSL at standard temperature and pressure. Input -> ms ( wind speed in meters per second ) Output -> watts """ temp = 0.0 # coefficients b2 = 2.3955532551271861E+02 c1 = 1.2196335810708682E+01 d1 = -8.9293418721651321E-03 b1 = -5.2424199203938713E+01 c2 = 5.2295018639630237E+00 d2 = -4.3859824059358302E-03 Offset = -1.0808456959005857E+01 K = math.log( math.exp(b2*c1*d1) + math.exp(b2*d1*ms) ) yII = b1*ms + K/d1 L = math.log( math.exp(b2*c1*d1) + math.exp(b2*c2*d1) ) temp = yII - math.log( math.exp(d2*(b1*c2 + L/d1)) + math.exp(d2*yII) ) / d2 temp = temp + Offset if(temp<0): return 0.0 else: return temp
import math # sum of squared absolute error def hummerPowerCurve(windSpeedMs): """A fit to the power production curve for the hummer 1kw wind turbine. The input is wind speed in meters per second. The output is in watts. RMSE: 10.588 watts. The data points came from page 5 of the owners manual for the 1kw off grid model. See this link for the source: http://www.hummerwind.com/hummer_1kW/pdf%20files/Owner%27s%20Manual-1kW-Off%20Grid.pdf Note that according to the above the cut in velocity is 3 meters per second """ if(windSpeedMs<3.0): return 0.0 temp = 0.0 # coefficients b2 = 4.4361747110905526E+02 c1 = 1.2631387337007551E+01 d1 = -6.6319417331139191E-03 b1 = -8.9678512101155349E+01 c2 = 6.3640202880816208E+00 d2 = -1.0864086608742285E-03 Offset = -1.8303698352372783E+02 K = math.log( math.exp(b2*c1*d1) + math.exp(b2*d1*windSpeedMs) ) yII = b1*windSpeedMs + K/d1 L = math.log( math.exp(b2*c1*d1) + math.exp(b2*c2*d1) ) temp = yII - math.log( math.exp(d2*(b1*c2 + L/d1)) + math.exp(d2*yII) ) / d2 temp = temp + Offset if(temp<0): return 0. return temp if __name__=="__main__": testSpeeds = [ 3,4,5,6,7,8,9,10,12,14,20] for speed in testSpeeds: print "Wind Speed %f, power %f" % ( speed, hummerPowerCurve(speed))
def raum1pt5kw(speedMs): """RMSE: 5.45846633054""" if(speedMs<3.3): # less than the cut in speed return 0.0 if(speedMs>11.0): # according to the raum website # once the speed goes above 11.0 m/s # the turbine produces 1.5kw. # it's not right as I doubt furling works that well return 1500. temp = 0.0 # coefficients a = -1.1414856936828159E+04 b = 1.0351781633610568E+04 c = -2.6507617761552042E+03 d = 3.2141229263527589E+02 f = -2.0349731926969248E+01 g = 6.5459907034597942E-01 h = -8.4502271983222244E-03 # see http:#en.wikipedia.org/wiki/Legendre_polynomials temp += a + b * speedMs temp += c * ((1.0 / 2.0) * (3.0*math.pow(speedMs, 2.0) - 1.0)) temp += d * ((1.0 / 2.0) * (5.0*math.pow(speedMs, 3.0) - 3.0*speedMs)) temp += f * ((1.0 / 8.0) * (35.0*math.pow(speedMs, 4.0) - 30.0*math.pow(speedMs, 2.0) +\ 3)) temp += g * ((1.0 / 8.0) * (63.0*math.pow(speedMs, 5.0) - 70.0*math.pow(speedMs, 3.0) +\ 15.0*speedMs)) temp += h * ((1.0 / 16.0) * (231.0*math.pow(speedMs, 6.0) - 315.0*math.pow(speedMs, 4.0\ ) + 105.0*math.pow(speedMs, 2.0) - 5)) if(temp<0): return 0. return temp if __name__=="__main__": speeds = [ 1,2,3,4,5,6,7,8,9,10,11] for speed in speeds: print "Power @ %f is %f" % ( speed, raum1pt5kw(speed))
def wattsAtMSL(ms): """This fit was generated by the zunzun web curve fitting service. The data points for the fit where generated by printing the power curve for the ARE110HV turbine, pulling points off with a ruler, and then rescaling to get meters per second versus watts. Note that this curve is assumed to be referenced to MSL at standard temperature and pressure. Note: RMSE on this fit is 22.28 watts with the larger errors being at rare high wind speeds. There was a note on the origional power curves that states that it's not very accurate at high wind speeds because of a low number of data points. Input -> ms ( wind speed in meters per second ) Output -> watts """ temp = 0.0 # coefficients a = -8.2853849879502650E+03 b = 1.1504235793548245E+04 c = -6.5675537345062539E+03 d = 2.0385510336759194E+03 e = -3.7775847048016539E+02 f = 4.3012357388520556E+01 g = -2.9307167248134247E+00 h = 1.0906254907539370E-01 i = -1.6990789359772052E-03 temp = i temp = temp * ms + h temp = temp * ms + g temp = temp * ms + f temp = temp * ms + e temp = temp * ms + d temp = temp * ms + c temp = temp * ms + b temp = temp * ms + a if(temp<0): return 0.0 return temp
p = absolute pressure -> kPa R = specific gas constant for dry air ( 287.05 J/(kg*K)) T = absolute temp ( degrees K ) Nist standard temperature and pressure: 20 degrees C, 101.325 kPa Rho = 101325./(287.05 * (20+273.15)) = 1.2041183 wattsAtAltitude = wattsAtSeaLevel * ( densityAtAltitude / densityAtSealevel )
Passcal prefers the SunXtender line of batteries. They provide some information here. The sunextender corporation provides rather extensive documentation on expected performance at various temperatures. A technical manual is here
Another potential is a saft sunica plus battery. Their nicad pocket cell battery ( claims no memory effect ) with a low temperature electrolyte will operate at temperatures down to -40C. This family of batteries has been used extensively in northern norway above the artic circle. See a technical manual for it here. The top level battery page is available here.
Some very rough results where generated with a markov chain. More in-depth methods exist such as box-jenkins or a hidden markov model. Reguardless here is an example of the simple forecasters performance:
The code that produced the data for this plot is located here.
You'll see that the WT-6500 turbine produces more power than the bergey from 0 knots to 6.5 knots. If you then combine that with a CDF for the wind speeds at pole like this:
If you subtract the cdf value at 6.5 knots with that at 0 knots you'll see that roughly 60% of the time the WT-6500 will outperform the bergey xl1.