本推文是对 "Introduction to GEMPACK for GAMS Users" by Michael Kohlhaas and Ken Pearson
以下表格对比了GAMPACK和GAMS的基本建模程序语言结构: 图片来源:"Introduction to GEMPACK for GAMS Users" by Michael Kohlhaas and Ken Pearson
以下各小节对上面的各行语言结构做出详细解释:
1. 评论符号和字母大小写
在GAMS和GEMPACK 的TAB文件中都允许注释。在GAMS文件中,注释通常位于以“*”开头的单独一行,表示注释。在GEMPACK 的TAB文件中,注释以感叹号“!”开头,以另一个感叹号“!”结尾,对变量的命名可以放在变量后面的两个“# ” 符号之间。
GAMS和GEMPACK均不区分大小写。建模人员通常使用大写或小写来使文件更可读。
2. Default Statements (默认语句设置) 在上一期文章第三节中,我们提到GEMPACK将非线性与线性化变量和方程区分开来,必须相应地定义各个变量。为了方便起见,GEMPACK允许省略定义语句。在这些情况下,需要预先定义默认设置。例如: VARIABLE (DEFAULT = LEVELS) ; 指示,除非另有说明,否则所有变量都定义为非线性化的变量。
3. FILE 和READ (读取数据) 在GAMS中,数据值可以通过命令TABLEs、SCALARs或PARAMETERs 直接赋值。在GEMPACK中,数据通常存储在数据文件中,并通过READ语句从该文件中读取。FILE语句定义文件的逻辑名称,即数据文件在TABLO文件中的地址。运行模拟时,计算机上数据文件的实际名称将在命令文件中给出。这允许使用不同的起始数据文件(例如,表示不同年份或不同聚合的数据)来轻松解决同一模型。
4. SETs(集合)
在GAMS中,每当这个集合的成员被引用时,集合的名称将被用作索引。如果要用另一个名称引用集合,则必须通过ALIAS(别名)语句引入该名称。在GEMPACK中,索引的选择与集合的名称无关。当一个系数、变量或方程要被索引时,需要用此格式: (ALL, index, SET) 即时定义索引的名称及其所覆盖的集合。
5. SCALARs,PARAMETERs,COEFFICIENTs
在GAMS中,用SCALARs 和PARAMETERs来定义参数。定义格式如下: Parameter ALFHAFAC(f,j);
在GEMPACK中,用COEFFICIENTs定义参数。定义格式如下: COEFFICIENT (all, f, FAC) (all, j, SECT) ALFHAFAC(f,j)
在GAMS中,一个参数(如税率)的值可以在两个模拟之间改变,以模拟政策对经济的冲击。在GEMPACK中,外生变量命令通常用于此目的。
比如: GAMS: Parameter TaxRate; TaxRate = 10; Solve …
TaxRate = 20; Solve …
GEMPACK: 在TAB文件里: Variable (Linear) TaxRate;
在Command文件里 Exogenous TaxRate; Shock TaxRate = 100; !表示100%增长,从10到20!
6. TABLEs(表格)
TABLEs是将数据输入GAMS程序的一种命令。在GMAPEACK中,不存在此命令。数据是从文件和程序(如MODHAR和ViewHAR)中读取的,这有助于创建和修改数据文件。GEMPACK中的数据文件可以是文本文件(可以使用文本编辑器创建,也可以从电子表格或其他程序导入)或二进制文件(头数组文件),可以使用MODHAR或ViewHAR创建。
7. VARIABLEs(变量) 在 GAMS 中,VARIABLE 定义内生变量。在GEMPACK中,变量在初始被定义的时候可以是内生变量或者外生变量。在命令文件(Command)中再被定义为内生或外生。这种灵活性使得GEMPACK改变模型的闭合时而不必改变TAB文件(因此不必重新运行程序TABLO)。
此外,在GEMPACK中,变量必须预先指定为线性(LINEAR)或者非线性(LEVEL),线性变量还需区分变化(CHANGE)或者百分比变化(PERCENT_CHANGE)。尽管变量再TAB文件中可以指定为非线性(LEVEL),所有模拟结果都是线性变量:可以是百分比变化(最常见)或绝对值变化。报告哪个结果取决于如何在TAB文件中定义变量。比如下面对一个价格变量的定义,如果如下(注意所有变化都是相对于模拟前数值的变化): Variable (Percent_Change) (all, i , SECT) pcom(i) 则结果为百分比变化。如果如下: Variable (Change) (all, i , SECT) pcom(i) 则结果为绝对值变化。 8.FORMULAs and EQUATIONs(公式和方程)
在CGE模型中,公式通常用于计算参数、变量初始值,或者模拟后更新变量。在GAMS中,公式可以直接用等式表达: *Intermediate input of commodity i in industry j XC_Z (i, j) = DVCOMIN (i, j) / PC_Z (i) ; 在GEMPACK中,需要用命令FORMULA先定义公式: Formula # Intermediate input of commodity i in industry j # (all, i, SECT) (all, j, SECT) XC_Z (i, j) = DVCOMIN (i, j) / PC_Z (i) ;
在GEMPACK中,还可以在命令FORMULA后追加定义。FORMULA(INITIAL)表示在多次模拟中仅在第一次模拟中计算。FORMULA(ALWAYS)表示在多次模拟中每一次再计算。
在CGE模型中,等式通常组成方程组,用于计算内生变量。
在GAMS例子中: EQUATIONS Com_clear(i); *Commodity market clearing Com_clear(i).. XCOM(i) =E= XH(i) + SUM(j, XC(i,j)); 先用命令EQUATIONS定义等式名字,再用“Com_clear(i)..”引出等式内容。等式两端用“=E=”连接。
在GEMPACK例子中,需要用命令EQUATION先定义等式即可: Equation Com_clear # Commodity market clearing # (all, i, SECT) XCOM(i) = XH(i) + SUM(j, SECT, XC(i,j));
9. UPDATEs(更新)
这个GEMPACK的命令在GAMS文件中没有对应项。UPDATEs使GEMPACK能够从线性化方程中精确计算出原非线性方程的解。这个命令的意思是:当相关的价格和数量发生变化时,从数据库中读取的内容(通常是美元值)是如何变化的。
|