本文介紹如何用微分代數方程(daes)來表示和求解最優化問題。pyomo.dae包允許使用者輕鬆地將詳細的動態模型合併到優化框架中,並具有足夠的靈活性來表示各種各樣的微分方程,並演示了pyomo中包含的幾種自動化解決方案技術。該方法採用同時離散化方法求解動態優化問題。
建模組建
為了用pyomo來代表dae模型,pyomo.dae包定義了兩個新元件:
匯入包以訪問建模元件:
from pyomo.environ import *
from pyomo.dae import *連續域宣告如下:
m.tf = param(initialize=1)必須為模型中每個連續域宣告單獨的continuousset,為動態模型中每個導數宣告derivativevar,只能對作為變數索引集的continuousset的變數求導。m.t = continuousset(bounds=(0,m.tf))
m.u = var(m.t, initialize=0)如果乙個變數被多個連續集索引,則使用「wrt」或「withresptto」關鍵字引數指定所需的導數,高階導數為:m.x1 = var(m.t)
m.x2 = var(m.t)
m.dx1 = derivativevar(m.x1, wrt=m.t)
m.dx2 = derivativevar(m.x2)
m.dx1dt2 = derivativevar(m.x1,wrt=(m.t,m.t))
微分定義範例
>>> from pyomo.environ import *
>>> from pyomo.dae import *
>>> model = concretemodel()
>>> model.s = set(initialize=['a','b'])
>>> model.t = continuousset(bounds=(0,5))
>>> model.l = continuousset(bounds=(-10,10))
>>> model.x = var(model.t)
>>> model.y = var(model.s,model.t)
>>> model.z = var(model.t,model.l)
# x對t的一階導數
model.dxdt = derivativevar(model.x, withrespectto=model.t)
# y對t的二階導數,注意微分y被兩個連續集索引
>>> model.dydt2 = derivativevar(model.y, wrt=(model.t,model.t))
# z對x的偏導,注意z被t和l索引
>>> model.dzdl = derivativevar(model.z, wrt=(model.l), initialize=0)
# z對t和l二階混合偏導,設定邊界
>>> model.dz2 = derivativevar(model.z, wrt=(model.t, model.l), bounds=(-10, 10))
『initialize』初始化導數值,與指定初始條件不同;初始條件或邊界條件應該使用約束或約束列表來指定,或者通過在邊界點固定var的值來指定。
微分方程定義範例
>>> from pyomo.environ import *
>>> from pyomo.dae import *
>>> model = concretemodel()
>>> model.s = set(initialize=['a', 'b'])
>>> model.t = continuousset(bounds=(0, 5))
>>> model.l = continuousset(bounds=(-10, 10))
>>> model.x = var(model.s, model.t)
>>> model.y = var(model.t, model.l)
>>> model.dxdt = derivativevar(model.x, wrt=model.t)
>>> model.dydt = derivativevar(model.y, wrt=model.t)
>>> model.dydl2 = derivativevar(model.y, wrt=(model.l, model.l))
# 常微分方程
>>> def _ode_rule(m, s, t):
... if t == 0:
... return constraint.skip
... return m.dxdt[s, t] == m.x[s, t]**2
>>> model.ode = constraint(model.s, model.t, rule=_ode_rule)
# 偏微分方程
>>> def _pde_rule(m, t, l):
... if t == 0 or l == m.l.first() or l == m.l.last():
... return constraint.skip
... return m.dydt[t, l] == m.dydl2[t, l]
>>> model.pde = constraint(model.t, model.l, rule=_pde_rule)
預設情況下,在連續集上宣告的約束將應用於集合中包含的每個離散點,通常不希望在連續域的乙個或兩個邊界處強制執行微分方程,可以使用 constraint.skip解決或者在將模型傳送到求解器之前停用所需的約束,如下。如果使用pyomo.dae simulator 必須使用constraint deactivation代替constraint skipping。
>>> def _ode_rule(m, s, t):
... return m.dxdt[s, t] == m.x[s, t]**2
>>> model.ode = constraint(model.s, model.t, rule=_ode_rule)
>>> def _pde_rule(m, t, l):
... return m.dydt[t, l] == m.dydl2[t, l]
>>> model.pde = constraint(model.t, model.l, rule=_pde_rule)
# 宣告其他元件並離散化轉換
...#邊界點微分方程失效
>>> for con in model.ode[:, model.t.first()]:
... con.deactivate()
>>> for con in model.pde[0, :]:
... con.deactivate()
>>> for con in model.pde[:, model.l.first()]:
... con.deactivate()
>>> for con in model.pde[:, model.l.last()]:
... con.deactivate()
solve the model
...
微信支付02
此處可以在新增相關處理業務,校驗通知引數中的商戶訂單號out trade no和金額total fee是否和商戶業務系統的單號和金額是否一致,一致後方可更新資料庫表中的記錄。91 respstring success 92 93 94 95resp.getwriter write respstrin...
02 微博賬號註冊
進入首頁。建立 接入的應用 外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img uqocmcmd 1602230072860 c users lucky pictures camera roll 微博賬號註冊1.png 外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 im...
微信支付0 2 費率開通
一 我們先來了解一下商戶類目對應資質 費率 結算週期,以下商戶型別都可以通過我們服務商來調整費率的最低可以0.2 費率的。二 為什麼你們畫素科技能夠為企業 個體戶客戶開通低至0.2 的提現費率?三 提現費率0.2開通,需要準備哪些材料?1 營業執照拍照。2 法人身份證,正反面拍照 3 個體戶提供法人...