Simple Spatial Modeling – Part 3: Solutions

Below are the solutions to these exercises on “Simple Spatial Modeling – Part 3.”

###############
#             #
# Exercise 1  #
#             #
###############

ntimesteps <- 1000
ncell <- 25
timestep <- 1
t <- 0
k <- 0.01

###############
#             #
# Exercise 2  #
#             #
###############
H <- matrix(data = 1,nrow=ncell,ncol=ncell)

###############
#             #
# Exercise 3  #
#             #
###############
qh <- matrix(data = 0,nrow=ncell,ncol=ncell+1)
qv <- matrix(data = 0,nrow=ncell+1,ncol=ncell)
qh[,1] <- 0.0005
qh[,ncell+1] <- -0.0005
qv[1,] <- 0.0005
qv[ncell+1,10:15] <- 0.001


###############
#             #
# Exercise 4  #
#             #
###############
toutput <- 100
output <- array(0, dim=c(25,25,ntimesteps/toutput))
outputcount <- 0
outputtimer <- 0
time <- seq(from = 0, by=timestep*toutput, length.out=ntimesteps/toutput)


###############
#             #
# Exercise 5  #
#             #
###############
for(n in 1:ntimesteps){
  print(n) #print the number of loop on screen so that we know that the loop still working

  # calculate the water flow from left to right (qh)
  for(j in 1:(ncell)){          # For each row
    for(i in 1:(ncell-1)){      # For each cell within that row 
      Hdiff <- H[j,i]-H[j,i+1]  # calculate the difference water level between adjacent cells                       
      qh[j,i+1]<- k*Hdiff*timestep  #calculate the rate of flow.  
    }
  }

  # calculate the water flow from top to bottom (qv)
  for(i in 1:(ncell)){         # For each column
    for(j in 1:(ncell-1)){     # For each row within that column within that row
      Hdiff <- H[j,i]-H[j+1,i] # calculate the difference water level between adjacent cells                           
      qv[j+1,i]<- k*Hdiff*timestep # calculate the rate of flow.      
    }
  }

  # water storage update
  for(j in 1:ncell){    # For each row
    for(i in 1:ncell){    # Update water stores 
      H[j,i] <- H[j,i]+qh[j,i]-qh[j,i+1]+qv[j,i]-qv[j+1,i]
    }
  }
  # Here we take the intial water level of the cell and add the water that has flow in from the left, subract that to the one which has flown out to the right, added that from above and then subtracted that which has flown out from below.

  #calculate identify whether we output the data on this time step 
  outputtimer <- outputtimer +1
  if (outputtimer == toutput){    #if threshold tension is exceed at some point during the simulations
    outputcount <- outputcount+1
    outputtimer <- 0
    output[,,outputcount]<-H
  }

}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
## [1] 11
## [1] 12
## [1] 13
## [1] 14
## [1] 15
## [1] 16
## [1] 17
## [1] 18
## [1] 19
## [1] 20
## [1] 21
## [1] 22
## [1] 23
## [1] 24
## [1] 25
## [1] 26
## [1] 27
## [1] 28
## [1] 29
## [1] 30
## [1] 31
## [1] 32
## [1] 33
## [1] 34
## [1] 35
## [1] 36
## [1] 37
## [1] 38
## [1] 39
## [1] 40
## [1] 41
## [1] 42
## [1] 43
## [1] 44
## [1] 45
## [1] 46
## [1] 47
## [1] 48
## [1] 49
## [1] 50
## [1] 51
## [1] 52
## [1] 53
## [1] 54
## [1] 55
## [1] 56
## [1] 57
## [1] 58
## [1] 59
## [1] 60
## [1] 61
## [1] 62
## [1] 63
## [1] 64
## [1] 65
## [1] 66
## [1] 67
## [1] 68
## [1] 69
## [1] 70
## [1] 71
## [1] 72
## [1] 73
## [1] 74
## [1] 75
## [1] 76
## [1] 77
## [1] 78
## [1] 79
## [1] 80
## [1] 81
## [1] 82
## [1] 83
## [1] 84
## [1] 85
## [1] 86
## [1] 87
## [1] 88
## [1] 89
## [1] 90
## [1] 91
## [1] 92
## [1] 93
## [1] 94
## [1] 95
## [1] 96
## [1] 97
## [1] 98
## [1] 99
## [1] 100
## [1] 101
## [1] 102
## [1] 103
## [1] 104
## [1] 105
## [1] 106
## [1] 107
## [1] 108
## [1] 109
## [1] 110
## [1] 111
## [1] 112
## [1] 113
## [1] 114
## [1] 115
## [1] 116
## [1] 117
## [1] 118
## [1] 119
## [1] 120
## [1] 121
## [1] 122
## [1] 123
## [1] 124
## [1] 125
## [1] 126
## [1] 127
## [1] 128
## [1] 129
## [1] 130
## [1] 131
## [1] 132
## [1] 133
## [1] 134
## [1] 135
## [1] 136
## [1] 137
## [1] 138
## [1] 139
## [1] 140
## [1] 141
## [1] 142
## [1] 143
## [1] 144
## [1] 145
## [1] 146
## [1] 147
## [1] 148
## [1] 149
## [1] 150
## [1] 151
## [1] 152
## [1] 153
## [1] 154
## [1] 155
## [1] 156
## [1] 157
## [1] 158
## [1] 159
## [1] 160
## [1] 161
## [1] 162
## [1] 163
## [1] 164
## [1] 165
## [1] 166
## [1] 167
## [1] 168
## [1] 169
## [1] 170
## [1] 171
## [1] 172
## [1] 173
## [1] 174
## [1] 175
## [1] 176
## [1] 177
## [1] 178
## [1] 179
## [1] 180
## [1] 181
## [1] 182
## [1] 183
## [1] 184
## [1] 185
## [1] 186
## [1] 187
## [1] 188
## [1] 189
## [1] 190
## [1] 191
## [1] 192
## [1] 193
## [1] 194
## [1] 195
## [1] 196
## [1] 197
## [1] 198
## [1] 199
## [1] 200
## [1] 201
## [1] 202
## [1] 203
## [1] 204
## [1] 205
## [1] 206
## [1] 207
## [1] 208
## [1] 209
## [1] 210
## [1] 211
## [1] 212
## [1] 213
## [1] 214
## [1] 215
## [1] 216
## [1] 217
## [1] 218
## [1] 219
## [1] 220
## [1] 221
## [1] 222
## [1] 223
## [1] 224
## [1] 225
## [1] 226
## [1] 227
## [1] 228
## [1] 229
## [1] 230
## [1] 231
## [1] 232
## [1] 233
## [1] 234
## [1] 235
## [1] 236
## [1] 237
## [1] 238
## [1] 239
## [1] 240
## [1] 241
## [1] 242
## [1] 243
## [1] 244
## [1] 245
## [1] 246
## [1] 247
## [1] 248
## [1] 249
## [1] 250
## [1] 251
## [1] 252
## [1] 253
## [1] 254
## [1] 255
## [1] 256
## [1] 257
## [1] 258
## [1] 259
## [1] 260
## [1] 261
## [1] 262
## [1] 263
## [1] 264
## [1] 265
## [1] 266
## [1] 267
## [1] 268
## [1] 269
## [1] 270
## [1] 271
## [1] 272
## [1] 273
## [1] 274
## [1] 275
## [1] 276
## [1] 277
## [1] 278
## [1] 279
## [1] 280
## [1] 281
## [1] 282
## [1] 283
## [1] 284
## [1] 285
## [1] 286
## [1] 287
## [1] 288
## [1] 289
## [1] 290
## [1] 291
## [1] 292
## [1] 293
## [1] 294
## [1] 295
## [1] 296
## [1] 297
## [1] 298
## [1] 299
## [1] 300
## [1] 301
## [1] 302
## [1] 303
## [1] 304
## [1] 305
## [1] 306
## [1] 307
## [1] 308
## [1] 309
## [1] 310
## [1] 311
## [1] 312
## [1] 313
## [1] 314
## [1] 315
## [1] 316
## [1] 317
## [1] 318
## [1] 319
## [1] 320
## [1] 321
## [1] 322
## [1] 323
## [1] 324
## [1] 325
## [1] 326
## [1] 327
## [1] 328
## [1] 329
## [1] 330
## [1] 331
## [1] 332
## [1] 333
## [1] 334
## [1] 335
## [1] 336
## [1] 337
## [1] 338
## [1] 339
## [1] 340
## [1] 341
## [1] 342
## [1] 343
## [1] 344
## [1] 345
## [1] 346
## [1] 347
## [1] 348
## [1] 349
## [1] 350
## [1] 351
## [1] 352
## [1] 353
## [1] 354
## [1] 355
## [1] 356
## [1] 357
## [1] 358
## [1] 359
## [1] 360
## [1] 361
## [1] 362
## [1] 363
## [1] 364
## [1] 365
## [1] 366
## [1] 367
## [1] 368
## [1] 369
## [1] 370
## [1] 371
## [1] 372
## [1] 373
## [1] 374
## [1] 375
## [1] 376
## [1] 377
## [1] 378
## [1] 379
## [1] 380
## [1] 381
## [1] 382
## [1] 383
## [1] 384
## [1] 385
## [1] 386
## [1] 387
## [1] 388
## [1] 389
## [1] 390
## [1] 391
## [1] 392
## [1] 393
## [1] 394
## [1] 395
## [1] 396
## [1] 397
## [1] 398
## [1] 399
## [1] 400
## [1] 401
## [1] 402
## [1] 403
## [1] 404
## [1] 405
## [1] 406
## [1] 407
## [1] 408
## [1] 409
## [1] 410
## [1] 411
## [1] 412
## [1] 413
## [1] 414
## [1] 415
## [1] 416
## [1] 417
## [1] 418
## [1] 419
## [1] 420
## [1] 421
## [1] 422
## [1] 423
## [1] 424
## [1] 425
## [1] 426
## [1] 427
## [1] 428
## [1] 429
## [1] 430
## [1] 431
## [1] 432
## [1] 433
## [1] 434
## [1] 435
## [1] 436
## [1] 437
## [1] 438
## [1] 439
## [1] 440
## [1] 441
## [1] 442
## [1] 443
## [1] 444
## [1] 445
## [1] 446
## [1] 447
## [1] 448
## [1] 449
## [1] 450
## [1] 451
## [1] 452
## [1] 453
## [1] 454
## [1] 455
## [1] 456
## [1] 457
## [1] 458
## [1] 459
## [1] 460
## [1] 461
## [1] 462
## [1] 463
## [1] 464
## [1] 465
## [1] 466
## [1] 467
## [1] 468
## [1] 469
## [1] 470
## [1] 471
## [1] 472
## [1] 473
## [1] 474
## [1] 475
## [1] 476
## [1] 477
## [1] 478
## [1] 479
## [1] 480
## [1] 481
## [1] 482
## [1] 483
## [1] 484
## [1] 485
## [1] 486
## [1] 487
## [1] 488
## [1] 489
## [1] 490
## [1] 491
## [1] 492
## [1] 493
## [1] 494
## [1] 495
## [1] 496
## [1] 497
## [1] 498
## [1] 499
## [1] 500
## [1] 501
## [1] 502
## [1] 503
## [1] 504
## [1] 505
## [1] 506
## [1] 507
## [1] 508
## [1] 509
## [1] 510
## [1] 511
## [1] 512
## [1] 513
## [1] 514
## [1] 515
## [1] 516
## [1] 517
## [1] 518
## [1] 519
## [1] 520
## [1] 521
## [1] 522
## [1] 523
## [1] 524
## [1] 525
## [1] 526
## [1] 527
## [1] 528
## [1] 529
## [1] 530
## [1] 531
## [1] 532
## [1] 533
## [1] 534
## [1] 535
## [1] 536
## [1] 537
## [1] 538
## [1] 539
## [1] 540
## [1] 541
## [1] 542
## [1] 543
## [1] 544
## [1] 545
## [1] 546
## [1] 547
## [1] 548
## [1] 549
## [1] 550
## [1] 551
## [1] 552
## [1] 553
## [1] 554
## [1] 555
## [1] 556
## [1] 557
## [1] 558
## [1] 559
## [1] 560
## [1] 561
## [1] 562
## [1] 563
## [1] 564
## [1] 565
## [1] 566
## [1] 567
## [1] 568
## [1] 569
## [1] 570
## [1] 571
## [1] 572
## [1] 573
## [1] 574
## [1] 575
## [1] 576
## [1] 577
## [1] 578
## [1] 579
## [1] 580
## [1] 581
## [1] 582
## [1] 583
## [1] 584
## [1] 585
## [1] 586
## [1] 587
## [1] 588
## [1] 589
## [1] 590
## [1] 591
## [1] 592
## [1] 593
## [1] 594
## [1] 595
## [1] 596
## [1] 597
## [1] 598
## [1] 599
## [1] 600
## [1] 601
## [1] 602
## [1] 603
## [1] 604
## [1] 605
## [1] 606
## [1] 607
## [1] 608
## [1] 609
## [1] 610
## [1] 611
## [1] 612
## [1] 613
## [1] 614
## [1] 615
## [1] 616
## [1] 617
## [1] 618
## [1] 619
## [1] 620
## [1] 621
## [1] 622
## [1] 623
## [1] 624
## [1] 625
## [1] 626
## [1] 627
## [1] 628
## [1] 629
## [1] 630
## [1] 631
## [1] 632
## [1] 633
## [1] 634
## [1] 635
## [1] 636
## [1] 637
## [1] 638
## [1] 639
## [1] 640
## [1] 641
## [1] 642
## [1] 643
## [1] 644
## [1] 645
## [1] 646
## [1] 647
## [1] 648
## [1] 649
## [1] 650
## [1] 651
## [1] 652
## [1] 653
## [1] 654
## [1] 655
## [1] 656
## [1] 657
## [1] 658
## [1] 659
## [1] 660
## [1] 661
## [1] 662
## [1] 663
## [1] 664
## [1] 665
## [1] 666
## [1] 667
## [1] 668
## [1] 669
## [1] 670
## [1] 671
## [1] 672
## [1] 673
## [1] 674
## [1] 675
## [1] 676
## [1] 677
## [1] 678
## [1] 679
## [1] 680
## [1] 681
## [1] 682
## [1] 683
## [1] 684
## [1] 685
## [1] 686
## [1] 687
## [1] 688
## [1] 689
## [1] 690
## [1] 691
## [1] 692
## [1] 693
## [1] 694
## [1] 695
## [1] 696
## [1] 697
## [1] 698
## [1] 699
## [1] 700
## [1] 701
## [1] 702
## [1] 703
## [1] 704
## [1] 705
## [1] 706
## [1] 707
## [1] 708
## [1] 709
## [1] 710
## [1] 711
## [1] 712
## [1] 713
## [1] 714
## [1] 715
## [1] 716
## [1] 717
## [1] 718
## [1] 719
## [1] 720
## [1] 721
## [1] 722
## [1] 723
## [1] 724
## [1] 725
## [1] 726
## [1] 727
## [1] 728
## [1] 729
## [1] 730
## [1] 731
## [1] 732
## [1] 733
## [1] 734
## [1] 735
## [1] 736
## [1] 737
## [1] 738
## [1] 739
## [1] 740
## [1] 741
## [1] 742
## [1] 743
## [1] 744
## [1] 745
## [1] 746
## [1] 747
## [1] 748
## [1] 749
## [1] 750
## [1] 751
## [1] 752
## [1] 753
## [1] 754
## [1] 755
## [1] 756
## [1] 757
## [1] 758
## [1] 759
## [1] 760
## [1] 761
## [1] 762
## [1] 763
## [1] 764
## [1] 765
## [1] 766
## [1] 767
## [1] 768
## [1] 769
## [1] 770
## [1] 771
## [1] 772
## [1] 773
## [1] 774
## [1] 775
## [1] 776
## [1] 777
## [1] 778
## [1] 779
## [1] 780
## [1] 781
## [1] 782
## [1] 783
## [1] 784
## [1] 785
## [1] 786
## [1] 787
## [1] 788
## [1] 789
## [1] 790
## [1] 791
## [1] 792
## [1] 793
## [1] 794
## [1] 795
## [1] 796
## [1] 797
## [1] 798
## [1] 799
## [1] 800
## [1] 801
## [1] 802
## [1] 803
## [1] 804
## [1] 805
## [1] 806
## [1] 807
## [1] 808
## [1] 809
## [1] 810
## [1] 811
## [1] 812
## [1] 813
## [1] 814
## [1] 815
## [1] 816
## [1] 817
## [1] 818
## [1] 819
## [1] 820
## [1] 821
## [1] 822
## [1] 823
## [1] 824
## [1] 825
## [1] 826
## [1] 827
## [1] 828
## [1] 829
## [1] 830
## [1] 831
## [1] 832
## [1] 833
## [1] 834
## [1] 835
## [1] 836
## [1] 837
## [1] 838
## [1] 839
## [1] 840
## [1] 841
## [1] 842
## [1] 843
## [1] 844
## [1] 845
## [1] 846
## [1] 847
## [1] 848
## [1] 849
## [1] 850
## [1] 851
## [1] 852
## [1] 853
## [1] 854
## [1] 855
## [1] 856
## [1] 857
## [1] 858
## [1] 859
## [1] 860
## [1] 861
## [1] 862
## [1] 863
## [1] 864
## [1] 865
## [1] 866
## [1] 867
## [1] 868
## [1] 869
## [1] 870
## [1] 871
## [1] 872
## [1] 873
## [1] 874
## [1] 875
## [1] 876
## [1] 877
## [1] 878
## [1] 879
## [1] 880
## [1] 881
## [1] 882
## [1] 883
## [1] 884
## [1] 885
## [1] 886
## [1] 887
## [1] 888
## [1] 889
## [1] 890
## [1] 891
## [1] 892
## [1] 893
## [1] 894
## [1] 895
## [1] 896
## [1] 897
## [1] 898
## [1] 899
## [1] 900
## [1] 901
## [1] 902
## [1] 903
## [1] 904
## [1] 905
## [1] 906
## [1] 907
## [1] 908
## [1] 909
## [1] 910
## [1] 911
## [1] 912
## [1] 913
## [1] 914
## [1] 915
## [1] 916
## [1] 917
## [1] 918
## [1] 919
## [1] 920
## [1] 921
## [1] 922
## [1] 923
## [1] 924
## [1] 925
## [1] 926
## [1] 927
## [1] 928
## [1] 929
## [1] 930
## [1] 931
## [1] 932
## [1] 933
## [1] 934
## [1] 935
## [1] 936
## [1] 937
## [1] 938
## [1] 939
## [1] 940
## [1] 941
## [1] 942
## [1] 943
## [1] 944
## [1] 945
## [1] 946
## [1] 947
## [1] 948
## [1] 949
## [1] 950
## [1] 951
## [1] 952
## [1] 953
## [1] 954
## [1] 955
## [1] 956
## [1] 957
## [1] 958
## [1] 959
## [1] 960
## [1] 961
## [1] 962
## [1] 963
## [1] 964
## [1] 965
## [1] 966
## [1] 967
## [1] 968
## [1] 969
## [1] 970
## [1] 971
## [1] 972
## [1] 973
## [1] 974
## [1] 975
## [1] 976
## [1] 977
## [1] 978
## [1] 979
## [1] 980
## [1] 981
## [1] 982
## [1] 983
## [1] 984
## [1] 985
## [1] 986
## [1] 987
## [1] 988
## [1] 989
## [1] 990
## [1] 991
## [1] 992
## [1] 993
## [1] 994
## [1] 995
## [1] 996
## [1] 997
## [1] 998
## [1] 999
## [1] 1000
###############
#             #
# Exercise 6  #
#             #
###############

filled.contour(H, nlevels=100, color.palette=rainbow)

g_range <- range(output)  # identify the axis range of the countour plot
for(n in 1:outputcount){  # For each output time
  filled.contour(output[,,n], nlevels=100, color.palette=rainbow,zlim=g_range) # plot the contour plot
  Sys.sleep(1) # the waite for a second
} # repeat for the next output and watch the water levels vary over time.




Simple Spatial Modeling – Part 3: Exercises

So far, we have learned how to count spatial variability in our model. Please look at these two previous exercises here and here if you haven’t tried it yet. However, it only represents 1-Dimension models. In this exercise, we will try to expand our spatial consideration into a 2-Dimension model.

Have a look at this plan view below to get an illustration of how the 2-dimensions model work.

The water levels are store in a 2-D array. They are numbered as follows:

The water flows are stored in 2 different 2-D arrays.
1. QV: defines water flows between buckets down the screen (in plan view)
2. QH: defines water flows between buckets across the screen.


Let’s get into the modeling by cracking the exercises below. Answers to these exercises are available here. If you obtained a different (correct) answer than those listed on the solutions page, please feel free to post your answer as a comment on that page.

Exercise 1
Set all the required settings for the model:
a. Set the number of time steps. Here we use 1000 (it shows how many time steps we are going to run in the model; you can change it as much as you want.)
b. Set the total number of cells; here we have 25 x 25 water tanks.
c. Set time steps in seconds; here is 1.
d. Set the time at the start of simulations.
e. Set k between each water tank. Here we set a uniform value of k; 0.01.

Exercise 2
Create matrix H for the initial water level in the water tank.

Exercise 3
Set boundary conditions for the model. Here we have water flow (qh) into the water tanks from three sides (top, left and right) and water flowing out on the bottom (qv; see the plan view.) Water flow to the right and to the bottoms are considered positive. Don’t forget to declare the matrix for qh and qv.

Exercise 4
Create an output model for every 100 time steps.

Exercise 5
Run the model by creating loop for qh, qv, water storage update and models output (remember the threshold loop on latest previous exercise.)

Exercise 6
Plot a model output using a contour plot.




Simple Spatial Modeling – Part 2: Solutions

Below are the solutions to these exercises on “Simple Spatial Modeling: Part 2.”

###############
#             #
# Exercise 1  #
#             #
###############
rm(list=ls())
t <- 0
ntimesteps <- 500
timestep <- 1
ncell <- 5

H <- mat.or.vec(ntimesteps+1,ncell)
q <- mat.or.vec(1,ncell+1) #

# ****** Here we define the flows q1 and q6 that remain constant over the simulation ********
q[,1] <- 0.00
q[,6] <- 0.002

H[1,] <- c(1.0,0.8,0.7,0.6,0.5)
k <- c(0,0.01,0.05,0.02,0.06,0)
time <- seq(from = 0, by=timestep, length.out=ntimesteps+1)

# Model run 
for(n in 1:ntimesteps){

  for(i in 2:ncell){
    Hdiff <- H[n,i-1]-H[n,i]
    q[1,i]<- k[i]*Hdiff*timestep
  }

  for(i in 1:ncell){
    H[n+1,i]<-H[n,i]+q[1,i]-q[1,i+1]
  }

}

###############
#             #
# Exercise 2  #
#             #
###############
# Plotting the data.  
g_range <- range(0, H)
plot(x = time, y = H[,1],
     xlab = "Time (sec)",
     ylab = "ln water tank level (cm)", main = "Plot of simulated water level in tank",ylim = g_range)
for(n in 2:ncell){
  points(x = time, y = H[,n],
         xlab = "Time (sec)",
         ylab = "ln water tank level (cm)", main = "Plot of simulated water level in tank",col = (20+n*6))
}

###############
#             #
# Exercise 3  #
#             #
###############
# Inital information
rm(list=ls()) # Clear previous values  
t <- 0
ntimesteps <- 500
timestep <- 1
ncell <- 5

H <- mat.or.vec(ntimesteps+1,ncell)
q <- mat.or.vec(1,ncell+1)

# ****** Here we define the water level in tank 1 and 6 over the course of the simulation ********
H[,1] <- 1.0
H[,5] <- 0.5


H[1,] <- c(1.0,0.8,0.7,0.6,0.5)
k <- c(0,0.01,0.05,0.02,0.06,0)
time <- seq(from = 0, by=timestep, length.out=ntimesteps+1)

# Model run 
for(n in 1:ntimesteps){

  for(i in 2:ncell){
    Hdiff <- H[n,i-1]-H[n,i]
    q[1,i]<- k[i]*Hdiff*timestep
  }

  for(i in 2:(ncell-1)){
                            # ***** Here we only calculate the new water store for ********
                            # ***** tanks 2 to 4. 
    H[n+1,i]<-H[n,i]+q[1,i]-q[1,i+1]
  }

}

###############
#             #
# Exercise 4  #
#             #
###############
# Plotting the data.  
g_range <- range(0, H)
plot(x = time, y = H[,1],
     xlab = "Time (sec)",
     ylab = "ln water tank level (cm)", main = "Plot of simulated water level in tank",ylim = g_range)
for(n in 2:ncell){
  points(x = time, y = H[,n],
         xlab = "Time (sec)",
         ylab = "ln water tank level (cm)", main = "Plot of simulated water level in tank",col = (20+n*6))
}

###############
#             #
# Exercise 5  #
#             #
###############
rm(list=ls())
t <- 0
ntimesteps <- 500
timestep <- 1
ncell <- 5
q <- mat.or.vec(1,ncell+1)
q[,1] <- 0.00
q[,6] <- 0.002
H<- c(1.0,0.8,0.7,0.6,0.5)
k <- c(0,0.01,0.05,0.02,0.06,0)

###############
#             #
# Exercise 6  #
#             #
###############
toutput <- 10 #Output from the model once every 'touput' timesteps

###############
#             #
# Exercise 7  #
#             #
###############
output <- mat.or.vec(ntimesteps/toutput,ncell)
# create output array

###############
#             #
# Exercise 8  #
#             #
###############
outputcount <- 0
# Tells the model which row to data should be store. It is increased by one each time

###############
#             #
# Exercise 9  #
#             #
###############
outputtimer <- 0
# This counts the number of timesteps. When the number of timesteps equal toutput the 
# water levels are outputted. Outputtimer is then reset back to zero and the count starts again.
time <- seq(from = 0, by=timestep*toutput, length.out=ntimesteps/toutput)


###############
#             #
# Exercise 10 #
#             #
###############
for(n in 1:ntimesteps){

  for(i in 2:ncell){
    Hdiff <- H[i-1]-H[i]
    q[1,i]<- k[i]*Hdiff*timestep
  }

  for(i in 1:ncell){
    H[i]<-H[i]+q[1,i]-q[1,i+1]
  }

# ************ Output Conditional ***********************8
  outputtimer <- outputtimer +1   # Increase by one every run through the model  
  if (outputtimer == toutput){
# Then ask the question, does this increased outputtimer equal our threshold  output value. If so then:
    outputcount <- outputcount+1
# Increase our output count by 1, to output the data in the next row
    outputtimer <- 0
# Reset our outputtimer back to zero, ready to repeat the process all  over again.
    output[outputcount,]<-H
# Output the water levels in the appropriate row of the output file
  }

} # This whole processes is repeated for each time step

###############
#             #
# Exercise 11 #
#             #
###############
# Plotting the data.  
g_range <- range(0, output)

plot(x = time, y = output[,1],
     xlab = "Time (sec)",
     ylab = "ln water tank level (cm)", main = "Plot of simulated water level in tank",ylim = g_range)
for(n in 2:ncell){
  points(x = time, y = output[,n],
         xlab = "Time (sec)",
         ylab = "ln water tank level (cm)", main = "Plot of simulated water level in tank",col = (20+n*6))
}




Simple Spatial Modeling – Part 2: Exercises

In the first exercise of simple spatial modeling here, we learned to create a model that considers more spatial variability. However, it relies on an isolated system where we set the q1 and q6 as zero. In this exercise, we try to bring the model into a more realistic space by adding some boundary conditions, as well as considering its numerical instability.

Here, the boundary condition is referred to as water level and/or water flow as the two main variables that can be played. There are basically two options to do that; Dirchlet and von Neuman boundary conditions. The Dirchlet method is just simply defined as q1 and q6 to any number. It shows that the flows q1 and q6 are remaining constant over the simulation. Von Neuman allows the model to define the q1 and q6 based on any other factors that might influence. For example, the level of a river here is represented as “tank water level.”

Answers to these exercises are available here. If you obtained a different (correct) answer than those listed on the solutions page, please feel free to post your answer as a comment on that page.

Dirchlet Boundary Conditions
Exercise 1
Try to modify your latest model with a new step: defining the q1 and q6 as a constant value. The model script will look exactly the same as the previous one, just add a constant value declaration of q1 and q6 as the first and the sixth on the q matrix output.

Exercise 2
Plot the model simulation.

Von Neuman Boundary Conditions
Exercise 3
Instead of defining the q1 and q6, try to define the water level on tank 1 and 5. Pay attention while running the models; you only need to calculate water storage for bucket 2 to 5.

Exercise 4
Plot the data.

Numerical Instability
As we learned, rounding off and truncation might generate some errors in the final result of the model. Therefore, it is important to maintain a relatively small time-step. Furthermore, shortening the time-step will give more useful information. The exercises below will try to simulate how to run the model for 500 time-steps, but only outputting every 10th.

Exercise 5
Set initial information and output matrix q and H for calculated water storage. Set all the initial values, including H and k. Use the Dirchlet boundary conditions value on the model script above.

Exercise 6
This is the tricky part. Take a deep breath. The purpose of this step is to get the model output and save the data every time-step. Since we will only output for every 10th, we need to create a matrix output that defines the rule.

Exercise 7
Create an output array and size equals number outputs by the number of tanks.

Exercise 8
Another consideration is that we need to tell the model that only the 10th calculation will be outputted by creating a loop for output time.

Exercise 9
Tell the model which row the data should be stored; it is increased by one each time. Also, define the output timer that will reset back to zero when the number of time-steps equal the number when water levels outputted (10th).

Exercise 10
Run the model and add conditional formatting (if function)to the output section. Ask the script whether the increased output timer equals the threshold output value (10). If so, then increase our output count by 1 and output data in the next row. Then, reset our output timer back to zero so that the calculation will repeat again.

Exercise 11
Plot the data.




Simple Spatial Modeling – Part 1: Exercises

This exercise is an extension of the last two previous exercises about numerical modeling. They can be found here and here. Those two previous exercises are representing how the model works in a lumped system. At this time, we will try to bring a space into our model. Make sure that you look at the latest exercise in numerical modeling so that we can recall the latest built model.

Instead of playing with parameter and loop calculations, we will develop our single water tank into a network. Assume that we add another two similar water tanks that are connected through pipes. It could represent the layers of soil or different areas across a catchment. Below is the illustration of the model. The output of this exercise is to understand how space can be illustrated by a model.

The new data-set required can be downloaded here.
Answers to these exercises are available here. If you obtained a different (correct) answer than those listed on the solutions page, please feel free to post your answer as a comment on that page.

Before starting the real exercises, try to load the data-set and plot it to see the data characteristic.

Exercise 1
Set the initial time as 0, with timestep = 1 and final time step = 100. Define the parameters of each water tank including k (parameter) and s (initial water level) and create an empty output matrix, this time, with four columns.

Exercise 2
Similar to before, try to run the loop through the number of time-steps.

Exercise 3
Plot the model output for each water tank; pay attention to the range of the result.

You can try to play with longer time-steps and varieties in the parameter to see if the model is realistic enough to predict the future.

What if the water tank arrangement has two-way interactions? In many situations, water flow direction varies over time, such as water flow in a soil profile under different conditions. The figure below is the schematic diagram of the next model.

On the diagram above, each tank has a hole that connects to the adjacent bucket. If the water level in tank 1 is higher than tank 2, water will obviously flow from tank 1 into 2 until the water levels are equal and vice versa. So, water will flow in either direction. The rate of flow (q) depends on the difference between two tanks (H1-H2) and the size of the hole (k) or pipe that connect the two tanks, written mathematically as follows:
q = k x (H1-H2) x t

Assume that there is no hole on the outside of either bucket 1 or 5. So that k, q1, and q6 are zero.

Clear the previous values before starting the following exercises.
Exercise 4
Define initial conditions, including t, time-steps, final time-steps, and ncell as the number of water tanks available. Create an empty matrix of the water level (H) and the water flux output (q).

Exercise 5
Set the initial parameter for H and k.

Exercise 6
Try to use theĀ sequence function to declare time-steps.

Exercise 7
Run the loop based on the parameters and the initial condition above.

Exercise 8
Plot the water level for each water tank. Pay attention to the output range.
Fancy to use a loop in water level plotting, huh?

Does the model meet your expectations?
Try to play around with the parameters and see how the model responds with those alterations.




Simple Numerical Modeling in R – Part 2: Solutions

Below are the solutions to these exercises on “Simple Numerical Modeling – Part 2.”

###############
#             #
# Exercise 1  #
#             #
###############
#previous work (ignore when you used the same script as previous exercise)
datatable <- read.table(file.choose())
t<-0
k <- 0.05
S <- 15
timestep <- 1
ntimesteps <-100
output <- mat.or.vec(ntimesteps,2)

for(n in 1:ntimesteps){   # complete loop for n = 1 to 100
  dS <- k*S*timestep       # for each run through calculate the change in storage
  S <- S-dS                # The calculate the new water level
  t <- t+timestep          # Calculate what the new time is 

  output[n,1] = t         # Outpt the time (sec)
  output[n,2] = S         # Output the new water level (cm)

}

# same model presented
# different matrix output
t<-0
k <- 0.05
S <- 15
timestep <- 1
ntimesteps <-100
output2 <- mat.or.vec(ntimesteps,2)
###############
#             #
# Exercise 2  #
#             #
###############
#loop calculation
for(n in 1:ntimesteps){
  dS <- k*S*timestep
  dS <- round(dS,digits = 1) #the change is storage is rounded to 1 decimal place
  S <- S-dS
  t <- t+timestep

  output2[n,1] <- t
  output2[n,2] <- S

}   # end loop

###############
#             #
# Exercise 3  #
#             #
###############
plot(x = (output[,1]), y = output[,2],
     xlab = "Time (sec)",
     ylab = "ln water tank level (cm)", main = "Plot of simulated water level in tank")

#create new points of the original model plot
points(x = (output2[,1]), y = output2[,2],
     xlab = "Time (sec)",
     ylab = "ln water tank level (cm)", main = "Plot of simulated water level in tank", pch = 19,col="red")

#modified model obviously created high error on very low and very high water level

###############
#             #
# Exercise 4  #
#             #
###############
# Define new figures on timestep and ntimestep

t<-0
k <- 0.05
S <- 15
timestep <- 4
ntimesteps <-25

# Creation new matrix output 
output3 <- mat.or.vec(ntimesteps,2)
output3
##       [,1] [,2]
##  [1,]    0    0
##  [2,]    0    0
##  [3,]    0    0
##  [4,]    0    0
##  [5,]    0    0
##  [6,]    0    0
##  [7,]    0    0
##  [8,]    0    0
##  [9,]    0    0
## [10,]    0    0
## [11,]    0    0
## [12,]    0    0
## [13,]    0    0
## [14,]    0    0
## [15,]    0    0
## [16,]    0    0
## [17,]    0    0
## [18,]    0    0
## [19,]    0    0
## [20,]    0    0
## [21,]    0    0
## [22,]    0    0
## [23,]    0    0
## [24,]    0    0
## [25,]    0    0
###############
#             #
# Exercise 5  #
#             #
###############
#re-run loop
for(n in 1:ntimesteps){    # complete loop for n = 1 to 100
  dS <- k*S*timestep       # change in storage calculation
  S <- S-dS                # new water level calculation
  t <- t+timestep          # new time step calculation 

  output3[n,1] = t         # Outpt the time (sec)
  output3[n,2] = S         # Output the new water level (cm)

}   # ending loop

###############
#             #
# Exercise 6  #
#             #
###############
# replot the inital output
plot(x = (output[,1]), y = output[,2],
     xlab = "Time (sec)",
     ylab = "ln water tank level (cm)", main = "Plot of simulated water level in tank")

# plot the reduced time step model
points(x = (output3[,1]), y = output3[,2],
     xlab = "Time (sec)",
     ylab = "ln water tank level (cm)", main = "Plot of simulated water level in tank",pch = 19)

#the smaller timestep, the details of calculation will be
#greater timestep creates error on the higher water tank level 

###############
#             #
# Exercise 7  #
#             #
###############
#create simple regression and find the one with high adjusted R2
lin.reg <- lm(datatable$V2 ~ datatable$V1) #dependent variable first
summary (lin.reg)
## 
## Call:
## lm(formula = datatable$V2 ~ datatable$V1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.3298 -0.6403 -0.2099  0.4934  2.6282 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   7.828774   0.232879   33.62   <2e-16 ***
## datatable$V1 -0.137814   0.006985  -19.73   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8676 on 55 degrees of freedom
## Multiple R-squared:  0.8762,	Adjusted R-squared:  0.874 
## F-statistic: 389.3 on 1 and 55 DF,  p-value: < 2.2e-16
exp.reg<-lm(log(datatable$V2) ~ (datatable$V1))
summary(exp.reg)
## 
## Call:
## lm(formula = log(datatable$V2) ~ (datatable$V1))
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.45294 -0.09498  0.00494  0.08468  0.41281 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   2.249247   0.053146   42.32   <2e-16 ***
## datatable$V1 -0.038397   0.001594  -24.09   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.198 on 55 degrees of freedom
## Multiple R-squared:  0.9134,	Adjusted R-squared:  0.9118 
## F-statistic: 580.3 on 1 and 55 DF,  p-value: < 2.2e-16
#exponential regression with log transformation on dependent variable create high adjusted R2
#arrange the equation and plot 
curve (15*exp(-0.05*x), from = 1 , to = 100, add = TRUE,
       xlab = "Time (sec)",
       ylab = "ln water tank level (cm)", main = "Plot of simulated water level in tank",pch = 19,col="Red")

#regression is a very quick analysis to know a relationship between dependent and independent variables even though we don't know what the actual variables are
#regression method in creating models need to be treated carefully as it might behave differently in other location or on the evry extreme values of water level
#here regression analysis is just for comparing the mechanistic model that we have created to the mathematical based model
#please be careful that loop will do iteration from previous calculation so that we need to declare parameter before run the loop, otherwise it will calculate from 101-200 and so on



Simple Numerical Modeling in R – Part 2: Exercises

http://eskipaper.com/images/water-splash-wallpaper-3.jpg

In this exercise, we will continue to build our model from our previous exercise here, specifically to revise the errors that may be generated from the model, including rounding and truncating errors.
Answers to these exercises are available here. If you obtained a different (correct) answer than those listed on the solutions page, please feel free to post your answer as a comment on that page.

Exercise 1
Recall the previous initial values of all parameters (t,k,S,ntimesteps, time step). It is better to use the same script as the previous exercise so that we can directly compare the original models to the modified one (based on error fixing approach on this exercise). Create a new empty matrix to store the following result of the calculation.

Exercise 2
Create a loop of calculation that includes the rounding up process.

Exercise 3
Plot the revised model on the same graph as the plot of the original model. Make notes of the performance of the model and where the error on the model occurred.

Exercise 4
Now, what happens if we change the time step? Recall all parameters on the original model, but change the final time step. Create a new output matrix for the output.

Numerical modelling is a foundation of machine learning. Learn more about machine learning in the online course
Regression Machine Learning with R
. In this course, you will learn how to:

  • build a machine learning model from scratch,
  • Learn how to tweak and improve your model,
  • And much more

Exercise 5
Re-run the loop with the new parameter.

Exercise 6
Re-plot the original model and plot the time step reduced model. Models with longer time steps simulate lower water levels; why? How do we investigate which one is closer to the correct values?

Exercise 7
Create a regression equation from the data-set. Use it to compare results from analytical (regression equation) and the latest revised model visually. What can be inferred from it?




Simple Numerical Modeling in R – Part 1: Solutions

Below are the solutions to these exercises on “Simple Numerical Modeling in R – Part 1.”

###############
#             #
# Exercise 1  #
#             #
###############
# Load Data
datatable <- read.table(file.choose())
# Plot Data
View(datatable)
plot(datatable$V1,datatable$V2)

###############
#             #
# Exercise 2  #
#             #
###############
#   dS/dt = kS
# where S is water level, t is time. d represents a change in S and t.

###############
#             #
# Exercise 3  #
#             #
###############
# rearrange the equation to give
# ds = k x S x dt

  dS <- 0.05*15*1  # Calcuate the water level drop in the tank over 1 second
  dS
## [1] 0.75
# What is the new water level?
  S <- 15-dS
  S
## [1] 14.25
# From 1 to 2 seconds
  dS <- 0.05*S*1 # new drop in water level.
  S <- S-dS      # new water level. 

  S              # The new water level after two seconds.
## [1] 13.5375
# and the next second
  dS = 0.05*S*1
  S = S-dS
  S
## [1] 12.86062
# and the next second
  dS = 0.05*S*1
  S = S-dS
  S
## [1] 12.21759
# and the next second
  dS = 0.05*S*1
  S = S-dS
  S
## [1] 11.60671
###############
#             #
# Exercise 4  #
#             #
###############
# Define few things 

t<-0             # Initial time
k <- 0.05        # Model parameter, the same as above
S <- 15          # Inital water level
timestep <- 1    # Timestep in seconds; calculate the new water level every second
ntimesteps <-100 # Number of time steps for which we are going to run the model for

# Creation a blank space room in a vector of zeroes where the model data will be located 
output <- mat.or.vec(ntimesteps,2)
output
##        [,1] [,2]
##   [1,]    0    0
##   [2,]    0    0
##   [3,]    0    0
##   [4,]    0    0
##   [5,]    0    0
##   [6,]    0    0
##   [7,]    0    0
##   [8,]    0    0
##   [9,]    0    0
##  [10,]    0    0
##  [11,]    0    0
##  [12,]    0    0
##  [13,]    0    0
##  [14,]    0    0
##  [15,]    0    0
##  [16,]    0    0
##  [17,]    0    0
##  [18,]    0    0
##  [19,]    0    0
##  [20,]    0    0
##  [21,]    0    0
##  [22,]    0    0
##  [23,]    0    0
##  [24,]    0    0
##  [25,]    0    0
##  [26,]    0    0
##  [27,]    0    0
##  [28,]    0    0
##  [29,]    0    0
##  [30,]    0    0
##  [31,]    0    0
##  [32,]    0    0
##  [33,]    0    0
##  [34,]    0    0
##  [35,]    0    0
##  [36,]    0    0
##  [37,]    0    0
##  [38,]    0    0
##  [39,]    0    0
##  [40,]    0    0
##  [41,]    0    0
##  [42,]    0    0
##  [43,]    0    0
##  [44,]    0    0
##  [45,]    0    0
##  [46,]    0    0
##  [47,]    0    0
##  [48,]    0    0
##  [49,]    0    0
##  [50,]    0    0
##  [51,]    0    0
##  [52,]    0    0
##  [53,]    0    0
##  [54,]    0    0
##  [55,]    0    0
##  [56,]    0    0
##  [57,]    0    0
##  [58,]    0    0
##  [59,]    0    0
##  [60,]    0    0
##  [61,]    0    0
##  [62,]    0    0
##  [63,]    0    0
##  [64,]    0    0
##  [65,]    0    0
##  [66,]    0    0
##  [67,]    0    0
##  [68,]    0    0
##  [69,]    0    0
##  [70,]    0    0
##  [71,]    0    0
##  [72,]    0    0
##  [73,]    0    0
##  [74,]    0    0
##  [75,]    0    0
##  [76,]    0    0
##  [77,]    0    0
##  [78,]    0    0
##  [79,]    0    0
##  [80,]    0    0
##  [81,]    0    0
##  [82,]    0    0
##  [83,]    0    0
##  [84,]    0    0
##  [85,]    0    0
##  [86,]    0    0
##  [87,]    0    0
##  [88,]    0    0
##  [89,]    0    0
##  [90,]    0    0
##  [91,]    0    0
##  [92,]    0    0
##  [93,]    0    0
##  [94,]    0    0
##  [95,]    0    0
##  [96,]    0    0
##  [97,]    0    0
##  [98,]    0    0
##  [99,]    0    0
## [100,]    0    0
# The loop is presented below 
for(n in 1:ntimesteps){    # complete loop for n = 1 to 100
  dS <- k*S*timestep       # change in storage calculation
  S <- S-dS                # new water level calculation
  t <- t+timestep          # new time step calculation 

  output[n,1] = t         # Outpt the time (sec)
  output[n,2] = S         # Output the new water level (cm)

}   # ending loop

#check the iteration result 
output
##        [,1]        [,2]
##   [1,]    1 14.25000000
##   [2,]    2 13.53750000
##   [3,]    3 12.86062500
##   [4,]    4 12.21759375
##   [5,]    5 11.60671406
##   [6,]    6 11.02637836
##   [7,]    7 10.47505944
##   [8,]    8  9.95130647
##   [9,]    9  9.45374115
##  [10,]   10  8.98105409
##  [11,]   11  8.53200138
##  [12,]   12  8.10540131
##  [13,]   13  7.70013125
##  [14,]   14  7.31512469
##  [15,]   15  6.94936845
##  [16,]   16  6.60190003
##  [17,]   17  6.27180503
##  [18,]   18  5.95821478
##  [19,]   19  5.66030404
##  [20,]   20  5.37728884
##  [21,]   21  5.10842439
##  [22,]   22  4.85300317
##  [23,]   23  4.61035302
##  [24,]   24  4.37983537
##  [25,]   25  4.16084360
##  [26,]   26  3.95280142
##  [27,]   27  3.75516135
##  [28,]   28  3.56740328
##  [29,]   29  3.38903311
##  [30,]   30  3.21958146
##  [31,]   31  3.05860239
##  [32,]   32  2.90567227
##  [33,]   33  2.76038865
##  [34,]   34  2.62236922
##  [35,]   35  2.49125076
##  [36,]   36  2.36668822
##  [37,]   37  2.24835381
##  [38,]   38  2.13593612
##  [39,]   39  2.02913931
##  [40,]   40  1.92768235
##  [41,]   41  1.83129823
##  [42,]   42  1.73973332
##  [43,]   43  1.65274665
##  [44,]   44  1.57010932
##  [45,]   45  1.49160385
##  [46,]   46  1.41702366
##  [47,]   47  1.34617248
##  [48,]   48  1.27886386
##  [49,]   49  1.21492066
##  [50,]   50  1.15417463
##  [51,]   51  1.09646590
##  [52,]   52  1.04164260
##  [53,]   53  0.98956047
##  [54,]   54  0.94008245
##  [55,]   55  0.89307833
##  [56,]   56  0.84842441
##  [57,]   57  0.80600319
##  [58,]   58  0.76570303
##  [59,]   59  0.72741788
##  [60,]   60  0.69104698
##  [61,]   61  0.65649464
##  [62,]   62  0.62366990
##  [63,]   63  0.59248641
##  [64,]   64  0.56286209
##  [65,]   65  0.53471898
##  [66,]   66  0.50798303
##  [67,]   67  0.48258388
##  [68,]   68  0.45845469
##  [69,]   69  0.43553195
##  [70,]   70  0.41375536
##  [71,]   71  0.39306759
##  [72,]   72  0.37341421
##  [73,]   73  0.35474350
##  [74,]   74  0.33700632
##  [75,]   75  0.32015601
##  [76,]   76  0.30414821
##  [77,]   77  0.28894080
##  [78,]   78  0.27449376
##  [79,]   79  0.26076907
##  [80,]   80  0.24773062
##  [81,]   81  0.23534408
##  [82,]   82  0.22357688
##  [83,]   83  0.21239804
##  [84,]   84  0.20177813
##  [85,]   85  0.19168923
##  [86,]   86  0.18210477
##  [87,]   87  0.17299953
##  [88,]   88  0.16434955
##  [89,]   89  0.15613207
##  [90,]   90  0.14832547
##  [91,]   91  0.14090920
##  [92,]   92  0.13386374
##  [93,]   93  0.12717055
##  [94,]   94  0.12081202
##  [95,]   95  0.11477142
##  [96,]   96  0.10903285
##  [97,]   97  0.10358121
##  [98,]   98  0.09840215
##  [99,]   99  0.09348204
## [100,]  100  0.08880794
###############
#             #
# Exercise 5  #
#             #
###############
plot(x = (output[,1]), y = output[,2],
     xlab = "Time (sec)",
     ylab = "Water tank level (cm)", main = "Plot of simulated water level in the tank")




Simple Numerical Modeling in R – Part 1: Exercises

http://eskipaper.com/images/water-splash-wallpaper-3.jpg

The modeling process is just one of the methods to find a solution for a certain problem. It can be a combination between empirical simulation approaches. The empirical method is data-based analysis that relies upon mathematical function and often has no meaning in real life. An approach using simulation is more based on scientific understanding of a process. Designing a model is consist of three stages; design, development, and evaluation (figure 1 below).

Natural environment is a continuous system that consists of discrete units/events. In this exercise, we will try to build continuous relationships that consist of a discrete event. The continuous relationship is represented with a simple calculation that repeats over and over. The model needs to count the space and time variables to make it continuous. In this case, we will use a rainfall catchment as an example that represents water flow through the water tank. Download the data-set used for this exercise here.

Answers to these exercises are available here. If you obtained a different (correct) answer than those listed on the solutions page, please feel free to post your answer as a comment on that page.

Exercise 1
Load and plot the data table. Assume variable 1 as time and variable 2 as the water level in the tank.
Imagine the amount of water that flows out from the system is dependent on the reduction of water levels inside the water tank. Furthermore, the reduction of water levels is caused by air pressure that is acting on the surface of the water. This is the mechanistic model that needs to be found and fully understood first.

Exercise 2
Try to write the mechanistic model mathematically that says that the water level in the tank is equal to the change of water in time.

Exercise 3
Let’s say we have a bucket with 15 cm of water in it and we know and assume that k= 0.05. Between 0 and 1 seconds, how much water would we expect to lose? What is the new water level? Do the same calculation from 1 to 2 seconds.
The “k” parameter represents how fast water flows from the tank.

Numerical modelling is a foundation of machine learning. Learn more about machine learning in the online course
Regression Machine Learning with R
. In this course, you will learn how to:

  • build a machine learning model from scratch,
  • Learn how to tweak and improve your model,
  • And much more

Exercise 4
Try to create a loop that consists of the calculations in exercise 3. Consider thinking about time, initial water level, model parameter, time step, and final time step.

Exercise 5
Plot the water level based off the tank over the time.