在 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=2NODES=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