综合能源系统分析的统一能路理论(三):《稳态与动态潮流计算》(Python代码实现)

news2024/12/24 11:41:22

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

2.1 六节点热网动态潮流

2.2  六节点热网稳态潮流

 2.3 七节点气网动态潮流

2.4 七节点气网稳态潮流

🎉3 参考文献

🌈4 Python代码、数据


💥1 概述

本文包含“综合能源系统分析的统一能路理论(三):潮流计算”中7节点天然气网络和6节点供热网络的数据与Python源码

注意

1. 第三方package要求:pandas、numpy、scipy、matplotlib

2. python版本要求:python 3.x

3. 给出的源码仅对目标算例负责。举例:7节点气网算例中的压气机扬程保持恒定,故未对其进行傅里叶分解;基值修正部分,标准的做法应对计算得到的流量取绝对值再修正(因为基值是非负的),由于算例中给出的正方向恰好为实际正方向,故源码中未取绝对值。如需扩充、修改算例内容,请自行修改代码。

4. 天然气网络的算例中,RT用声速(340m/s)的平方代替。这是一个常数,具体取值不影响算法本身。

📚2 运行结果

2.1 六节点热网动态潮流

 

2.2  六节点热网稳态潮流

 2.3 七节点气网动态潮流

2.4 七节点气网稳态潮流

 部分代码:

with context('读取数据与处理'):
    pipe_table = pd.read_excel('./7节点气网稳态data.xls', sheet_name='Branch')
    node_table = pd.read_excel('./7节点气网稳态data.xls', sheet_name='Node')
    numpipe = len(pipe_table)  # 支路数
    numnode = len(node_table)  # 节点数
    l = pipe_table['长度(km)'].values * 1e3  # 长度,m
    d = pipe_table['管径(mm)'].values / 1e3  # 管径,m
    lam = pipe_table['粗糙度'].values  # 摩擦系数
    cp = pipe_table['压气机(MPa)'].values * 1e6  # 支路增压,Pa
    c = 340  # 声速
    Apipe = np.pi*d**2/4  # 管道截面积
    v = np.ones(numpipe)*5  # 流速基值


with context('基于能路的潮流计算'):
    MaxIter = 100  # 最大迭代次数
    err = []  # 误差记录
    vb = [v.copy()]  # 基值记录
    for itera in range(MaxIter):
        # 支路参数
        Rg = [lam[i]*v[i]/Apipe[i]/d[i] for i in range(numpipe)]
        Lg = [1/Apipe[i] for i in range(numpipe)]
        Cg = [Apipe[i]/c**2 for i in range(numpipe)]
        Ug = [-lam[i]*v[i]**2/2/c**2/d[i] for i in range(numpipe)]
        
        # 支路导纳矩阵
        Yb1, Yb2, Zb, Ub = [], [], [], []
        f = 0  # 稳态,只取零频率分量
        for i in range(numpipe):
            Z, Y = Rg[i], 0
            za = np.cosh(np.sqrt(Ug[i]**2+4*Z*Y)/2*l[i]) - Ug[i]/np.sqrt(Ug[i]**2+4*Z*Y)*np.sinh(np.sqrt(Ug[i]**2+4*Z*Y)/2*l[i])
            za = za*np.exp(-Ug[i]*l[i]/2)
            zb = -2*Z/np.sqrt(Ug[i]**2+4*Z*Y)*np.sinh(np.sqrt(Ug[i]**2+4*Z*Y)/2*l[i])
            zb = zb*np.exp(-Ug[i]*l[i]/2)
            zc = -2*Y/np.sqrt(Ug[i]**2+4*Z*Y)*np.sinh(np.sqrt(Ug[i]**2+4*Z*Y)/2*l[i])
            zc = zc*np.exp(-Ug[i]*l[i]/2)
            zd = np.cosh(np.sqrt(Ug[i]**2+4*Z*Y)/2*l[i]) + Ug[i]/np.sqrt(Ug[i]**2+4*Z*Y)*np.sinh(np.sqrt(Ug[i]**2+4*Z*Y)/2*l[i])
            zd = zd*np.exp(-Ug[i]*l[i]/2)
            
            Yb1.append((za*zd-zb*zc-za)/zb)  # 稳态计算中,接地支路不起作用
            Yb2.append((1-zd)/zb)  # 稳态计算中,接地支路不起作用
            Zb.append(-zb)
            Ub.append(1-za*zd+zb*zc)
        yb, ub = np.diag(1/np.array(Zb)), np.diag(Ub)
        
        # 节点-支路关联矩阵
        A = np.zeros([numnode, numpipe])
        Ap = np.zeros([numnode, numpipe])
        for row in pipe_table.iterrows():
            A[int(row[1][1])-1, row[0]] = 1
            A[int(row[1][2])-1, row[0]] = -1
            Ap[int(row[1][1])-1, row[0]] = 1
            Ap[int(row[1][2])-1, row[0]] = 0
        
        # 节点导纳矩阵
        Yg_ = np.matmul(np.matmul(A, yb), A.T) - np.matmul(np.matmul(np.matmul(A, yb), ub), Ap.T)
        
        # 节点分类
        fix_G = node_table[node_table['节点类型']=='定注入'].index.values
        fix_p = node_table[node_table['节点类型']=='定压力'].index.values
        Yg_11 = Yg_[fix_G][:,fix_G]
        Yg_12 = Yg_[fix_G][:,fix_p]
        Yg_21 = Yg_[fix_p][:,fix_G]
        Yg_22 = Yg_[fix_p][:,fix_p]
        assert np.linalg.cond(Yg_11)<1e5  # 确认矩阵不奇异
        
        # 形成广义节点注入向量(给定) 与 节点压力向量(给定)
        Gn_1 = node_table[node_table['节点类型']=='定注入']['注入 (kg/s)'].values.reshape([-1,1])  # kg/s
        Gn_1 -= np.matmul(np.matmul(A[fix_G,:], yb), cp.reshape([-1,1]))
        pn2 = node_table[node_table['节点类型']=='定压力']['气压 (MPa)'].values.reshape([-1,1]) * 1e6  # Pa
            
        # 求解零频率网络方程
        pn1 = np.matmul(np.linalg.inv(Yg_11), (Gn_1 - np.matmul(Yg_12, pn2))).real
        Gn_2 = (np.matmul(Yg_21, pn1) + np.matmul(Yg_22, pn2))
        Gn_2 += np.matmul(np.matmul(A[fix_p,:], yb), cp.reshape([-1,1]))
        
        # 计算失配误差
        p = []
        pn1, pn2 = pn1.reshape(-1).tolist(), pn2.reshape(-1).tolist()
        for node in node_table['节点类型'].values:
            p.append(pn1.pop(0) if node=='定注入' else pn2.pop(0))
        p = np.array(p).reshape([-1,1])
        I = np.matmul(A.T, p).reshape(-1) + cp.reshape(-1) - (np.array(Ub).reshape([-1,1])*np.matmul(Ap.T, p)).reshape(-1)
        for i in range(numpipe):
            I[i] = abs(I[i]*np.diag(yb)[i]/Apipe[i]/(np.matmul(Ap.T, p).reshape(-1)[i])*c**2)
        err.append(np.linalg.norm(I-v))
        print('第%d次迭代,失配误差为%.5f'%(itera+1, err[-1]))
        

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

🌈4 Python代码、数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring6笔记3(bean的循环依赖,手写spring框架,ioc注解开发,JdbcTemplate)

第九章、Bean的循环依赖问题 9.1 什么是Bean的循环依赖 A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你&#xff0c;你也依赖我。 比如&#xff1a;丈夫类Husband&#xff0c;妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。 public class Husband…

【java线程池详解】

java线程池详解线程的基本状态Executor框架Executor框架组成部分Executor框架使用示意图Runnable接口、Callable接口ExecutorsFuture接口和实现Future接口的FutureTask类Future和FutureTask的关系ThreadPoolExecutor类ThreadPoolExecutor 饱和策略&#xff08;拒绝策略&#xf…

MySQL去重,一条SQL语句完美解决【去重留一】

此处以某消费记录表(consume_record)为例&#xff0c;SQL语句如下&#xff1a; DELETE consume_record FROM consume_record, ( SELECT min(id) id, user_id, monetary, con…

Qt第五十五章:Qt Design Studio设计登录页并打包到python运行

目录 一、Qt Design Studio 二、导出所有文件到QRC&#xff08;不要改动默认的QRC文件名称&#xff09; 三、QRC转换成py 1.删除Constants.qml中的 2.将App.qml和Screen01.qml中的 3.转换 4、将QRC文件和转换后的py文件&#xff0c;复制到python项目中使用。 一、Qt Des…

【云原生 Kubernetes】k8s集群部署springboot项目

一、前言 本篇&#xff0c;我们将基于k8s集群&#xff0c;模拟一个比较接近实际业务的使用场景&#xff0c;使用k8s集群部署一个springboot的项目&#xff0c;我们的需求是&#xff1a; 部署SpringBoot项目到阿里云服务器 &#xff1b;基于容器打包&#xff0c;推送私有镜像仓…

Presto 之 BTreeIndex 索引代码走读

一. 前言 本文主要介绍在Presto&#xff08;OpenLookeng&#xff09;中的BTree索引的代码实现。关于BTree索引原理的介绍可以参考官网资料openLooKeng documentation。 二. BTreeIndex 索引建立 在Presto中&#xff0c;BTreeIndex 索引是通过mapdb中的BTreeMap数据结构实现的&a…

【java入门系列一】java基础

学习记录&#x1f914;写在前面JDK\JREPython有没有虚拟机&#xff1f;第一个code规范学习方法转义符号注释讨论总结谢谢点赞交流&#xff01;(❁◡❁)更多代码&#xff1a; Gitee主页&#xff1a;https://gitee.com/GZHzzz博客主页&#xff1a; CSDN&#xff1a;https://blog.…

13---SpringBoot整合JWT,实现登录和拦截

1、 JWT简介 什么是JWT&#xff1f; JWT(JSON Web Token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。它将用户信息加密到token里&#xff0c;服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性&#xff0c;只要正确即通过验证&…

在Ubuntu上安装Azure DevOps代理程序

Contents1 概述2. 安装Ubuntu 18.04操作系统3. 安装Azure DevOps Server 代理3.1 安装Azure DevOps Server 代理3.2 以服务方式运行代理1. 概述Ubuntu是一个以桌面应用为主的Linux操作系统&#xff0c;目前在不适用微软Windows的企业中&#xff0c;ubuntu被广泛应用在个人电脑中…

网络原理4 数据链路层

文章目录mac地址网络原理的总结在数据链路层中&#xff0c;最主要的就是以太网协议这里的目的IP和原地址都是mac地址 mac地址 首先要知道什么是Mac地址&#xff0c;mac地址也叫做物理地址或以太网地址&#xff0c;它是一个用来确认网络设备位置的位置&#xff0c;一个网卡就会…

javaWeb——第一章概述

目录 1.1 软件的分类 1.2 软件架构 1.3 web软件 1.4 web程序 web服务器&#xff1a; Tomcat: 扩展 Java web就是窗口和程序之间的交互&#xff1a; 1.1 软件的分类 系统软件 应用软件 介于两者之间的中间件&#xff08;插件&#xff09; 1.2 软件架构 B/S 服务器与浏…

ZC706P+ADRV9009连接RADIOVERSE详解之三

做好SD卡映像&#xff0c;连接好硬件之后&#xff0c;我们就可以尝试软件操作了。 步骤1&#xff1a;设置好网络 打开软件界面我们看到&#xff0c;板子默认的地址为192.168.1.10 端口号为55555.我们一定也设置跟板子连接的以太网口处于192.168.1网段&#xff0c;并且子网掩码…

【ESP32+freeRTOS学习笔记-(四)任务调度机制】

目录1 、什么是任务的调度机制1.1 概念1.2 三种算法1.3 决定算法的宏2、基本词条解释3、调度算法解释3.1 具有时间片的优先级抢先调度 Prioritized Pre-emptive Scheduling with Time Slicing3.1.1 图解高优先级任务抢占低优先级任务3.1.2 图解具有时间片的优先级抢占3.1.3 总结…

如何通过少量样本推断整体业务情况

在产品运营中非常常见&#xff0c;为了能够解决大量数据时分析效率急剧下降的窘况&#xff0c;我们就必须能够去分析非常小量样本的特征&#xff0c;再用这些特征去评估海量总体数据的特征&#xff0c;我们叫它样本检验。 样本&#xff0c;是指我们需要“分析或考察的数据”的…

MAC(m1)-安装Redis6.2.8

Redis官网&#xff1a;Download | Redis 我准备下载7以前的版本 下载放到如下位置 在这个目录打开终端&#xff1a; 编译测试&#xff0c;执行命令&#xff1a;sudo make test 等待了好久&#xff0c;估计好几分钟 最后出现&#xff1a; 下面准备安装redis&#xff0c;编译安…

计算机网络的定义和性能指标

目录计算机网络的定义计算机网络的分类计算机网络的性能指标速率带宽吞吐量时延时延带宽积往返时间利用率丢包率计算机网络的定义 计算机网络的精确定义并未统一&#xff1b;计算机网络的最简单的定义是&#xff1a;一些互相连接的、自治的计算机的集合&#xff1b; 互连&…

Kubernetes组件_Scheduler_02_二次调度

文章目录一、前言二、二次调度/运行期间调度Descheduler2.1 机器上安装helm2.2 每个机器都要准备好镜像2.3 使用helm部署三、Descheduler需要注意的点(相关理论知识)3.1 descheduler 调度策略3.2 descheduler 有哪些不足3.2.1 基于 Request 计算节点负载并不能反映真实情况3.2.…

【Lua】xLua逻辑热更新

1 前言 Lua基础语法 中系统介绍了 Lua 的语法体系&#xff0c;ToLua逻辑热更新 中介绍了 ToLua 的应用&#xff0c;本文将进一步介绍 Unity3D 中基于 xLua 实现逻辑热更新。 逻辑热更新是指&#xff1a;在保持程序正常运行的情况下&#xff0c;在后台修改代码逻辑&#xff0c;修…

子查询+「EXISTS」 以及 组合查询UNION ALL

目录方便的子查询及EXISTS使用子查询作为计算手段使用子查询过滤数据&#xff08;IN&#xff09;使用子查询过滤数据&#xff08;EXISTS&#xff09;组合查询UNION ALL如何使用UNION ALL合并多个结果集如何使用UNION去除集合的重复记录如何合并2个以上的结果集&#xff1f;方便…

Hudi(6):Hudi集成Spark之spark-shell 方式

目录 0. 相关文章链接 1. 启动 spark-shell 2. 插入数据 3. 查询数据 3.1. 转换成DF 3.2. 查询 3.3. 时间旅行查询 4. 更新数据 5. 增量查询 5.1. 重新加载数据 5.2. 获取指定beginTime 5.3. 创建增量查询的表 5.4. 查询增量表 6. 指定时间点查询 7. 删除数据 …