GAMS: использование переменных в логических условиях

У меня вопрос по GAMS. Я вроде новичок в GAMS. Я использую minlp с решателем scip.

Я пытаюсь смоделировать систему хранения тепловой энергии концентрированной солнечной электростанции. Прямо сейчас я застрял на моделировании уравнений для стратегии работы резервуара, независимо от того, находится ли он в режиме разрядки или зарядки. Я моделирую резервуар с термоклином, где во время зарядки горячая тепловая энергия входит в верхнюю часть емкости и выталкивает холодную тепловую энергию снизу. Для процесса разряда все наоборот.

Рабочие стратегии зависят от массовых потоков от приемника или силового блока, которые являются переменными решения. Для различных рабочих стратегий температура на входе и выходе накопителя тепловой энергии изменяется. Итак, есть некоторые уравнения, которые логически зависят от значений переменных решения.

Дело в том, что если я попытаюсь использовать логические условия (либо с оператором if, либо с оператором $) с переменными в нем для определения уравнений, я получаю ошибки 52 или 53 «Эндогенные операции $ -контроля не разрешены». Это похоже на ошибку, которую вы получаете с операторами решения, потому что невозможно поставить логические условия с переменными решения. Проведя небольшое исследование в Интернете, я обнаружил эти угрозы, где они довольно хорошо объяснены:

https://forum.gamsworld.org/viewtopic.php?f=13&t=6795

Использовать переменную в долларах GAMS

Итак, из-за этой проблемы у меня есть несколько вопросов:

Кто-нибудь знает, как можно моделировать уравнения, которые логически зависят от переменных решения? Или это невозможно с GAMS, поэтому мне пришлось бы переключиться на другой язык, чтобы решить эту проблему?

Это были бы важные уравнения:

e_charge(i+1)$(m_rc_ts(i+1) > 0) .. dec(i+1) =e= 1;

e_discharge(i+1)$(m_pb_ts(i+1)) .. dec(i+1) =e= 2;

e_no_use(i+1)$(m_rc_ts(i+1) = 0 and m_pb_ts(i+1) = 0) .. dec(i+1) =e= dec(i);

e_m_rc_ts_restrict(i+1)$(dec(i+1) = 2) .. m_rc_ts(i+1) =e= 0;

e_m_pb_ts_restrict(i+1)$(dec(i+1) = 1) .. m_pb_ts(i+1) =e= 0;

e_T_ti_charge(nfirst,i+1)$(dec(i+1)= 1) .. T_fl(nfirst,i+1) =e= T_ro;

e_T_ti_discharge(nfirst,i+1)$(dec(i+1)= 2) .. T_fl(nfirst,i+1) =e= T_po(i+1);

Спасибо за вашу помощь!

Ваше здоровье


person Help621    schedule 13.03.2018    source источник


Ответы (1)


Вы не можете использовать переменную как таковую, но можете использовать ее атрибуты: поэтому вы не можете писать

$(dec(i+1))

но

$(dec.l(i+1))

работает (это уровень переменной).

person Jon    schedule 14.03.2018
comment
Спасибо за ответ. - person Help621; 17.03.2018