[英]Using parameters to solve differential equations in GEKKO python
我需要对 GEKKO 中的微分方程系统进行积分,并希望使用参数来改变梯度。
从概念上讲,这是可行的,但 output 不是我所期望的。 我为下面的示例问题添加了代码片段来说明问题。
求解器将在指定的时间范围内积分,在这种情况下 t = [0, 1, 2, 3]
定义了一个参数,表示每个时间值处的梯度,称为 p = [0, 1, 2, 3]。
我的期望是 t=0 时的梯度为 0,t=1 时的梯度为 1,依此类推。 相反,GEKKO 将其解释为 t=0 时的梯度为 1,t=1 时的梯度为 2,依此类推。
GEKKO 不使用 t=0 时的梯度信息有什么原因吗?
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
n = 3
m = GEKKO(remote=False)
m.time = np.linspace(0,n,n+1) # [0, 1, 2 .. n]
y = m.Var(value=5)
p = m.Param(value=list(range(n+1))) # [0, 1, 2 .. n]
m.Equation(y.dt()==1*p)
m.options.IMODE=4
m.solve(disp=False)
plt.plot(m.time, y.value, '-x')
plt.xlabel('time'); plt.ylabel('y')
plt.show()
设置NODES=3
以获得所需的 output。 Gekko 中的默认值是NODES=2
,速度很快,但不包括每个步骤的内部计算点。 增加节点可以提高解决方案的准确性,但也可以解决更多的变量。 对于长时间范围内的大问题,使用IMODE=7
(顺序求解)而不是IMODE=4
(同时求解)来提高仿真速度。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
n = 3
t = np.linspace(0,n,n+1)
for nodes in [2,3]:
m = GEKKO(remote=False)
m.time = t
y = m.Var(value=5)
p = m.Param(t)
m.Equation(y.dt()==1*p)
m.options.IMODE=4
m.options.NODES=nodes
m.solve(disp=False)
plt.plot(m.time, y.value, '-x')
plt.legend(['NODES=2','NODES=3'])
plt.xlabel('time'); plt.ylabel('y')
plt.grid()
plt.show()
使用具有更多时间点的t = np.linspace(0,n,301)
和p = m.Param(np.floor(t))
表明解决方案收敛于NODES=2
或NODES=3
。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
n = 3
t = np.linspace(0,n,301)
for nodes in [2,3]:
m = GEKKO(remote=False)
m.time = t
y = m.Var(value=5)
p = m.Param(np.floor(t))
m.Equation(y.dt()==1*p)
m.options.IMODE=4
m.options.NODES=nodes
m.solve(disp=False)
plt.plot(m.time, y.value, '-.')
plt.legend(['NODES=2','NODES=3'])
plt.xlabel('time'); plt.ylabel('y')
plt.grid()
plt.show()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.