Код: Выделить всё
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]