|
|
|
|
||
|
DEFINITION MODULE SimDeltaCalc; (******************************************************************* Module SimDeltaCalc (MW_V3.0) Copyright (c) 1991-2006 by Olivier Roth and ETH Zurich. Purpose Compute and handle deviations (Δ) of simulations compared to e.g. observed data series. Remarks This module is typically used to compute a performance index for identification or validation. This module works together with module "SimGraphUtils", i.e. the procedures DeclDispData or DeclDispDataM must be used to install the reference data to which the delta's (d) should be computed. This module is part of the optional client interface of 'ModelWorks', an interactive Modula-2 modelling and simulation environment. Programming o Design Olivier Roth 15/10/1991 o Implementation Olivier Roth 17/10/1991 ETH Zurich Systems Ecology CHN E 35.1 Universitaetstrasse 16 8092 Zurich SWITZERLAND URLs: <mailto:RAMSES@env.ethz.ch> <http://www.sysecol.ethz.ch> <http://www.sysecol.ethz.ch/SimSoftware/RAMSES> Last revision of definition: 15/10/1991 OR *******************************************************************) (* The problem: Y | v | xxxxxx | x v xxxxxxx | v x xx |xxxxxx x v xx | xx x xx | xx x | xx |-----|-----|-----|-----|-----|-----| ->t 0 1 2 3 4 5 6 A B C Validation statistics example (see fig. above): Y is e.g. a state variable, x = simulated, v = observed or measured; t stands for an independent variable e.g. time. A series of n (v,t) points has to be declared by DeclDispData from module SimGraphUtils. As a goodness of fit criterion we look for the vertical distances (d) of simulated (linearly interpolated) results (x) and the observed data (v). There may ocurr 3 cases (see fig. above): A) one observed data point falls into the last simulated time interval; B) no observed data point was encountered during last time interval; C) many observed data points were encountered during the last time interval. The procedures "AccuDelta" and "GetDelta" keep track on the last independent variable and look ahead to the next element in the data array if a new Δ has to be computed. This requires correct sorting of the data array before declaration! *) TYPE DeltaVar; DeltaProc = PROCEDURE ( (*ySim~*)REAL, (*yData*)REAL ): REAL; (* ySim~ denotes simulated y interpolated at position xData, yData denotes the y value from the installed data series at position xData *) VAR defaultDelta: DeltaProc; PROCEDURE InstallDeltaProc( VAR mvDepVar: REAL; compDelta: DeltaProc ); PROCEDURE InitDeltaStat( VAR mvDepVar: REAL; xSim, ySim: REAL; VAR dv: DeltaVar ); (* initializes the internal variables which hold the wanted statistics. - call InitDeltaStat from within your "Initial" procedure, note: set xSim to its actual value at t0 before! mvDepVar should be declared previously with DeclDispData; returns dv for later reference when calling AccuDelta *) PROCEDURE AccuDelta( dv: DeltaVar; xSim, ySim: REAL ); (* This procedures accumulates simple statistics intermediates such as: Σ Δ; Σ Δ^2; Σ |Δ|; n; where Δ is the difference between the installed data series (DeclDispDat) and the interpolated simulated variable (Δ is computed by means of the installed DeltaProc) and n holds the count of accumulated Δs. - AccuDelta should be called once for each time step, i.e. normally in procedure "output" of your model; assumes that dv is correct! *) PROCEDURE GetDeltaStat( VAR mvDepVar: REAL; VAR sumY, sumY2, sumAbsY: REAL; VAR count: INTEGER ); (* allows you to get the stored statistics which were accumulated since the last InitDeltaStat (normally a simulation run, see AccuDelta for more details). *) PROCEDURE SetDeltaStat( VAR mvDepVar: REAL; sumY, sumY2, sumAbsY: REAL; count: INTEGER ); (* allows to set these statistics. This procedure can be usefull if you have to resume an interrupted run or ev. for a complete reset *) PROCEDURE WriteDeltaStatMsg( VAR mvDepVar: REAL ); (* writes the stored statistics for each variable to the table window and to the stashfile in form of a message. *) END SimDeltaCalc.
|
||
|
|
|