如何正确循环具有方程动力学的 GAMS 模型?

问题描述 投票:0回答:1

我试图了解在 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 风格并准备好进行扩展?

loops recursion dynamic mathematical-optimization gams-math
1个回答
0
投票

我完全不明白你最终想要解决什么问题,但如果我没猜错的话,你想一次只解决

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;
);
© www.soinside.com 2019 - 2024. All rights reserved.