Как включить время как переменную в Python Gekko?

Мне нужно включить время в мою модель для решения сложной системы дифференциальных уравнений. Вот простая проблема, демонстрирующая проблему с константой k=0.1 и начальным условием y(0)=10.

дифференциальное уравнение

Я пробовал это в Python Gekko, но не могу понять, как включить время в качестве переменной. В Scipy ODEINT функция имеет переменные времени и состояния. В Gekko я определяю m.time как точки, в которых я хотел бы увидеть решение, но использование m.time в уравнении приводит к ошибке.

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

m = GEKKO()    # create GEKKO model
m.time = np.linspace(0,20) # time points
k = 0.1        # constant
y = m.Var(10)  # create GEKKO variable
m.Equation(y.dt()==-k*m.time*y) # create GEKKO equation

# solve ODE
m.options.IMODE = 4
m.solve()

# plot results
plt.plot(m.time,y)
plt.xlabel('time')
plt.ylabel('y(t)')
plt.show()
 @error: Equation Definition
 Equation without an equality (=) or inequality (>,<)
 ((-0.12244897959183675)*(v1))((-0.163265306122449)*(v1))
 STOPPING...
Traceback (most recent call last):
  File "ode_time.py", line 13, in <module>
    m.solve()
  File "C:\Python37\lib\site-packages\gekko\gekko.py", line 2103, in solve
    raise Exception(response)
Exception:  @error: Equation Definition
 Equation without an equality (=) or inequality (>,<)
 ((-0.12244897959183675)*(v1))((-0.163265306122449)*(v1))
 STOPPING...

Как я могу включить время как переменную в уравнения Гекко?


person TexasEngineer    schedule 29.04.2020    source источник


Ответы (1)


Вы можете включить время в модель Гекко, добавив новую переменную t и уравнение d(t)/dt=1.

t = m.Var(0); m.Equation(t.dt()==1)

Вот решение проблемы дифференциального уравнения.

Решение дифференциального уравнения

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

m = GEKKO()    # create GEKKO model
m.time = np.linspace(0,20) # time points
k = 0.1        # constant
y = m.Var(10)  # create GEKKO variable
t = m.Var(0); m.Equation(t.dt()==1)
m.Equation(y.dt()==-k*t*y) # create GEKKO equation

# solve ODE
m.options.IMODE = 4
m.solve()

# plot results
plt.plot(m.time,y)
plt.xlabel('time')
plt.ylabel('y(t)')
plt.show()

Другой пример см. В проблеме № 3 для Python Gekko или той же проблема №3 с ODEINT.

person John Hedengren    schedule 29.04.2020