[英]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.