You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于GEKKO的简单DAE系统一致性初始化技术问询

Solution for Automatic Initial Condition Calculation in GEKKO

Your error in IMODE=4 arises because you're freeing the initial values of pressure and Outlet_flowrate without providing equations to determine them, leading to non-zero degrees of freedom. IMODE=7 uses default initial values (0) since no consistent initialization is enforced.

To automatically compute consistent initial conditions (aligned with your algebraic equations) for complex systems, follow this two-step approach:

  1. Solve a steady-state subproblem to calculate initial values for algebraic variables using the fixed initial state (mass=2 in your case).
  2. Use these computed values as initial conditions for the dynamic simulation.

Modified Code

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt

# Step 1: Compute consistent initial conditions
m_init = GEKKO(remote=False)
# Fix initial mass to 2
mass_init = m_init.Var(value=2, lb=0, ub=100, fixed=True)
Outlet_flowrate_init = m_init.Var(lb=0, ub=10000000)
pressure_init = m_init.Var(lb=0, ub=1000000)

# Only include algebraic equations for initialization
m_init.Equation(Outlet_flowrate_init == (pressure_init - 2))
m_init.Equation(pressure_init == mass_init * 2)

# Solve steady-state to get initial values
m_init.options.IMODE = 1
m_init.solve(disp=False)

# Extract computed initial values
p0 = pressure_init.value[0]
of0 = Outlet_flowrate_init.value[0]

# Step 2: Dynamic simulation with correct initial conditions
m_dyn = GEKKO(remote=False)
m_dyn.time = np.linspace(0, 20, 100)

mass_dyn = m_dyn.Var(value=2, lb=0, ub=100)
Outlet_flowrate_dyn = m_dyn.Var(value=of0, lb=0, ub=10000000)
pressure_dyn = m_dyn.Var(value=p0, lb=0, ub=1000000)

# Full dynamic equations
m_dyn.Equation(mass_dyn.dt() == -Outlet_flowrate_dyn)
m_dyn.Equation(Outlet_flowrate_dyn == (pressure_dyn - 2))
m_dyn.Equation(pressure_dyn == mass_dyn * 2)

# Solve dynamic simulation
m_dyn.options.IMODE = 4
m_dyn.options.RTOL = 1e-15
m_dyn.solve()

# Plot results
plt.plot(m_dyn.time, pressure_dyn.value)
print("Initial pressure:", pressure_dyn.value[0])
plt.xlabel("Time")
plt.ylabel("Pressure")
plt.show()

Key Notes

  • This approach scales to complex systems: fix all known initial state variables, solve for the algebraic variables' initial values via a steady-state solve, then use those in your dynamic model.
  • Manual calculation works for simple cases, but automating the initial condition solve is more efficient and less error-prone for large DAE systems.
  • The steady-state subproblem only needs the algebraic equations (not the differential equation) since we're just computing consistent initial values for the algebraic variables, not enforcing a steady-state dynamic condition.

内容的提问来源于stack exchange,提问作者user24705585

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 07:32:05