簡體   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