如何在GAMS中用单个方程表达多部门差异化生产函数?
在GAMS中用单个方程实现多部门差异化生产函数
完全不用逐个部门写方程,利用GAMS的集合和参数标记就能搞定,哪怕部门加到10个也一样轻松。具体做法如下:
核心思路
给需要使用水资源的部门做个标记,在通用生产函数里加入水资源项,但通过参数控制非农业部门的水资源项指数为0——任何数的0次方都是1,相当于这一项在非农业部门的生产函数里不存在。
具体代码示例
1. 定义集合
先把所有部门放进一个集合里,后续新增部门直接加元素就行:
Set SECTORS / AGR, IND, SRV /; // 可以直接扩展成更多部门,比如加 MAN, CON 等
2. 定义标记参数
创建一个参数useWater,标记哪些部门需要用水:
Parameter useWater(SECTORS) / AGR 1, IND 0, SRV 0 /; // 新增部门时,需要用水的赋值1,不用的赋值0
3. 定义其他参数和变量
把生产函数里的弹性系数、要素变量都按部门维度定义:
// 生产弹性参数 Parameter alpha(SECTORS), beta(SECTORS), gamma(SECTORS); // 给参数赋值(示例) alpha(SECTORS) = 0.3; beta(SECTORS) = 0.6; gamma(AGR) = 0.1; // 只有农业需要给gamma赋值,其他部门可以留空或设0 // 要素变量和产出变量 Variable K(SECTORS), L(SECTORS), W(SECTORS), Q(SECTORS);
4. 编写通用生产方程
只需要写一个方程,通过useWater控制水资源项是否生效:
Equation prodFunc(SECTORS); prodFunc(SECTORS).. Q(SECTORS) =E= (K(SECTORS)**alpha(SECTORS)) * (L(SECTORS)**beta(SECTORS)) * (W(SECTORS)**(gamma(SECTORS)*useWater(SECTORS)));
- 对农业部门(AGR):
useWater=1,所以水资源项是W(AGR)**gamma(AGR),符合你的生产函数 - 对工业、服务业:
useWater=0,水资源项变成W(...)^0=1,相当于这一项被忽略,剩下的就是资本和劳动力的乘积,和你要的生产函数一致
5. 模型求解(可选)
如果需要求解的话,简单定义模型并求解:
Model production / prodFunc /; Solve production using LP maximizing Q('AGR'); // 示例求解,可根据需求调整
扩展说明
如果后续新增部门,只需要:
- 在
SECTORS集合里加部门名称 - 在
useWater里给新部门赋值1或0 - 给对应部门的
alpha、beta、gamma赋值(需要用水的部门才给gamma赋值)
这样不管部门数量多少,都不用修改方程,只需要维护集合和参数就行,非常高效。
内容的提问来源于stack exchange,提问作者pringlez
相关产品推荐
相关产品推荐

