在 GEKKO 中使用参数求解微分方程 python
Using parameters to solve differential equations in GEKKO python
我需要在 GEKKO 中对微分方程组进行积分,并希望使用参数来改变梯度。
从概念上讲这是可行的,但输出不是我所期望的。我为下面的示例问题添加了一个代码片段来说明问题。
求解器将在指定的时间范围内积分,在这种情况下 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
以获得所需的输出。 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()
有关 NODES
的更多信息位于 Dynamic Optimization course in the section on Orthogonal Collocation on Finite Elements。
我需要在 GEKKO 中对微分方程组进行积分,并希望使用参数来改变梯度。
从概念上讲这是可行的,但输出不是我所期望的。我为下面的示例问题添加了一个代码片段来说明问题。
求解器将在指定的时间范围内积分,在这种情况下 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
以获得所需的输出。 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()
有关 NODES
的更多信息位于 Dynamic Optimization course in the section on Orthogonal Collocation on Finite Elements。