gekko - 如何在 Gekko python 中应用依赖于 ODE 系统的边界条件?
问题描述
边界条件为 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
计算,是单个值还是能够在整个时间范围内变化?
编辑以回应评论
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()
推荐阅读
- apache-spark - 为在同一台机器上运行的多个执行器导出 spark executor jmx 指标
- ocr - Mirador 单词突出显示
- python - 如何在 Clickhouse 的远程服务器上保存从 Python 控制台接收到的数据?
- python - 将excel列转换为变量
- apache-spark - SparkSQL 与 ScalaPB:在输出原型格式中使用 MapType 会在调用 toByteString 时产生 scala.MatchError
- ios - Xcode 12 Beta - 找不到模拟器运行时
- laravel - AWS ElasticBeanstalk 上的 Laravel:在使用 .ebextensions 部署失败时运行工匠迁移命令
- typescript - 打字稿共享属性类型
- javascript - 用户脚本 Javascript 来更改动态创建的 iframe 中的元素值
- python - 为什么我的 sparse_categorical_crossentropy 和 categorical_crossentropy 有 2 种不同的损失?