Pyomo/python_02 微分代数方程定义
本文介绍如何用微分代数方程(DAEs)来表示和求解最优化问题。pyomo.dae包允许用户轻松地将详细的动态模型合并到优化框架中,并具有足够的灵活性来表示各种各样的微分方程,并演示了pyomo中包含的几种自动化解决方案技术。该方法采用同时离散化方法求解动态优化问题。
【1】建模组建
为了用Pyomo来代表DAE模型,Pyomo.dae包定义了两个新组件:
ContinuousSet:有界连续集
DerivativeVar:表示变量对连续集的导数
Integral:连续域上积分
导入包以访问建模组件:
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))
【2】微分定义范例
>>> 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的值来指定。
【3】微分方程定义范例
>>> 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
...
Pyomo/python_02 微分代数方程定义相关推荐
- 2021-01-13 Matlab求解微分代数方程 (DAE)
Matlab求解微分代数方程 (DAE) 什么是微分代数方程? 微分代数方程是一类微分方程,其中一个或多个因变量导数未出现在方程中.方程中出现的未包含其导数的变量称为代数变量,代数变量的存在意味着不能 ...
- 几类常微分方程的matlab求解方法 | 刚性微分方程、隐式微分方程、微分代数方程
目录 微分方程的转换 一.单个高阶常微分方程 二.高阶常微分方程组 刚性微分方程求解 隐式微分方程求解 微分代数方程求解 微分方程的转换 根据微分方程求解的标准型,要得到微分方程的数值解,应该先将该方 ...
- 基于MATLAB的微分代数方程解法(附完整代码)
目录 一. 微分代数方程求解 例题1 二. 全隐式微分方程 三. 延迟微分方程求解 例题2 一. 微分代数方程求解 例题1 初始条件: 求数值解: 解: ①方法1求解 矩阵形式表示该微分代数方程: ( ...
- 【Matlab 控制】利用 Simulink 对微分代数方程建模
From: 对微分代数方程建模 Simulink 设计图 结果图 Simulink Data Inspector
- 微分的定义和介绍习题
前置知识:微分的定义和介绍 例1 函数y=x+1y=\sqrt{x+1}y=x+1在点x=0x=0x=0处,当自变量改变量Δx=0.04\Delta x=0.04Δx=0.04时,dy=‾dy=\u ...
- matlab求解微分代数方程组,微分代数方程(DAE)的Matlab 解法.PDF
微分代数方程(DAE)的Matlab 解法 微分代数方程(DAE)的Matlab解法 所谓微分代数方程,是指在微分方程中,某些变量满足某些代数方程的约束.假 设微分方程的更一般形式可以写成 前面所介绍 ...
- 特殊微分方程的数值解——微分代数方程
所谓的微分代数方程(DAE),是指在微分方程中,某些变量间满足某些代数方程的约束. 微分代数方程的一般形式为: 其中,M(t,x)矩阵的为奇异矩阵.在求解微分方程时,两边不能同时乘以M矩阵的逆矩阵M' ...
- matlab dae,matlab用ode15数值计算微分代数方程(DAE)的问题
代码如下:前四行都是会用到的参数,odefun中有3个微分方程与1个代数方程 lamdap=975e-9;lamdas=1064e-9;t=1e-3;ap=2100e-27;ep=2200e-27;A ...
- python解隐式方程_求解隐式ODE(微分代数方程DAE)
如果代数操作失败,可以对约束进行数值求解,例如在每个时间步运行fsolve:import sys from numpy import linspace from scipy.integrate imp ...
最新文章
- Bitcoin.com推出BCH新图表,加大对BCH的支持
- vs2012 智能提示消失解决办法
- Matlab画图,去掉周围白边
- 域服务器可以修改ip,Windows Server 2016 域控制器修改IP
- Kittle工具抽取文件出现乱码的情况解决方法
- 新ANTLR 4.6的重要更改
- 手把手教你编写接口需求文档
- 信通院 DevOps 新标准评估结果发布:腾讯获评唯一卓越级
- spreadsheet js中创建下拉列表_JS 中创建自定义排序方法
- jQuery动画stop()用法
- php debug pit,start.php
- 硬盘无法识别怎么办 硬盘无法识别怎么恢复数据
- 爬sobooks电子书并把电子书的信息记录到mysql中
- 打砖块python游戏源代码_python制作一个打砖块小游戏
- opencv入门系列教学(五)图像的基本操作(像素值、属性、ROI和边框)
- 用一些助记符表示指令的计算机语言是,2015年海南农村信用社考试营业柜员计算机练习题1...
- Praat将连续录制的声音文件切成小单位文件
- MTK联发科技股份有限公司(MediaTek.Inc)
- linux 怎么看浏览器,Linux下浏览器比比看
- 高等数学(第七版)同济大学 习题6-2 (前12题)个人解答