繁体   English   中英

在GEKKO python中使用参数求解微分方程

[英]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=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的更多信息,请参见 有限元正交搭配部分的动态优化课程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM