Analisando dados de vento com R

12

Olá, estou analisando dados de vento para estimar energia de uma turbina eólica.
Eu peguei 10 anos de dados de vento e fiz um gráfico de um histograma;
meu segundo estágio foi ajustar uma distribuição Weibull aos dados.
Eu usei R com o pacote lmompara calcular a forma e escala de Weibul. Este é o código que eu usei:

>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 há algum atraso entre os dados e a função de densidade; Você pode me ajudar com isto? Outra pergunta é: você pode me ajudar a calcular a energia anual a partir da função densidade?

insira a descrição da imagem aqui
obrigado

eliavs
fonte
Sobre a foto, poste em alguma hospedagem de imagem e coloque um link - eu a converterei em uma foto colada.
+1, pergunta interessante, você pode achar que em breve você vai ter reputação suficiente :)
mpiktas
2
a julgar pelo gráfico, o problema não é o atraso. O que você planejou é aproximadamente uma boa forma. Portanto, parece que a distribuição Weibull não é apropriada para seus dados. Vejo que há um monte perto de zero. Você tem valores zero em seus dados? Nesse caso, você precisará modelar valores zero separadamente. Portanto, a primeira sugestão seria tentar Weibull para valores diferentes de zero. Também por que Weibull, há uma razão específica, alguma referência de trabalho semelhante, talvez?
Mvctas
1
note que 'lag' é um termo usado principalmente na análise de dados no tempo, referindo-se a uma coisa que ocorre após a outra. Isso não é um atraso - talvez seja mais precisamente chamado de mudança - ou talvez um deslocamento -, mas a mudança é provavelmente mais comum nas distribuições, elas mudam e escalam.
Spacedman
1
tenha cuidado ao usar as.numeric (x) com fatores; você realmente deseja usar as.numeric (as.character (x)) para garantir que você obtenha o valor numérico correto para o fator.
Andy Clifton

Respostas:

5

lmomA função pelweise encaixa em uma distribuição Weibull de três parâmetros, com parâmetros de localização , escala e forma. rweibullgera números aleatórios para uma distribuição Weibull de dois parâmetros. Você precisa subtrair o parâmetro location moments["zeta"]. Isso deve dar um ajuste melhor , mas não parece que dará um bom ajuste aos seus dados específicos.

Observo que http://www.reuk.co.uk/Wind-Speed-Distribution-Weibull.htm diz que "a velocidade do vento na maior parte do mundo pode ser modelada usando a distribuição Weibull". Talvez você seja apenas azarado e viva em uma parte do mundo onde eles não podem!

uma parada
fonte
você acha que pode me ajudar com a minha segunda pergunta: calcular a energia eólica com base na função de densidade?
Eliavs
2
Não sou físico e não conheço as equações necessárias, mas imagino que isso envolva uma integral numérica sobre a densidade. A integrate()função de R pode ser útil para isso.
onestop 13/02/11
eu sei a equação minha problam é que eu quero calcular a porcentagem de tempo que o vento é a cada velocidade
eliavs
O que quero dizer é que você pode me ajudar com a integração -> obrigado
eliavs
6

Recriei sua plotagem com dados de http://hawaii.gov/dbedt/ert/winddata/krab0192.txt (fiz as 1200 medições). Consegui um ajuste decente dos dados, geralmente usando seu 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 do vento

Desculpe, não tenho certeza se seu problema poderia ser, mas acho que você deve ajustar os dados aos seus dados. O que me deixa desconfiada é a curva do sino do seu gráfico de densidade, não tenho ideia de onde isso veio.

Aqui estão os momentos que eu gerei:

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 para a produção anual: suponho que eu geraria valores discretos para a função de densidade de probabilidade, multiplicaria esses valores pela função de saída e resumiria. Como alternativa, você pode simplesmente usar seus dados brutos, multiplicar os valores pela função de saída, resumir e calcular a média anual. Você deve controlar a sazonalidade de uma maneira adequada (por exemplo, certifique-se de usar anos inteiros ou ponderar adequadamente) .

Aqui está a saída não controlada (usando a fórmula de http://www.articlesbase.com/diy-articles/determining-wind-turbine-annual-power-output-a-simple-formula-based-upon-blade-diameter- e a velocidade média do vento na sua localização-513080.html )

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

Aqui está um post recente na SO sobre turbinas eólicas. Minha resposta nesse link tem três links nos quais você pode estar interessado:

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

Acabei de verificar um dos links Weibull na resposta SO acima. Por alguma razão, o link está inoperante. Aqui estão alguns links que fornecem as mesmas informações básicas:

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

Além disso, a partir da energia gerada pelo vento, a sazonalidade é óbvia.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

bill_080
fonte
1

Não tenho certeza se alguém já fez esse argumento, mas o pelwei pode realmente ser forçado a funcionar como uma função weibull de 2 parâmetros, adicionando um limite fixo.

Em vez de ligar, moments<-pelwei(wind.moments)você deve simplesmente ligarmoments<-pelwei(wind.moments,bound=0)

você sempre pode verificar qual é o valor zeta. Se não for 0 e você estiver usando o dweibull, precisará fazer algo sobre isso.

Chris
fonte