我试图了解在 GAMS 中创建递归动态模型的正确方法是什么。 为此,我制作了一个 2 个线性方程的玩具示例(又名蜘蛛网模型)。现在它从随机点
P(t=1)=40
开始并移动到平衡(系统的解)。
在循环内运行带有索引
t
的简单代码似乎很棘手。 GAMS 总是抱怨 (!):
错误50:模型方程中出现循环控制指标
我一直在寻找其他代码片段(如so),但尚未找到完整的示例来重现。玩代码时,我刚刚放置了另一个
z
并使用 z
循环。我工作正常。
到目前为止一切顺利,但请注意
t
仍然在循环内。我有点困惑。 (至少我不知道这种编码的副作用。)
Set t /t1*t10/
* HERE IS THE TRICK
z /z1*z10/;
Parameters a /100/, b /2/, c /20/, d /1/;
Variables P(t), Qd(t), Qs(t), obj;
Positive Variables P, Qd, Qs;
Equations Demand(t), Supply(t), Equilibrium(t), Objective;
Demand(t).. Qd(t) =E= a - b * P(t);
Supply(t).. Qs(t) =E= c + d * P(t-1);
Equilibrium(t).. Qd(t) =E= Qs(t);
Objective.. obj =E= 1;
P.l('t1') = 40;
Model cobwebModel /all/;
Loop(z,
Solve cobwebModel using LP maximizing obj;
P.l(t+1) = (a - c + d * P.l(t)) / (b + d);
);
问题是:如何重构上面的代码以使其符合 GAMS 风格并准备好进行扩展?
我完全不明白你最终想要解决什么问题,但如果我没猜错的话,你想一次只解决
t
的一个元素吗?在您的代码中,这种情况不会发生,相反,您对 t
中的所有 10 个元素求解 10 次。但是您可以使用动态子集,以不同的方式执行此操作,如下所示:
Set t /t1*t10/
tt(t);
Alias (t,ta);
Parameters a /100/, b /2/, c /20/, d /1/;
Variables P(t), Qd(t), Qs(t), obj;
Positive Variables P, Qd, Qs;
Equations Demand(t), Supply(t), Equilibrium(t), Objective;
Demand(tt(t)).. Qd(t) =E= a - b * P(t);
Supply(tt(t)).. Qs(t) =E= c + d * P(t-1);
Equilibrium(tt(t)).. Qd(t) =E= Qs(t);
Objective.. obj =E= 1;
P.l('t1') = 40;
Model cobwebModel /all/;
Loop(ta,
tt(ta)=yes;
Solve cobwebModel using LP maximizing obj;
P.l(ta+1) = (a - c + d * P.l(ta)) / (b + d);
tt(ta)=no;
);