本文介绍如何用微分代数方程(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 微分代数方程定义相关推荐

  1. 2021-01-13 Matlab求解微分代数方程 (DAE)

    Matlab求解微分代数方程 (DAE) 什么是微分代数方程? 微分代数方程是一类微分方程,其中一个或多个因变量导数未出现在方程中.方程中出现的未包含其导数的变量称为代数变量,代数变量的存在意味着不能 ...

  2. 几类常微分方程的matlab求解方法 | 刚性微分方程、隐式微分方程、微分代数方程

    目录 微分方程的转换 一.单个高阶常微分方程 二.高阶常微分方程组 刚性微分方程求解 隐式微分方程求解 微分代数方程求解 微分方程的转换 根据微分方程求解的标准型,要得到微分方程的数值解,应该先将该方 ...

  3. 基于MATLAB的微分代数方程解法(附完整代码)

    目录 一. 微分代数方程求解 例题1 二. 全隐式微分方程 三. 延迟微分方程求解 例题2 一. 微分代数方程求解 例题1 初始条件: 求数值解: 解: ①方法1求解 矩阵形式表示该微分代数方程: ( ...

  4. 【Matlab 控制】利用 Simulink 对微分代数方程建模

    From: 对微分代数方程建模 Simulink 设计图 结果图 Simulink Data Inspector

  5. 微分的定义和介绍习题

    前置知识:微分的定义和介绍 例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 ...

  6. matlab求解微分代数方程组,微分代数方程(DAE)的Matlab 解法.PDF

    微分代数方程(DAE)的Matlab 解法 微分代数方程(DAE)的Matlab解法 所谓微分代数方程,是指在微分方程中,某些变量满足某些代数方程的约束.假 设微分方程的更一般形式可以写成 前面所介绍 ...

  7. 特殊微分方程的数值解——微分代数方程

    所谓的微分代数方程(DAE),是指在微分方程中,某些变量间满足某些代数方程的约束. 微分代数方程的一般形式为: 其中,M(t,x)矩阵的为奇异矩阵.在求解微分方程时,两边不能同时乘以M矩阵的逆矩阵M' ...

  8. matlab dae,matlab用ode15数值计算微分代数方程(DAE)的问题

    代码如下:前四行都是会用到的参数,odefun中有3个微分方程与1个代数方程 lamdap=975e-9;lamdas=1064e-9;t=1e-3;ap=2100e-27;ep=2200e-27;A ...

  9. python解隐式方程_求解隐式ODE(微分代数方程DAE)

    如果代数操作失败,可以对约束进行数值求解,例如在每个时间步运行fsolve:import sys from numpy import linspace from scipy.integrate imp ...

最新文章

  1. Bitcoin.com推出BCH新图表,加大对BCH的支持
  2. vs2012 智能提示消失解决办法
  3. Matlab画图,去掉周围白边
  4. 域服务器可以修改ip,Windows Server 2016 域控制器修改IP
  5. Kittle工具抽取文件出现乱码的情况解决方法
  6. 新ANTLR 4.6的重要更改
  7. 手把手教你编写接口需求文档
  8. 信通院 DevOps 新标准评估结果发布:腾讯获评唯一卓越级
  9. spreadsheet js中创建下拉列表_JS 中创建自定义排序方法
  10. jQuery动画stop()用法
  11. php debug pit,start.php
  12. 硬盘无法识别怎么办 硬盘无法识别怎么恢复数据
  13. 爬sobooks电子书并把电子书的信息记录到mysql中
  14. 打砖块python游戏源代码_python制作一个打砖块小游戏
  15. opencv入门系列教学(五)图像的基本操作(像素值、属性、ROI和边框)
  16. 用一些助记符表示指令的计算机语言是,2015年海南农村信用社考试营业柜员计算机练习题1...
  17. Praat将连续录制的声音文件切成小单位文件
  18. MTK联发科技股份有限公司(MediaTek.Inc)
  19. linux 怎么看浏览器,Linux下浏览器比比看
  20. 高等数学(第七版)同济大学 习题6-2 (前12题)个人解答

热门文章

  1. NC UAP STUDIO授权
  2. 我的世界hmcl启动器登录教程
  3. Python实现超市购物的源码(有注释,适合学习)
  4. 先有鸡还是先有蛋,程序员怎么看
  5. git 关联notepad++
  6. 如何通过ssh远程连接自己的主机(Linux)?
  7. Vuex3 / Vuex4 使用指南
  8. ildasm.exe 查看c# dll 信息,符号 、函数等等
  9. python使用ddt_python中,ddt模块的使用
  10. VMware Workstation Pro 转移服务器中的虚拟机