MODGAMMAオプションは、モデルの連立ブロックの方程式が反復間でどれだけ変化するかを判定する際に使用する値を指定するオプションです。MODGAMMAは、判定において、反復間の変化の絶対量と比例変化との比較の程度を制御します。MODGAMMAは、結果として非常に小さい値を算出する方程式を判定する際に特に重要です。
データ型
INTEGER
構文
MODGAMMA = {n|1}
引数
収束および発散の判定に使用するINTEGER
値。Oracle OLAPでは、連立ブロック内の各方程式を計算する際、現行の反復と前回の反復における方程式の結果に基づく比較値を作成します。比較値が許容誤差として判定されると、方程式は収束したとみなされます。比較値がオーバーフローとして判定されると、方程式は発散したとみなされます。
比較値は、次のように判定されます。
(thisResult - prevResult) DIVIDED BY (prevResult PLUS MODGAMMA)
ここで、thisResultは現行の反復の結果で、prevResultは前回の反復の結果です。
Oracle OLAPによって、カッコで囲まれた式の絶対値が計算されます。MODGAMMAのデフォルト値は1
です。
注意
収束の判定
収束判定では、MODTOLERANCEオプションによって、連続する反復間で一致する方程式の結果の近似の程度が決まります。MODTOLERANCEのデフォルト値である3
では、比較値が0.001
より小さい場合に、方程式が収束したとみなされます。
発散の判定
発散判定では、MODOVERFLOWオプションによって、連続する反復間で一致する方程式の結果の離散の程度が決まります。MODOVERFLOWのデフォルト値である3
では、比較値が1000
より大きい場合に、方程式が発散したとみなされます。
比較値
収束および発散の判定で評価される比較値は、基本的に比例値です。反復間の変化を、前回の結果の比率として表します。収束判定では、反復間の変化は前回の結果に比例して小さくなります。発散判定では、反復間の変化は前回の結果に比例して大きくなります。変化の絶対量ではなく比例値を判定することによって、方程式の結果の大きさに関係なく、同一の判定基準をすべての方程式に適用できます。
ただし、判定される比較値は、厳密には比率ではありません。方程式の結果がゼロに近い場合、厳密な比率での比較値の分母はかぎりなくゼロに近くなり、そのため、全体として比較値自体が大きくなります。したがって、収束判定を満たすのは難しくなりますが、発散判定は満たしやすくなります。この問題を解決するために、Oracle OLAPでは、MODGAMMAの値を比較値の分母に加算します。MODGAMMAにデフォルト値の1が使用されている場合、MODGAMMAの影響は次のようになります。
方程式の結果がゼロに近い場合は、分母は1に近くなり、実際には、反復間の絶対変化を判定することになります。
方程式の結果が非常に大きい場合は、MODGAMMAを分母に加えることによる影響は無視できる程度であり、厳密な比率の判定に近くなります。
判定の感度の制御
方程式の値がゼロに近い場合は、MODGAMMAの値を変更することで、収束と発散の判定の感度を制御できます。方程式の結果の値が非常に小さい場合、MODGAMMAの値を変更して、実質的にモデル値の反復間の変化を小さくします。たとえば、MODGAMMAを1から2に変更すると、比較値は実質的に半分まで落ちます。結果として、発散が起こる可能性が減少します。
モデル方程式の収束速度を上げる方法
ほとんどの場合、MODGAMMAのデフォルト値は適切な値です。MODGAMMAの値を増やすと、モデル方程式はより速く収束しますが、結果の精度は低下します。方程式の値が小さければ小さいほど、MODGAMMAを増やす場合の影響はより顕著になります。小さなモデル値では、収束はさらに迅速に達成されるようになりますが、そのかわり精度の低下が大きくなります。
また、MODTOLERANCEの値を減らして、収束の判定を緩めることで、モデルの連立ブロックの収束を速めることもできます。ただし、これを行うと、小さい値の方程式の結果のみでなく、すべての結果の精度を犠牲にすることになります。
したがって、モデルに大きな値の方程式と非常に小さい値の方程式が混在している場合は、MODTOLERANCEを減らすよりも、MODGAMMAを増やすほうが有効な場合があります。MODGAMMAを増やすことで、大きい値の方程式の精度を維持したまま小さい値の方程式をより迅速に収束させることができます。
例
例6-53 MODGAMMAのデフォルト値の使用
次の文では、income.bud
というモデルのトレースを指定し、連立ブロックの解法としてGauss-Seidel法の使用を指定して、ディメンションを制限し、モデルを実行します。
MODTRACE = YES MODSIMULTYPE = 'GAUSS' LIMIT division TO 'Camping' income.bud budget
これらの文によって生成される出力は次のとおりです。
(MOD= INCOME.BUD) BLOCK 1: SIMULTANEOUS ... (MOD= INCOME.BUD) BUDGET (LINE NET.INCOME MONTH 'JAN97' ITER 16) = 0.026243533 ... (MOD= INCOME.BUD) BUDGET (LINE NET.INCOME MONTH 'JAN97' ITER 17) = 0.024054312 ... (MOD= INCOME.BUD) BUDGET (LINE NET.INCOME MONTH 'JAN97' ITER 18) = 0.025788293 ... (MOD= INCOME.BUD) BUDGET (LINE NET.INCOME MONTH 'JAN97' ITER 19) = 0.024390642 ... (MOD= INCOME.BUD) BUDGET (LINE NET.INCOME MONTH 'JAN97' ITER 20) = 0.025501664 ... (MOD= INCOME.BUD) BUDGET (LINE NET.INCOME MONTH 'JAN97' ITER 21) = 0.024608562
トレースで、連立方程式のブロックの最後の6回の反復でNET.INCOME明細項目に対し計算された結果を確認できます。
MODTOLERANCEの値は、デフォルト値の3
です。これは、方程式を収束したと判定するには、その比較値が.001
より小さい必要があるということを意味します。
MODGAMMAは、デフォルト値の1
に設定されています。NET.INCOME明細項目の方程式は、21回目の反復で収束したと判定されています。21回目の反復におけるNet.Income
の比較値は、次のように計算されました。
(0.024608562967 - 0.025501664970 = 0.00087) / (0.025501664970 + 1)