首页 > 解决方案 > 如何使用变量 GAMS 添加条件

问题描述

我是 GAMS 的初学者。所以,我的问题与条件中变量的使用有关。我想,它是编程流控制功能,但我找不到带有变量而不是参数的示例。

在我的任务中,我在代码开头只有一组 (t)。在“方程”块中,GAMS 对 (t) 的几个值执行变量 D(t),例如,对于 t=1..5。我只想提取 D(t) 的正值。例如我已经执行了 D(t): 3, -2, 5, -4, 1 我想要 D2(t): 3, 0, 5, 0, 1

我知道,不允许将美元条件与变量一起使用。出于同样的原因,我也不能使用 loop+if 构造。例如,我试图写这样的东西,但得到了很多错误(D2(t) 被声明为应有的):

Equation1(t)..    loop (t, 
     if ((D(t) < 0), 
     D2(t) = D(t) - D(t); 
     ); 
);

那么,我该如何添加我的条件以及我应该在哪里放置代码?

标签: variablesconditional-statementsgams-math

解决方案


(不是专家,但我必须回答,因为我没有足够的声誉来发表评论)

我假设您有两个不同的数学程序,并且您要运行第二个程序并使用第一个程序的一些结果。如果是这种情况,您上面显示的这段代码位于两次运行之间,不需要“方程式”部分。

此外,在获得解决方案后,您可以使用 .l(解决方案中变量的级别)访问其值。然后,您还可以声明变量 D2 的值等于变量 D 的值。如果您只是在第二次运行之前为变量 D2 赋予一个值(级别),则模型将被允许在运行期间更改它搜索过程(如果在您的情况下可能)。您可以通过使用 D2.fx(t) 而不是使用 D2.l(t) 来固定变量 D2 的值来避免这种情况。

loop (t, 
     if ((D.l(t) < 0), 
     D2.l(t) = D.l(t) - D.l(t); 
     else 
       D2.l(t) = D.l(t);
     ); 
);   

or 

loop (t, 
     if ((D.l(t) < 0), 
     D2.fx(t) = D.l(t) - D.l(t); 
     else 
       D2.fx(t) = D.l(t);
     ); 
);  

我希望这个答案有帮助:)


推荐阅读