Metainformationen zur Seite
  •  

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
hydro:speichermodell [2022/05/13 16:11] ckuellshydro:speichermodell [2024/04/10 10:02] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
-=== Speichermodell ===+==== Speichermodell ==== 
 + 
 +=== Theorie ===
  
 Das Speichermodell kann zur einfachen Modellierung von Einzugsgebieten verwendet werden. Es beruht auf den Formeln Das Speichermodell kann zur einfachen Modellierung von Einzugsgebieten verwendet werden. Es beruht auf den Formeln
  
-$$ Q_t = \[N \cdot c \] \cdot \(1-e^{\(-\frac{t}/{)}\)$$ für den Anstieg und +$$ Q_t = (N \cdot C ) \cdot (1-e^{(-\frac{t}{K})})$$ für den Anstieg und 
  
-$$ Q_t = Q_{(t-t_e)} \cdot e^{\(-\frac{(t-t_e)}{K}}\)}$$ +$$ Q_t = Q_{(t-t_e)} \cdot e^{ (-\frac{(t-t_e)}{K})}$$ 
  
-für den Rückgang+für den Rückgang. Dabei sind N der Niederschlag in mm, C der Abflusskoeffizient (0<=C<=1), t die Zeit, K der Rückgangsfaktor (entspricht der Dauer, in der der Abfluss um eine logarithmische Einheit zurückgeht). Die Variable $t_e$ steht für die Zeit, bei der der Spitzenabfluss erreicht wird und bei der der Niederschlag aufhört (Ende des Niederschlages). 
  
-<code rsplus |Speichermodell.r> +=== Funktion in R ===
-K <- 10.0 # Speicherkonstante +
-C <- 0.1 # Abflusskoeffizient +
-N <- 35  # Niederschlag in mm+
  
-ta <- 1  # erster Zeitschritt ta +Das Speichermodell wurde als Funktion in R programmiert. Die Funktion benötigt die Variablen N, C, K, $t_a$=(Anfangszeit, Standard ist 0.0), $t_e$=Ende des Niederschlages (muss größer als $t_a$ und kleiner als $t_m$ sein, $t_m$=Ende der Zeitreihe (muss größer als $t_e$ sein). Sie kann als ELS() aufgerufen werden. Dabei sind alle Werte mit Standardwerten vor belegt: N=50, C=0.1, K=7$t_a$=0.0, $t_e$=7 (Tage), $t_m$= 30 (Tage). Wenn die vorbelegten Werte geändert werden sollen muss die Funktion entsprechend aufgerufen werden, z. Bsp. ELS(N=30,C=0.2,K=10), alle Variablen, die nicht aufgerufen werden, bleiben im Standardzustand.
-tm <- 50 # Letzer Zeitschritt tmax +
-dt <-  # Zeitschritt +
-tv <- seq(ta,tm,by=dt# Zeitvariable +
-Lt <- length(tv) +
-te <- 25 +
-Qt <- replicate(Lt,0)+
  
-t<-ta +Wenn die Eingabe fehlerhaft ist, wird eine Variable //errorflag// gesetzt und eine Fehlermeldung ausgegeben, die Erstellung der Graphik mit plot() erfolgt nicht. 
-while (t<=tm) { + 
-  if(t<=te){ +<code rsplus |Speichermodell.r> 
-    Q[t] <- (N*C)*(1-exp(-t/K)) +ELS <- function(N=50,C=0.1,K=7,ta=0,te=10,tm=30,dt=1){ 
-  } else { +  errorflag <- FALSE 
-    Q[t] <- (N*C)*exp(-(t-te)/K)+  # Prüfe 
 +  if (N<0.0){ 
 +    error <- "N ist < 0.0" 
 +    errorflag <- TRUE 
 +  } 
 +  if(C < 0.0 | C > 1.0){ 
 +    error <- "C nicht zwischen 0.0 und 1.0" 
 +    errorflag <- TRUE 
 +  }  
 +  if(K <= 0.0){ 
 +    error <- "K nicht >= 0" 
 +    errorflag <- TRUE 
 +  }  
 +  if (ta<0.0){ 
 +    error <- "ta ist < 0.0" 
 +    errorflag <- TRUE 
 +  } 
 +  if (ta>=te){ 
 +    error <- "ta ist > te" 
 +    errorflag <- TRUE 
 +  } 
 +  if (ta>=tm){ 
 +    error <- "ta ist > tm" 
 +    errorflag <- TRUE 
 +  } 
 +  if (dt<=0.0){ 
 +    error <- "dt ist <= 0.0" 
 +    errorflag <- TRUE 
 +  } 
 +  if (dt>te){ 
 +    error <- "dt ist > te" 
 +    errorflag <- TRUE 
 +  } 
 +   
 +  # Erzeuge die Zeitreihe 
 +  tv <- seq(ta,tm,by=dt) # Zeitvariable in Tagen  
 +  # Berechne die Länge in Tagen 
 +  Lt <- length(tv) 
 +  # Initialisiere die Abflussserie mit 0, Einheit mm 
 +  Qt <- replicate(Lt,0) 
 +  # Erzeuge Variable für letzten Wert der Schleife  
 +  QL <- 0.0 # last discharge 
 +   
 +  # i ist die Integer Laufvariable, ist die Zeit 
 +  i  <- 1 
 +  t  <- ta 
 +  while (i<=Lt) { 
 +    if(t<=te){ 
 +      # Anstieg (t < te) 
 +      Qt[i] <- (N*C)*(1-exp(-t/K)) 
 +      QL   <- Qt[i] 
 +      } else { 
 +      # Rückgang 
 +      Qt[i] <- QL*exp(-(t-te)/K) 
 +    } 
 +    # Gehe einen Zeitschritt dt weiter für t und setze Index i um +1 hoch 
 +    t <- t + dt 
 +    i <- i + 1 
 +  } 
 +   
 +  # plot 
 +  if (errorflag){ 
 +    print(error) 
 +  } else{ 
 +    plot(tv,Qt, col=2, xlab="Zeit (Tage)", ylab="Q (l/s)", type = "o")  
   }   }
-# Gehe einen Zeitschritt weiter 
-t <- t + dt 
 } }
-# plot(Q) 
-plot(tv,Q, col=2, xlab="Zeit t", ylab="Q", xlim=range(0:50), ylim=range(0:5)) 
 </code> </code>