Код: Выделить всё
# u is the displacement variable
# vel is velocity , vel == u.dt()
# xr and fm are constant parameters
# update xs, frs:
if abs(vel) xs:
f = frs + dx/(xr * (1-delta)+dx) * (fm - frs);
else:
f = frs + dx/(xr * (1+delta)-dx) * (fm + frs);
Подход 1: использование логических функций Gekko< /p>
Я добавил только ту часть кода, которая занимается обновлением xs.
Код: Выделить всё
m = GEKKO()
m.time = np.linspace(0,10,100)
u = m.Var(0, fixed_initial=True)
t = m.Var(0, fixed_initial=True)
v = m.Var(3e-3 * 2*np.pi*0.1)
# previous time step
xs_ = m.Var(0)
m.delay(xs, xs_, 1)
# Equations
m.Equation(t.dt()==1)
m.Equation(u == 3e-3 * m.sin(2*np.pi*0.1 * t))
m.Equation(v == u.dt())
# update xs
xs = m.Var(0, fixed_initial=True)
m.Equation(xs == m.if2(m.abs(v)
Подробнее здесь: [url]https://stackoverflow.com/questions/79058166/model-a-logical-statement-function-in-gekko[/url]
Мобильная версия