如何在 Gekko python 中应用依赖于 ODE 系统的边界条件?

How to apply boundary conditions which are dependent for a system of ODE's in Gekko python?

边界条件是 y1(0)=3; y2(0)=y1(5)

在[0,5]区间内

这是 Gekko 中的一种可能实现:

import numpy as np
from gekko import GEKKO
m = GEKKO(remote=False)
m.time = np.linspace(0,5)
x = m.Param(m.time)
y1 = m.Var(3)
y2 = m.Var()
m.Connection(y2,y1,'end',1,'end',1)
m.Equation(y1.dt()+2*y1+y2==m.sin(x))
m.Equation(y2.dt()-4*y1-2*y2==m.cos(x))
m.options.IMODE=6
m.solve()

但是,求解器报告没有解。关于您的问题陈述,有些事情不清楚,例如导数是关于 x 还是 t。如果计算 x,是单个值还是可以在整个时间范围内变化?

编辑回复评论

您可以使用 m.Connection(y2,y1,'end','end','end','end') 实现最终条件 y2(5)=y1(5)。但是,除非您创建某种类型的附加自由度(计算变量),否则这个问题没有可行的解决方案。在没有最终条件约束的情况下,有如图所示的唯一解。

当您添加 Connection 最终约束时,微分方程的解不能改变,因此求解器正确报告自由度太低。

import numpy as np
from gekko import GEKKO
m = GEKKO(remote=False)
m.time = np.linspace(0,5)
x = m.Param(m.time)
y1 = m.Var(3)
y2 = m.Var()
m.Equation(y1.dt()+2*y1+y2==m.sin(x))
m.Equation(y2.dt()-4*y1-2*y2==m.cos(x))
m.options.IMODE=6
m.Connection(y2,y1,'end','end','end','end')
m.solve()

import matplotlib.pyplot as plt
plt.plot(x.value,y1.value,'r--',label='y1')
plt.plot(x.value,y2.value,'b-',label='y2')
plt.legend(); plt.xlabel('x'); plt.ylabel('y')
plt.show()