Estou tentando entender qual é a maneira correta de fazer um modelo recursivo-dinâmico no GAMS. Para isso, fiz um exemplo de brinquedo de 2 equações lineares (também conhecido como modelo teia de aranha). Agora ele começa em um ponto aleatório P(t=1)=40
e se move para o equilíbrio (solução do sistema).
Parece ser complicado executar um código direto com índice t
dentro do loop. O GAMS sempre reclama (!):
Erro 50: O índice de controle de loop aparece na(s) equação(ões) do modelo
Tenho procurado em outros trechos de código (como ) , mas não encontrei o exemplo completo para reproduzir. Brincando com o código, acabei de colocar outro z
loop and com z
. Funciona bem.
Até aqui tudo bem, mas note como t
ainda está dentro do loop. Estou um pouco confuso. (Pelo menos não tenho ideia sobre os efeitos colaterais dessa codificação.)
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);
);
A questão é : como refatorar o código acima para torná-lo adequado ao estilo GAMS e pronto para escalonamento?
Não entendi completamente o que você quer resolver no final, mas se entendi direito, você quer resolver apenas um elemento de
t
por vez? No seu código, isso não aconteceria, em vez disso, você resolve 10 vezes para todos os 10 elementos emt
. Mas você poderia usar um subconjunto dinâmico, para fazer diferente, algo assim: