MODDAMPオプションは、モデルの連立方程式の解法としてGauss-Seidel法を使用する際、反復間の振動を減衰させる加重係数を指定するオプションです。MODDAMPによって、方程式間の振動が安定しているために収束しないモデルを解決することが可能となります。振動が安定すると、制動しないかぎり振動は減衰しません。
Oracle OLAPでGauss-Seidel法を使用すると、連立方程式のブロックでの各反復ごとに、各モデル方程式の収束または発散が判定されます。判定は、現行の反復の結果と前回の反復の結果を比較することによって行われます。MODDAMPにゼロより大きい加重係数を指定すると、各反復後に判定および格納される値は、現行の結果と前回の結果の加重平均になります。したがって、反復間で振動する方程式にMODDAMPを使用すると、振動を抑制でき、方程式の発散を回避して収束を速めることができます。
パラメータ
加重係数を指定するゼロ以上で1より小さい小数値。MODDAMPが0.00に近いほど、現行の反復の値により大きな加重が設定されます。デフォルト値は0.00で、現行の反復に最大の加重が設定されます。
Oracle OLAPでは、MODDAMPがゼロより大きい場合、現行の反復の加重平均は次のように計算されます。
calcvalue * (1 - MODDAMP) + weightavg
ここで、
calcvalueは、現行の反復でモデル方程式から計算される値です。
weightavgは、前回の反復で計算された加重平均です。
「格納される加重平均」を参照してください。
使用上の注意
解法の指定
MODDAMPオプションは、Gauss-Seidel法で連立方程式を解決する場合にのみ使用します。使用する解法は、MODSIMULTYPEオプションで決定します。MODSIMULTYPEで設定可能な値は、Gauss-Seidel法を示すGAUSS
と、Aitkensデルタ2乗法を示すAITKENS
です。
収束速度に対するMODDAMPの影響
MODDAMPは、反復間で振動するかどうかにかかわらず、各連立ブロックにあるすべてのモデル方程式の結果を計算するときに使用します。振動しない方程式では、MODDAMPの値がゼロより大きいと、収束が遅くなります。したがって、モデルに振動する方程式と振動しない方程式が混在している場合は、MODDAMPを0.20
などゼロ以外の小さな値に設定することで、全体の収束速度を上げることができます。ゼロ以外の小さな値を設定すると、振動しない方程式の収束速度は多少下がりますが、振動する方程式の収束速度は上がります。
格納される加重平均
モデル方程式が現行の反復で収束または発散しない場合は、現行の反復で計算された加重平均が格納されます。Oracle OLAPでは、この格納された平均値がweightavg(前回の反復で計算された加重平均)として次の反復での加重平均の計算式で使用されます。
ブロックの最初の反復では、ターゲット変数(またはディメンション値)の開始値がweightavg(前回の反復で計算された加重平均)として使用されます。
反復結果の比較
各反復における収束および発散を判定する場合、Oracle OLAPでは、現行の反復の結果と前回の反復の結果を比較します。MODDAMPがゼロより大きい場合、Oracle OLAPは、次のように計算した比較値を判定します。
(weightavg - weightavg) / (weightavg PLUS MODGAMMA)
ここで、weightavgは、前回の反復で計算された加重平均です。
収束判定の説明は、MODTOLERANCEオプションを参照してください。発散判定の説明は、MODOVERFLOWオプションを参照してください。
連立ブロックの解決を制御するオプション
MODDAMPの値の変更は、連立ブロックの収束の加速や達成のために試行する手段の1つです。MODELには、連立ブロックの解決を制御するために使用できる他のオプションがリストされており、モデルの実行およびデバッグに関する情報も掲載されています。
例
例5-50 MODDAMPのデフォルト値の使用
次の文では、income.bud
というモデルをトレースし、連立ブロックの解法としてGauss-Seidel法を指定して、ディメンションを制限し、income.bud
モデルを実行します。
MODTRACE = YES MODSIMULTYPE = 'GAUSS' LIMIT division TO 'Camping' income.bud budget
これらの文によって生成される出力は次のとおりです。
(MOD= INCOME.BUD) BLOCK 1: SIMULTANEOUS (MOD= INCOME.BUD) ITERATION 1: EVALUATION (MOD= INCOME.BUD) revenue = marketing * 300 - cogs ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 35) = 368.650399101 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 36) = 369.209604252 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 37) = 368.718556135 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 38) = 369.149674626 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 39) = 368.771110244 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 40) = 369.103479583 (MOD= INCOME.BUD) END BLOCK 1
MODDAMPオプションは、デフォルト値の0.00に設定されています。Revenue明細項目の方程式は、連立方程式のブロックでの40回目の反復で収束しました。トレース行で、最後の6回の反復でRevenue明細項目に対して計算された結果を確認できます。
例5-51 モデルの収束速度を上げるためのMODDAMPの設定
次の文で、MODDAMPの値を変更し、income.bud
を実行します。
MODDAMP = 0.2 income.bud budget
これらの文によって生成される出力は次のとおりです。
(MOD= INCOME.BUD) BLOCK 1: SIMULTANEOUS (MOD= INCOME.BUD) ITERATION 1: EVALUATION (MOD= INCOME.BUD) revenue = marketing * 300 - cogs (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 1) = 276.200000000 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 2) = 416.187139753 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 3) = 368.021098186 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 4) = 367.209906847 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 5) = 369.271224267 ... (MOD= INCOME.BUD) BUDGET (LINE REVENUE MONTH 'JAN97' ITER 6) = 368.965397407 (MOD= INCOME.BUD) END BLOCK 1
「MODDAMPのデフォルト値の使用」では、Revenue
明細項目の方程式は40回目の反復で収束しました。この例では、MODDAMPを0.2
に設定しているため、同じ方程式が6回目の反復で収束しています。