@@ -535,97 +535,106 @@ run_temp_oxygen_forecast <- function(bc, params, ini, times, ice = FALSE,
535
535
idstart <- 1
536
536
q_par <- params [7 ]
537
537
nep_par <- params [20 ]
538
- for (nn in which(! is.na(observed $ WT_obs ))[2 : length(which(! is.na(observed $ WT_obs )))]){
538
+
539
+ for (nn in which(! is.na(observed [,2 ]) | ! is.na(observed [,3 ]))[2 : length( which(! is.na(observed [,2 ]) | ! is.na(observed [,3 ])))]){
540
+ # which(!is.na(observed$WT_obs))[2:length(which(!is.na(observed$WT_obs)))]
541
+ # which(!is.na(observed[,2:3]))[2:length(which(!is.na(observed[,2:3])))]
539
542
idstop = nn
540
543
result <- matrix (NA , nrow = 100 , ncol = 2 )
541
544
param_matrix <- matrix (NA , nrow = 100 , ncol = 2 )
542
- for (random_run in 1 : 100 ){
543
- params [7 ] <- rnorm(n = 1 , mean = q_par , sd = 1e8 )
544
- while (is.na(params [7 ])){
545
- params [7 ] <- rnorm(n = 1 , mean = q_par , sd = 1e8 )
545
+ id_row1 = 1
546
+ id_row2 = 1
547
+
548
+ if ( ! is.na(observed $ WT_obs [idstop ])){
549
+ for (random_run in 1 : 100 ){
550
+ params [7 ] <- rnorm(n = 1 , mean = q_par , sd = 1e7 )
551
+ while (is.na(params [7 ])){
552
+ params [7 ] <- rnorm(n = 1 , mean = q_par , sd = 1e7 )
553
+ }
554
+ out <- ode(times = c(idstart : idstop ), y = ini , func = OneLayer_forecast , parms = params , method = ' rk4' )
555
+ nrmse_temp <- sqrt(sum((out [,2 ]- observed $ WT_obs [idstart : idstop ])^ 2 , na.rm = TRUE )/ (nrow(out )))/ (max(out [,2 ]) - min(out [,2 ]))
556
+ result [random_run ,1 ] <- nrmse_temp
557
+ param_matrix [random_run ,1 ] <- params [7 ]
546
558
}
547
-
548
- out <- ode(times = c(idstart : idstop ), y = ini , func = OneLayer_forecast , parms = params , method = ' rk4' )
549
- nrmse_temp <- sqrt(sum((out [,2 ]- observed $ WT_obs [idstart : idstop ])^ 2 , na.rm = TRUE )/ (nrow(out )))/ (max(out [,2 ]) - min(out [,2 ]))
550
- # nrmse_do <- sqrt(sum((out[,3]/ 1000 / params[1] * 1e6 - observed$DO_obs[idstart:idstop])^2)/nrow(out))/(max(out[,3]) - min(out[,3]))
551
- result [random_run ,1 ] <- nrmse_temp # , nrmse_do)
552
- param_matrix [random_run ,1 ] <- params [7 ] # params[20])
553
- }
554
- # sum_result <- apply(result, 1, function(x) sum(x,na.rm = TRUE))
555
- id_row1 <- which.min(result [,1 ])
556
559
560
+ id_row1 <- which.min(result [,1 ])
557
561
params [7 ] <- param_matrix [id_row1 , 1 ]
562
+ q_par = params [7 ]
558
563
559
- for (random_run2 in 1 : 100 ){
560
- params [20 ] <- rnorm(n = 1 , mean = nep_par , sd = 1e-7 )
561
- while (is.na(params [20 ])){
562
- params [20 ] <- rnorm(n = 1 , mean = nep_par , sd = 1e-7 )
563
- }
564
- out <- ode(times = c(idstart : idstop ), y = ini , func = OneLayer_forecast , parms = params , method = ' rk4' )
565
- nrmse_do <- sqrt(sum((out [,3 ]/ 1000 / params [1 ] * 1e6 - observed $ DO_obs [idstart : idstop ])^ 2 , na.rm = TRUE )/ nrow(out ))/ (max(out [,3 ]) - min(out [,3 ]))
566
-
567
- result [random_run2 ,2 ] <- nrmse_do # , nrmse_do)
568
- param_matrix [random_run2 ,2 ] <- params [20 ] # params[20])
564
+ }
565
+
566
+ if (! is.na(observed $ DO_obs [idstop ])){
567
+ for (random_run2 in 1 : 100 ){
568
+ params [20 ] <- rnorm(n = 1 , mean = nep_par , sd = 1e-5 )
569
+ while (is.na(params [20 ])){
570
+ params [20 ] <- rnorm(n = 1 , mean = nep_par , sd = 1e-5 )
571
+ }
572
+ out <- ode(times = c(idstart : idstop ), y = ini , func = OneLayer_forecast , parms = params , method = ' rk4' )
573
+ nrmse_do <- sqrt(sum((out [,3 ]/ 1000 / params [1 ] * 1e6 - observed $ DO_obs [idstart : idstop ])^ 2 , na.rm = TRUE )/ nrow(out ))/ ((max(out [,3 ]) - min(out [,3 ]))/ 1000 / params [1 ] * 1e6 )
574
+
575
+ result [random_run2 ,2 ] <- nrmse_do # , nrmse_do)
576
+ param_matrix [random_run2 ,2 ] <- params [20 ] # params[20])
569
577
}
570
-
571
- id_row2 <- which.min(result [,2 ])
572
578
573
- # sum_result <- apply(result, 1, function(x) sum(x,na.rm = TRUE))
574
- # id_row <- which.min(sum_result)
575
-
576
- # q_par <- param_matrix[id_row, 1]
577
- # nep_par <- param_matrix[id_row, 2]
578
- # params[7] <- q_par
579
- # params[20] <- nep_par
580
-
581
- params [7 ] <- param_matrix [id_row1 , 1 ]
582
- q_par = params [7 ]
583
- if (length(id_row2 ) > 0 ){
579
+ id_row2 <- which.min(result [,2 ])
584
580
params [20 ] <- param_matrix [id_row2 , 2 ]
585
581
nep_par <- params [20 ]
586
- } else {
587
- params [20 ] <- param_matrix [id_row1 , 2 ]
588
- nep_par <- params [20 ]
589
582
}
590
-
583
+
584
+ # params[7] <- param_matrix[id_row1, 1]
585
+ #
586
+ # if (length(id_row2) > 0){
587
+ #
588
+ # } else {
589
+ # params[20] <- param_matrix[id_row1, 2]
590
+ # nep_par <- params[20]
591
+ # }
591
592
592
593
out <- ode(times = c(idstart : idstop ), y = ini , func = OneLayer_forecast , parms = params , method = ' rk4' )
593
594
594
- if (match(nn , which(! is.na(observed $ WT_obs )) [2 : length(which(! is.na(observed $ WT_obs )))]) == 1 ){
595
+ if (match(nn , which(! is.na(observed [, 2 ]) | ! is.na( observed [, 3 ])) [2 : length( which(! is.na(observed [, 2 ]) | ! is.na( observed [, 3 ] )))]) == 1 ){
595
596
out_total <- rbind(out_total , out )
596
597
} else {
597
598
out_total <- rbind(out_total , out [- c(1 ),])
598
599
}
599
600
600
- print(paste0(match(nn , which(! is.na(observed $ WT_obs ))[2 : length(which(! is.na(observed $ WT_obs )))]),' /' ,
601
- length(which(! is.na(observed $ WT_obs ))[2 : length(which(! is.na(observed $ WT_obs )))]),
602
- ' ; WTR NRMSE: ' ,round(result [id_row1 ],5 )))
603
- print(q_par )
604
- print(nep_par )
601
+ print(paste0(match(nn , which(! is.na(observed [,2 ]) | ! is.na(observed [,3 ]))[2 : length( which(! is.na(observed [,2 ]) | ! is.na(observed [,3 ])))]),' /' ,
602
+ length(which(! is.na(observed [,2 ]) | ! is.na(observed [,3 ]))[2 : length( which(! is.na(observed [,2 ]) | ! is.na(observed [,3 ])))]),
603
+ ' ; current WTR NRMSE: ' ,round(result [id_row1 ,1 ],5 ),
604
+ ' ; current DO NRMSE: ' ,round(result [id_row2 ,2 ],5 )))
605
+ # print(q_par)
606
+ # print(nep_par)
605
607
606
608
idstart = nn
607
609
ini <- out [nrow(out ), 2 : 3 ]
610
+
611
+ if (! is.na(observed $ WT_obs [idstop ])){
608
612
ini [1 ] <- rnorm(n = 1 , mean = observed $ WT_obs [idstop ], sd = 0.1 )
613
+ }
614
+ if (! is.na(observed $ DO_obs [idstop ])){
615
+ ini [2 ] <- rnorm(n = 1 , mean = observed $ DO_obs [idstop ] * 1000 * params [1 ] / 1e6 , sd = 10 )
616
+ # 1000/1e6 * wq_parameters[1]
617
+ }
609
618
}
610
619
611
620
if (max(times ) > idstart ){
612
621
out_forecast <- list ()
613
622
for (random_run3 in 1 : 100 ){
614
- params [7 ] <- rnorm(n = 1 , mean = q_par , sd = 1e8 )
623
+ params [7 ] <- rnorm(n = 1 , mean = q_par , sd = 1e7 )
615
624
while (is.na(params [7 ])){
616
- params [7 ] <- rnorm(n = 1 , mean = q_par , sd = 1e8 )
625
+ params [7 ] <- rnorm(n = 1 , mean = q_par , sd = 1e7 )
617
626
}
618
- params [20 ] <- rnorm(n = 1 , mean = nep_par , sd = 1e-7 )
627
+ params [20 ] <- rnorm(n = 1 , mean = nep_par , sd = 1e-5 )
619
628
while (is.na(params [20 ])){
620
- params [20 ] <- rnorm(n = 1 , mean = nep_par , sd = 1e-7 )
629
+ params [20 ] <- rnorm(n = 1 , mean = nep_par , sd = 1e-5 )
621
630
}
622
631
out <- ode(times = c(idstart : max(times )), y = ini , func = OneLayer_forecast , parms = params , method = ' rk4' )
623
632
out_df <- rbind(out_total , out [- c(1 ),])
624
633
625
634
out_forecast [[match(random_run3 , seq(1 ,100 ))]] <- out_df
626
635
}
627
636
628
- }
637
+ } else { out_forecast = out_total }
629
638
630
639
return (out_forecast )
631
640
}
0 commit comments