首页 > 解决方案 > 如何在 Gekko python 中应用依赖于 ODE 系统的边界条件?

问题描述

在此处输入图像描述

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

在[0,5]区间内

标签: gekko

解决方案


这是 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计算,是单个值还是能够在整个时间范围内变化?

编辑以回应评论

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

无连接解决方​​案

添加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()

推荐阅读