Analizando datos de viento con R


12

Hola, estoy analizando datos de viento para estimar la energía de una turbina eólica.
He tomado 10 años de datos de viento y graficado un histograma;
mi segunda etapa fue ajustar una distribución de Weibull a los datos. Usé
R con el paquete lmompara calcular la forma y escala de Weibul, este es el código que usé:

>library(lmom)    
wind.moments<-samlmu(as.numeric(pp$WS))      
moments<-pelwei(wind.moments)     
x.wei<-rweibull(n=length(pp$WS), shape=moments["delta"], scale=moments["beta"])    
hist(as.numeric(pp$WS), freq=FALSE)    
lines(density(x.wei), col="red", lwd=4)    

Parece que hay algún retraso entre los datos y la función de densidad; ¿Me puede ayudar con esto? Otra pregunta es ¿me pueden ayudar a calcular la energía anual de la función de densidad?

ingrese la descripción de la imagen aquí
gracias


Acerca de la imagen, publíquela en algún alojamiento de imágenes y ponga un enlace: la convertiré en una imagen pegada.

+1, pregunta interesante, es posible que pronto tenga suficiente reputación :)
mpiktas

2
a juzgar por el gráfico, el problema no es el retraso. Lo que has trazado es más o menos bondad de ajuste. Por lo tanto, parece que la distribución de Weibull no es adecuada para sus datos. Veo que hay un montón cerca de cero, ¿tiene valores cero en sus datos? En ese caso, deberá modelar valores cero por separado. Entonces, la primera sugerencia sería probar Weibull para valores distintos de cero. También por qué Weibull, ¿hay alguna razón particular, alguna referencia de un trabajo similar tal vez?
mpiktas

1
tenga en cuenta que "retraso" es un término utilizado principalmente en el análisis de datos en el tiempo, que se refiere a una cosa que ocurre después de otra. Esto no es un retraso, quizás se llama con mayor precisión un cambio, o tal vez un desplazamiento, pero el cambio es probablemente más común para las distribuciones, cambian y escalan.
Spacedman

1
tenga cuidado al usar as.numeric (x) con factores; en realidad desea usar as.numeric (as.character (x)) para asegurarse de obtener el valor numérico correcto para el factor.
Andy Clifton el

Respuestas:


5

lmomLa función se pelweiajusta a una distribución Weibull de tres parámetros, con parámetros de ubicación , escala y forma. rweibullgenera números aleatorios para una distribución Weibull de dos parámetros. Necesita restar el parámetro de ubicación moments["zeta"]. Eso debería dar un mejor ajuste, pero no parece que se ajuste bien a sus datos particulares.

Me doy cuenta de que http://www.reuk.co.uk/Wind-Speed-Distribution-Weibull.htm dice "La velocidad del viento en la mayor parte del mundo se puede modelar usando la Distribución Weibull". ¡Quizás solo tienes mala suerte y vives en una parte del mundo donde no pueden!


¿Crees que me puedes ayudar con mi segunda pregunta: calcular la energía eólica en función de la función de densidad?
eliavs

2
No soy físico y no sé las ecuaciones necesarias, pero imagino que implicará una integral numérica sobre la densidad. La integrate()función de R puede ser útil para eso.
parada

Sé la ecuación que mi problam es que quiero calcular el porcentaje de tiempo que el viento está a cada velocidad
eliavs

¿Qué puedo decir? ¿Pueden ayudarme con la integración? -> gracias
eliavs

6

Recreé su trama con datos de http://hawaii.gov/dbedt/ert/winddata/krab0192.txt (tomé las 1200 mediciones). Obtuve un ajuste decente de los datos, generalmente usando su código:

library(lmom)

daten <- read.delim("wind.txt")
wind.avg <- na.omit(as.numeric(daten[,"X12"]))
wind.moments<-samlmu(wind.avg)
moments<-pelwei(wind.moments)
x.wei<-rweibull(n=length(wind.avg), shape=moments["delta"], scale=moments["beta"])
hist(as.numeric(wind.avg), freq=FALSE)
lines(density(x.wei), col="red", lwd=4)

Parcela de viento

Lo siento, no estoy seguro de cuál podría ser su problema, pero creo que debería poder adaptar weibull a sus datos. Lo que me hace sospechar es la curva de campana de su diagrama de densidad, no tengo idea de dónde vino eso.

Aquí están los momentos que generé:

wind.moments

       l_1         l_2         t_3         t_4 
15.17287544  4.80372580  0.14963501  0.06954438

momentos

     zeta      beta     delta 
 0.516201 16.454233  1.745413 

WTR a la producción anual: supongo que generaría valores discretos para la función de densidad de probabilidad, multiplicaría estos valores con la función de salida y lo resumiría. Alternativamente, puede usar sus datos en bruto, multiplicar los valores con la función de salida, resumirlos y calcular el promedio anual, debe controlar la estacionalidad de una manera adecuada (por ejemplo, asegúrese de usar años enteros o de ponderar en consecuencia) .

Aquí está la salida no controlada (usando la fórmula de http://www.articlesbase.com/diy-articles/determining-wind-turbine-annual-power-output-a-simple-formula-based-upon-blade-diameter- y-velocidad-media-del-viento-en-su-ubicación-513080.html )

years  <- length(wind.avg)/365
diameter <- 150
Power = (0.01328*diameter^2)*((wind.avg)^3)
(annual.power <- sum(Power)/years)
[1] 791828306

4

Aquí hay una publicación reciente en SO sobre turbinas eólicas. Mi respuesta en ese enlace tiene tres enlaces en los que podría estar interesado:

/programming/4843194/r-language-sorting-data-into-ranges-averaging-ignore-outliers/4844783#4844783

Acabo de marcar uno de los enlaces de Weibull en la respuesta SO anterior. Por alguna razón, el enlace está caído. Aquí hay algunos enlaces que proporcionan la misma información básica:

http://www.gso.uri.edu/ozone/

http://www.weru.ksu.edu/new_weru/publications/pdf/Comparison%20of%20the%20Weibull%20model%20with%20measured%20wind%20speed%20distributions%20for%20stochastic%20wind%20genera.pdf

http://www.kfupm.edu.sa/ri/publication/cer/41_JP_Weibull_parameters_for_wind_speed_distribution_in_Saudi_Arabia.pdf

http://journal.dogus.edu.tr/13026739/2008/cilt9/sayi1/M00195.pdf

http://www.eurojournals.com/ejsr_26_1_01.pdf

Además, a partir de la energía generada por el viento, la estacionalidad es obvia.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí


1

No estoy seguro de si alguien ya ha dicho esto, pero en realidad se puede obligar a Pelwei a funcionar como una función weibull de 2 parámetros agregando un límite fijo.

En lugar de llamar moments<-pelwei(wind.moments), simplemente debes llamarmoments<-pelwei(wind.moments,bound=0)

siempre puede verificar cuál es el valor zeta. Si no es 0 y está usando dweibull, debe hacer algo al respecto.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.