Analizzare i dati del vento con R


12

Ciao, sto analizzando i dati del vento per stimare l'energia da una turbina eolica.
Ho preso 10 anni di dati sul vento e ho rappresentato graficamente un istogramma;
il mio secondo stadio è stato quello di adattare una distribuzione Weibull ai dati.
Ho usato R con il pacchetto lmomper calcolare la forma di Weibul e ridimensionare questo è il codice che ho usato:

>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)    

Sembra che ci sia un certo ritardo tra i dati e la funzione di densità; Puoi aiutarmi con questo? Un'altra domanda è: puoi aiutarmi a calcolare l'energia annuale dalla funzione di densità?

inserisci qui la descrizione dell'immagine
grazie


A proposito della foto, pubblica su un hosting di immagini e metti un link: lo convertirò in una foto incollata.

+1, domanda interessante, potresti scoprire che presto avrai abbastanza reputazione :)
mpiktas,

2
a giudicare dal grafico, il problema non è il ritardo. Ciò che hai tracciato è approssimativamente la bontà di adattamento. Quindi sembra che la distribuzione di Weibull non sia appropriata per i tuoi dati. Vedo che c'è un gruppo vicino allo zero, hai valori zero nei tuoi dati? In tal caso, dovrai modellare i valori zero separatamente. Quindi il primo suggerimento sarebbe di provare Weibull per valori diversi da zero. Anche perché Weibull, c'è forse un motivo particolare, qualche riferimento da un lavoro simile forse?
mpiktas,

1
si noti che "ritardo" è un termine utilizzato principalmente nell'analisi dei dati nel tempo, riferendosi a una cosa che si verifica dopo l'altra. Questo non è un ritardo - forse è più precisamente chiamato uno spostamento - o forse un offset - ma lo spostamento è probabilmente più comune per le distribuzioni, si spostano e si ridimensionano.
Spacedman,

1
fare attenzione a usare as.numeric (x) con i fattori; vuoi effettivamente usare as.numeric (as.character (x)) per assicurarti di ottenere il giusto valore numerico per il fattore.
Andy Clifton,

Risposte:


5

lmomLa funzione si pelweiadatta a una distribuzione Weibull a tre parametri, con parametri di posizione , scala e forma. rweibullgenera numeri casuali per una distribuzione Weibull di due parametri. Devi sottrarre il parametro location moments["zeta"]. Ciò dovrebbe adattarsi meglio , ma non sembra che si adatterà bene ai tuoi dati particolari.

Ho notato che http://www.reuk.co.uk/Wind-Speed-Distribution-Weibull.htm dice "Le velocità del vento nella maggior parte del mondo possono essere modellate utilizzando la distribuzione Weibull". Forse sei solo sfortunato e vivi in ​​una parte del mondo dove non possono!


pensi che puoi aiutarmi con la mia seconda domanda: calcolare l'energia eolica in base alla funzione di densità?
eliavs,

2
Non sono un fisico e non conosco le equazioni necessarie, ma immagino che comporterà un integrale numerico sulla densità. La integrate()funzione di R può essere utile per questo.
onestop,

conosco l'equazione che il mio problam è che voglio calcolare la percentuale di tempo in cui il vento è ad ogni velocità
eliavs

cosa io sono e puoi aiutarmi con l'integrazione -> grazie
eliavs

6

Ho ricreato la tua trama con i dati di http://hawaii.gov/dbedt/ert/winddata/krab0192.txt (ho preso le 1200 misurazioni). Ho avuto un discreto adattamento dei dati, generalmente usando il tuo codice:

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)

Trama del vento

Spiacenti, non sono sicuro che il tuo problema potrebbe essere, ma penso che dovresti essere in grado di adattare Weibull ai tuoi dati. Ciò che mi rende sospetto è la curva a campana del diagramma della densità, non ho idea da dove provenga.

Ecco i momenti che ho generato:

wind.moments

       l_1         l_2         t_3         t_4 
15.17287544  4.80372580  0.14963501  0.06954438

momenti

     zeta      beta     delta 
 0.516201 16.454233  1.745413 

WTR per l'output annuale: suppongo di generare valori discreti per la funzione di densità di probabilità, moltiplicare questi valori con la funzione di output e riassumere. In alternativa, puoi semplicemente utilizzare i tuoi dati non elaborati, moltiplicare i valori con la funzione di output, riassumerli e calcolare la media annuale, dovresti controllare la stagionalità in modo adeguato (ad esempio assicurati di utilizzare interi anni o di ponderare di conseguenza) .

Ecco l'output incontrollato (usando la formula da http://www.articlesbase.com/diy-articles/determining-wind-turbine-annual-power-output-a-simple-formula-based-upon-blade-diameter- e-velocità-media-del-vento-a-tua-posizione-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

Ecco un recente post a SO sulle turbine eoliche. La mia risposta su quel link ha tre link che potrebbero interessarti:

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

Ho appena controllato uno dei link Weibull nella risposta SO sopra. Per qualche motivo, il collegamento non è attivo. Ecco alcuni link che forniscono le stesse informazioni di base:

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

Inoltre, dal potere generato dal vento, la stagionalità è ovvia.

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


1

Non sono sicuro che qualcuno abbia già fatto questo punto, ma pelwei può effettivamente essere costretto a funzionare come una funzione weibull a 2 parametri aggiungendo un limite fisso.

Invece di chiamare moments<-pelwei(wind.moments)dovresti semplicemente chiamaremoments<-pelwei(wind.moments,bound=0)

puoi sempre controllare qual è il valore zeta. Se non è 0 e stai usando dweibull, devi fare qualcosa al riguardo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.