Pyomo python 02 微分代數方程定義

2021-10-23 07:20:49 字數 3832 閱讀 1849

本文介紹如何用微分代數方程(daes)來表示和求解最優化問題。pyomo.dae包允許使用者輕鬆地將詳細的動態模型合併到優化框架中,並具有足夠的靈活性來表示各種各樣的微分方程,並演示了pyomo中包含的幾種自動化解決方案技術。該方法採用同時離散化方法求解動態優化問題。

建模組建

為了用pyomo來代表dae模型,pyomo.dae包定義了兩個新元件:

匯入包以訪問建模元件:

from pyomo.environ import *

from pyomo.dae import *

連續域宣告如下:

m.tf = param(initialize=1)

m.t = continuousset(bounds=(0,m.tf))

必須為模型中每個連續域宣告單獨的continuousset,為動態模型中每個導數宣告derivativevar,只能對作為變數索引集的continuousset的變數求導。

m.u = var(m.t, initialize=0)

m.x1 = var(m.t)

m.x2 = var(m.t)

m.dx1 = derivativevar(m.x1, wrt=m.t)

m.dx2 = derivativevar(m.x2)

如果乙個變數被多個連續集索引,則使用「wrt」或「withresptto」關鍵字引數指定所需的導數,高階導數為:

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 個體戶提供法人...