Python Gekko - ненулевые степени свободы из -за if2/if3Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Python Gekko - ненулевые степени свободы из -за if2/if3

Сообщение Anonymous »

В настоящее время я строю экономическую модель в Python Gekko: < /p>

Код: Выделить всё

m = GEKKO()

m.time = np.arange(0, 200, 1)

#define the variables

consumption                = m.Var()
tax                        = m.Var()
disposable_income          = m.Var()
(...)

#define the parameters

government_spending                         = m.Param(value=20)
interest_rate                               = m.Param(value=0.05)
tax_rate                                    = m.Param(value=0.2)
(...)

#define lagged values of bond_price and bond_holding

m.delay   (bond_price, bond_price_previous, steps=1)
m.delay   (bond_holding, bond_holding_previous, steps=1)

#define the equations of the model

m.Equation(money_holding             == wealth - bill_holding_household - bond_value)
m.Equation(money_demand              == expected_wealth - bill_holding_household - bond_value)
m.Equation(bill_holding_central_bank == bill_supply - bill_holding_household)

m.Equation(bill_supply.dt()          == (government_spending + coupon_rate * bill_supply + bond_holding) - (tax + coupon_rate * bill_holding_central_bank) - bond_price * bond_holding.dt())
m.Equation(money_supply.dt()         == bill_holding_central_bank.dt())
(...)
m.Equation(coupon_rate               == interest_rate)
m.Equation(bond_return               == 1 / bond_price)

m.options.IMODE=4
m.solve(disp=True, DIAGLEVEL=2)
< /code>
Модель выше успешно решается Gekko. Степени свободы (DOF) = 0, и решения, как и ожидалось.m.Equation(bond_price.dt()           == bond_price_increase_step * decision_increase_bond_price)
m.Equation(decision_increase_bond_price == m.if2(target_proportion - ceiling_target_proportion, 0, 1))
m.Equation(target_proportion         == bond_value / (bond_value + bill_holding_household))
< /code>
Ранее Bond_price является параметром, но теперь это переменная. Он будет изменяться в зависимости от того, выше ли target_proportion выше, чем neiling_target_proportion, параметр или нет. Если это так, DESTICE_INCREASE_BOND_PRICE становится 1 и увеличивает BOND_PRICE BY BOND_PRICE_INCREASE_STEP. Это, возможно, означает, что в системе существует две переменные, чем количество уравнений. Также я очень уверен, что DOF вызван IF2, потому что из моего эксперимента удаление и добавление IF2 уменьшает и увеличивает мои DOFS на 2. < /p>
У меня есть некоторые вопросы относительно моей ситуации: < /p>

  Почему IF2 добавляет два дополнительных переменных? Применяется ли причина к другим логическим функциям в Gekko (max, min, if3 и т.  Д.)? < /P>
< /li>
  Можно ли реализовать этот вид двоичного переключателя в Gekko, чтобы DOF = 0? Связанные переменные и параметры) < /p>
from gekko import GEKKO

m = GEKKO()

m.time = np.arange(0, 200, 1)

consumption                = m.Var()
tax                        = m.Var()
disposable_income          = m.Var()

money_holding              = m.Var()
money_demand               = m.Var()
money_supply               = m.Var()
income                     = m.Var()
bill_holding_household     = m.Var()
wealth                     = m.Var()

coupon_rate                = m.Var()
bill_supply                = m.Var()
bill_holding_central_bank  = m.Var()
expected_disposable_income = m.Var()
expected_wealth            = m.Var()
bond_holding               = m.Var()
bond_return                = m.Var()
bond_value                 = m.Var()
bond_price_previous        = m.Var()
bond_holding_previous      = m.Var()
capital_gain               = m.Var()

bond_price                                  = m.Var(value=10)
decision_increase_bond_price                = m.Var()
target_proportion                           = m.Var()

government_spending                         = m.Param(value=20)
interest_rate                               = m.Param(value=0.05)
tax_rate                                    = m.Param(value=0.2)
marginal_propensity_to_consume_income       = m.Param(value=0.6)
marginal_propensity_to_consume_wealth       = m.Param(value=0.4)

expected_disposable_income_adjustment_speed = m.Param(value=0.5)
expected_wealth_adjustment_speed            = m.Param(value=0.5)
portion_household_expect_increased_return   = m.Param(value=0.1)

bond_price_increase_step                    = m.Param(value=0.01)
ceiling_target_proportion                   = m.Param(value=0.505)
floor_target_proportion                     = m.Param(value=0.495)

lambda20                                    = m.Param(value=0.35)
lambda22                                    = m.Param(value=1)
lambda23                                    = m.Param(value=1)
lambda24                                    = m.Param(value=0.03)
lambda30                                    = m.Param(value=0.3)
lambda32                                    = m.Param(value=1)
lambda33                                    = m.Param(value=1)
lambda34                                    = m.Param(value=0.03)

m.delay   (bond_price, bond_price_previous, steps=1)
m.delay   (bond_holding, bond_holding_previous,  steps=1)

m.Equation(money_holding             == wealth - bill_holding_household - bond_value)
m.Equation(money_demand              == expected_wealth - bill_holding_household - bond_value)
m.Equation(bill_holding_central_bank == bill_supply - bill_holding_household)

m.Equation(bill_supply.dt()          == (government_spending + coupon_rate * bill_supply + bond_holding) - (tax + coupon_rate * bill_holding_central_bank) - bond_price * bond_holding.dt())
m.Equation(money_supply.dt()         == bill_holding_central_bank.dt())
m.Equation(wealth.dt()               == disposable_income - consumption + capital_gain)
m.Equation(expected_disposable_income.dt() == expected_disposable_income_adjustment_speed * (disposable_income - expected_disposable_income))
m.Equation(expected_wealth.dt()      == expected_wealth_adjustment_speed * (wealth - expected_wealth) + expected_disposable_income - consumption)
m.Equation(capital_gain              == bond_holding_previous * (bond_price - bond_price_previous))

m.Equation(consumption               == marginal_propensity_to_consume_income * expected_disposable_income + marginal_propensity_to_consume_wealth * wealth)
m.Equation(disposable_income         == income + coupon_rate * bill_holding_household + bond_holding - tax)
m.Equation(income                    == consumption + government_spending)
m.Equation(tax                       == tax_rate * (income + coupon_rate * bill_holding_household + bond_holding))

m.Equation(bill_holding_household    == expected_wealth * (lambda20 + lambda22 * coupon_rate + lambda23 * bond_return + lambda24 * (expected_disposable_income/expected_wealth)))
m.Equation(bond_value                == expected_wealth * (lambda30 + lambda32 * coupon_rate + lambda33 * bond_return + lambda34 * (expected_disposable_income/expected_wealth)))
m.Equation(bond_holding              == bond_value / bond_price)

m.Equation(coupon_rate               == interest_rate)
m.Equation(bond_return               == 1 / bond_price)

m.Equation(bond_price.dt()           == bond_price_increase_step * (decision_increase_bond_price))
m.Equation(decision_increase_bond_price == m.if2(target_proportion - ceiling_target_proportion, 0, 1))
m.Equation(target_proportion         == bond_value / (bond_value + bill_holding_household))

m.options.IMODE=4
m.solve(disp=True)
< /code>
Я попробовал несовершенное решение, которое заменяет IF2 неравенством:decision_increase_bond_price * (ceiling_target_proportion - target_proportion) 

Подробнее здесь: [url]https://stackoverflow.com/questions/79506533/python-gekko-non-zero-degrees-of-freedom-due-to-if2-if3[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»