一种多能互补集中供暖智能控制系统及其方法转让专利

申请号 : CN202310968771.9

文献号 : CN116804467B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李达欧阳关彬黄少鹏

申请人 : 东营市星创园区运营管理有限公司

摘要 :

本发明公开一种多能互补集中供暖智能控制系统及其方法,涉及节能控制技术领域。本发明包括根据供暖目标温度、供暖回流温度和供暖流速的历史记录预估下一调整时刻的目标总热功率的概率分布区间;获取并汇总得到每个被动加热单元的热功率的历史记录;根据每个被动加热单元的热功率的历史记录以及下一调整时刻的目标总热功率的概率分布区间预估下一调整时刻主动加热单元的累计热功率的概率分布区间;根据每个主动加热单元的热功率单价、最大热功率以及下一调整时刻主动加热单元的累计热功率的概率分布区间计算得到下一调整时刻主动加热单元的热功率。本发明对加热单元热功率的预判的分配,在保障供暖效果的同时降低了采暖成本。

权利要求 :

1.一种多能互补集中供暖智能控制方法,其特征在于,包括,

获取供暖目标温度;

在保持供暖压力的状态下,实时获取供暖回流温度以及供暖流速,并记录得到对应的历史记录;

根据所述供暖目标温度、供暖回流温度和供暖流速的历史记录预估间隔设定时长的下一调整时刻的目标总热功率的概率分布区间;

获取每个加热单元的热功率单价,其中,所述加热单元包括主动加热单元和被动加热单元,所述被动加热单元的启用优先级大于所述主动加热单元;

获取每个所述主动加热单元的最大热功率;

获取每个所述被动加热单元的实时热功率,并汇总得到每个所述被动加热单元的热功率的历史记录;

根据每个所述被动加热单元的热功率的历史记录以及下一调整时刻的目标总热功率的概率分布区间预估下一调整时刻所述主动加热单元的累计热功率的概率分布区间;

根据每个所述主动加热单元的热功率单价、最大热功率以及下一调整时刻所述主动加热单元的累计热功率的概率分布区间计算得到下一调整时刻每个所述主动加热单元的热功率。

2.根据权利要求1所述的方法,其特征在于,所述根据所述供暖目标温度、供暖回流温度和供暖流速的历史记录预估间隔设定时长的下一调整时刻的目标总热功率的概率分布区间的步骤,包括,根据所述供暖回流温度和供暖流速的历史记录预估间隔设定时长的下一调整时刻的供暖回流温度以及供暖流速的概率分布区间;

根据所述供暖目标温度、下一调整时刻的供暖回流温度以及供暖流速的概率分布区间计算得到下一调整时刻的目标总热功率的概率分布区间。

3.根据权利要求2所述的方法,其特征在于,所述根据所述供暖回流温度和供暖流速的历史记录预估间隔设定时长的下一调整时刻的供暖回流温度以及供暖流速的概率分布区间的步骤,包括,根据所述供暖回流温度和供暖流速的历史记录得到所述供暖回流温度和所述供暖流速关于时间的拟合函数;

分别获取所述供暖回流温度和所述供暖流速关于时间的拟合函数中当前时刻所在的单调区间作为临近单调区间;

分别根据临近单调区间内所述供暖回流温度和所述供暖流速关于时间的拟合函数得到下一调整时刻的供暖回流温度以及供暖流速的期望值;

分别计算所述临近单调区间内所述供暖回流温度和所述供暖流速的若干组实际值与预估值的差值作为所述临近单调区间内所述供暖回流温度和所述供暖流速的预估误差值;

根据所述临近单调区间内所述供暖回流温度和所述供暖流速的预估误差值分别得到所述供暖回流温度和所述供暖流速的预估误差值分布;

根据下一调整时刻的供暖回流温度以及供暖流速的期望值以及所述供暖回流温度和所述供暖流速的预估误差值分布得到下一调整时刻的供暖回流温度以及供暖流速的概率分布区间。

4.根据权利要求3所述的方法,其特征在于,所述根据所述临近单调区间内所述供暖回流温度和所述供暖流速的预估误差值分别得到所述供暖回流温度和所述供暖流速的预估误差值分布的步骤,包括,分别获取所述临近单调区间内所述供暖回流温度和所述供暖流速的预估误差值关于时间的关系;

分别获取所述临近单调区间内所述供暖回流温度和所述供暖流速的预估误差值关于时间的关系中上边界拟合函数和下边界拟合函数;

分别获取并保留所述临近单调区间内所述供暖回流温度和所述供暖流速的预估误差值中处于对应所述上边界拟合函数和所述下边界拟合函数之间的差值,其它的差值进行去除;

分别将所述临近单调区间内所述供暖回流温度和所述供暖流速的若干个预估误差值按照数值大小顺序编入误差序列表内;

分别计算所述供暖回流温度和所述供暖流速对应的误差序列表内相邻的所述预估误差值的均差值作为预估误差均差;

分别将所述供暖回流温度和所述供暖流速对应的误差序列表内与相邻的所述预估误差值大于对应所述预估误差均差的所述预估误差值进行剔除,得到所述供暖回流温度和所述供暖流速的若干个修正预估误差值;

分别计算所述供暖回流温度和所述供暖流速的若干个修正预估误差值的数值分布得到所述供暖回流温度和所述供暖流速的预估误差值分布。

5.根据权利要求1所述的方法,其特征在于,所述根据每个所述被动加热单元的热功率的历史记录以及下一调整时刻的目标总热功率的概率分布区间预估下一调整时刻所述主动加热单元的累计热功率的概率分布区间的步骤,包括,根据每个所述被动加热单元的热功率的历史记录预估每个所述被动加热单元在下一调整时刻的热功率的概率分布区间;

根据下一调整时刻的目标总热功率和每个所述被动加热单元的热功率的概率分布区间计算得到下一调整时刻所述主动加热单元的累计热功率的概率分布区间。

6.根据权利要求5所述的方法,其特征在于,所述根据每个所述被动加热单元的热功率的历史记录预估每个所述被动加热单元在下一调整时刻的热功率的概率分布区间的步骤,包括,所述被动加热单元为真空太阳能管;

根据每个所述被动加热单元的热功率的历史记录得到当前时刻所在白昼时段所述被动加热单元的热功率关于时间的拟合函数;

计算获取当前时刻所在白昼时段所述被动加热单元的热功率关于时间的拟合函数图像的上包络线作为无遮挡状态下当前时刻所在白昼时段所述被动加热单元的理想热功率关于时间的拟合函数;

根据无遮挡状态下当前时刻所在白昼时段所述被动加热单元的理想热功率关于时间的拟合函数计算得到所述被动加热单元在下一调整时刻的期望热功率;

根据当前时刻所在白昼时段所述被动加热单元的热功率关于时间的拟合函数以及理想热功率关于时间的拟合函数的差值得到当前时刻所在白昼时段的若干个遮阳时段下所述被动加热单元的热功率的损失值;

根据当前时刻所在白昼时段的若干个遮阳时段下所述被动加热单元的热功率的损失值计算得到不同热功率损失值的发生概率;

根据所述被动加热单元在下一调整时刻的期望热功率以及不同热功率损失值的发生概率计算得到所述被动加热单元在下一调整时刻的热功率的概率分布区间。

7.根据权利要求6所述的方法,其特征在于,所述根据当前时刻所在白昼时段的若干个遮阳时段下所述被动加热单元的热功率的损失值计算得到不同热功率损失值的发生概率的步骤,包括,在当前时刻所在白昼时段内,由当前时刻逐个向前追溯计算迄今为止的每个遮阳时段的时长的众数作为当前遮阳特征时长;

在每次计算得到当前遮阳特征时长时,判断当前时刻逐个向前追溯计算迄今为止的每个遮阳时段的时长是否均小于所述当前遮阳特征时长;

若是,则继续向前追溯计算所述当前遮阳特征时长;

若否,则将已经向前追溯的遮阳时段作为有效遮阳时段;

根据有效遮阳时段下所述被动加热单元的热功率的损失值的数值分布得到不同热功率损失值的发生概率。

8.根据权利要求1所述的方法,其特征在于,所述根据每个所述主动加热单元的热功率单价、最大热功率以及下一调整时刻所述主动加热单元的累计热功率的概率分布区间计算得到下一调整时刻每个所述主动加热单元的热功率的步骤,包括,根据下一调整时刻所述主动加热单元的累计热功率的概率分布区间得到下一调整时刻所述主动加热单元的累计热功率大于供暖目标的概率高于设定概率所需要的所述主动加热单元的累计热功率作为目标累计热功率;

根据每个所述主动加热单元的热功率单价由低至高得到每个所述主动加热单元的启用顺序;

根据每个所述主动加热单元的最大热功率,按照每个所述主动加热单元的启用顺序依次启动所述主动加热单元,使得启动的所述主动加热单元的累计热功率达到所述目标累计热功率,得到下一调整时刻每个所述主动加热单元的热功率。

9.一种多能互补集中供暖智能控制方法,其特征在于,包括,

获取主动加热单元的标识;

按照所述主动加热单元的标识查询接收权利要求1至8任一项所述的一种多能互补集中供暖智能控制方法中下一调整时刻所述主动加热单元对应的热功率;

在下一调节时刻按照对应的热功率调节所述主动加热单元。

10.一种多能互补集中供暖智能控制系统,其特征在于,包括,控制端,用于获取供暖目标温度;

在保持供暖压力的状态下,实时获取供暖回流温度以及供暖流速,并记录得到对应的历史记录;

根据所述供暖目标温度和供暖流速的历史记录预估间隔设定时长的下一调整时刻的目标总热功率的概率分布区间;

获取每个加热单元的热功率单价,其中,所述加热单元包括主动加热单元和被动加热单元,所述被动加热单元的启用优先级大于所述主动加热单元;

获取每个所述主动加热单元的最大热功率和调温响应延时;

获取每个所述被动加热单元的实时热功率,并汇总得到每个所述被动加热单元的热功率的历史记录;

根据每个所述被动加热单元的热功率的历史记录以及下一调整时刻的目标总热功率的概率分布区间预估下一调整时刻所述主动加热单元的累计热功率的概率分布区间;

根据每个所述主动加热单元的热功率单价、最大热功率以及下一调整时刻所述主动加热单元的累计热功率的概率分布区间计算得到下一调整时刻每个所述主动加热单元的热功率;

主动加热单元,用于获取所述主动加热单元的标识;

按下一调整时刻所述主动加热单元对应的热功率;

在下一调节时刻按照对应的热功率调节所述主动加热单元。

说明书 :

一种多能互补集中供暖智能控制系统及其方法

技术领域

[0001] 本发明属于节能控制技术领域,特别是涉及一种多能互补集中供暖智能控制系统及其方法。

背景技术

[0002] 在当今社会,供暖系统在生活中起着重要的作用。传统的集中供暖系统多采用燃气、燃油或电力作为主要的能源,这些能源不仅存有环境污染、资源耗尽等问题,同时在能源供应和调度管理上也面临诸多挑战。特别是在严冬季节,能源供应的稳定性和效率成为关注焦点。此外,传统的集中供暖系统在控制技术上也存在诸多不足,如能源利用率低、用户体验差等。
[0003] 随着可再生能源技术的发展,太阳能、风能、生物质能、地热能等多种形式的能源开始被用于集中供暖系统,它们具有环保、可再生等优点。然而,这些可再生能源的产生和提供受天气、地理位置等环境因素的影响大,且其间存在着较大的波动性和不确定性,影响用户的供暖体验。

发明内容

[0004] 本发明的目的在于提供一种多能互补集中供暖智能控制系统及其方法,通过对供暖和用暖进行双向预估,实现了对加热单元热功率的预判的分配,在保障供暖效果的同时降低了采暖成本。
[0005] 为解决上述技术问题,本发明是通过以下技术方案实现的:
[0006] 本发明提供。
[0007] 本发明还公开了一种多能互补集中供暖智能控制方法,包括,
[0008] 获取供暖目标温度;
[0009] 在保持供暖压力的状态下,实时获取供暖回流温度以及供暖流速,并记录得到对应的历史记录;
[0010] 根据所述供暖目标温度、供暖回流温度和供暖流速的历史记录预估间隔设定时长的下一调整时刻的目标总热功率的概率分布区间;
[0011] 获取每个加热单元的热功率单价,其中,所述加热单元包括主动加热单元和被动加热单元,所述被动加热单元的启用优先级大于所述主动加热单元;
[0012] 获取每个所述主动加热单元的最大热功率;
[0013] 获取每个所述被动加热单元的实时热功率,并汇总得到每个所述被动加热单元的热功率的历史记录;
[0014] 根据每个所述被动加热单元的热功率的历史记录以及下一调整时刻的目标总热功率的概率分布区间预估下一调整时刻所述主动加热单元的累计热功率的概率分布区间;
[0015] 根据每个所述主动加热单元的热功率单价、最大热功率以及下一调整时刻所述主动加热单元的累计热功率的概率分布区间计算得到下一调整时刻每个所述主动加热单元的热功率。
[0016] 本发明还公开了一种多能互补集中供暖智能控制方法,包括,
[0017] 获取主动加热单元的标识;
[0018] 按照所述主动加热单元的标识查询接收下一调整时刻所述主动加热单元对应的热功率;
[0019] 在下一调节时刻按照对应的热功率调节所述主动加热单元。
[0020] 本发明还公开了一种多能互补集中供暖智能控制系统,包括,
[0021] 控制端,用于获取供暖目标温度;
[0022] 在保持供暖压力的状态下,实时获取供暖回流温度以及供暖流速,并记录得到对应的历史记录;
[0023] 根据所述供暖目标温度和供暖流速的历史记录预估间隔设定时长的下一调整时刻的目标总热功率的概率分布区间;
[0024] 获取每个加热单元的热功率单价,其中,所述加热单元包括主动加热单元和被动加热单元,所述被动加热单元的启用优先级大于所述主动加热单元;
[0025] 获取每个所述主动加热单元的最大热功率和调温响应延时;
[0026] 获取每个所述被动加热单元的实时热功率,并汇总得到每个所述被动加热单元的热功率的历史记录;
[0027] 根据每个所述被动加热单元的热功率的历史记录以及下一调整时刻的目标总热功率的概率分布区间预估下一调整时刻所述主动加热单元的累计热功率的概率分布区间;
[0028] 根据每个所述主动加热单元的热功率单价、最大热功率以及下一调整时刻所述主动加热单元的累计热功率的概率分布区间计算得到下一调整时刻每个所述主动加热单元的热功率;
[0029] 主动加热单元,用于获取所述主动加热单元的标识;
[0030] 按下一调整时刻所述主动加热单元对应的热功率;
[0031] 在下一调节时刻按照对应的热功率调节所述主动加热单元。
[0032] 本发明通过双向预估方法,实现了对加热单元热功率的预测和分配,以降低采暖成本并确保供暖效果。在运行过程中,首先获取供暖目标温度并实时记录供暖回流温度和供暖流速的历史数据。之后根据历史记录预估下一调整时刻的目标总热功率的概率分布区间。同时获取加热单元的热功率单价。每个主动加热单元有最大热功率限制。记录并汇总每个被动加热单元的实时热功率,之后根据被动加热单元的历史记录和目标总热功率的概率分布区间,预估下一调整时刻主动加热单元的累计热功率的概率分布区间。最后结合主动加热单元的热功率单价、最大热功率和累计热功率的概率分布区间计算下一调整时刻每个主动加热单元的热功率。通过本发明有效控制供暖系统的热功率分配,实现供暖效果和采暖成本的优化。
[0033] 当然,实施本发明的任一产品并不一定需要同时达到以上所述的所有优点。

附图说明

[0034] 为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0035] 图1为本发明所述一种多能互补集中供暖智能控制系统于一实施例的功能单元和控制信号流向示意图;
[0036] 图2为本发明所述一种多能互补集中供暖智能控制系统于一实施例的步骤流程示意图;
[0037] 图3为本发明所述步骤S3于一实施例的步骤流程示意图;
[0038] 图4为本发明所述步骤S31于一实施例的步骤流程示意图;
[0039] 图5为本发明所述步骤S315于一实施例的步骤流程示意图;
[0040] 图6为本发明所述步骤S7于一实施例的步骤流程示意图;
[0041] 图7为本发明所述步骤S71于一实施例的步骤流程示意图;
[0042] 图8为本发明所述步骤S715于一实施例的步骤流程示意图;
[0043] 图9为本发明所述步骤S82于一实施例的步骤流程示意图;
[0044] 附图中,各标号所代表的部件列表如下:
[0045] 1‑控制端,2‑加热单元。

具体实施方式

[0046] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
[0047] 热力站再对分散的用户进行供暖时通常使用燃煤、燃气、热泵等方式加热供暖介质,供暖介质可以是蒸汽、水等流体。在保持供暖主管道压力稳定的前提下保持主管道内的供暖介质达到供暖目标温度,这就需要对回流的供暖介质进行加热。但是不同的加热方式的调整方式不同,调整滞后时长也不同,价格也不同。供暖方式可以分为被动和主动两种方式,被动取暖方式包括太阳能加热取暖,也就是通过太阳能真空管进行日晒加热,但是其具有不确定性,需要对其进行预估计算。
[0048] 主动取暖方式包括多种,例如燃煤供热的价格最便宜,但需要对锅炉的供煤量进行调整,燃煤锅炉内的剩余煤量难以及时调整,这就导致燃煤锅炉的热功率调节之后时间较长,无法对热功率进行及时调整。燃气锅炉供暖的成本适中,其热功率调节只需要调节燃气供气量即可实现动态调节。热泵的启动速度慢,调节响应速度也较慢,但是比燃煤供热的响应速度快,在不同室外温度环境下的供热经济性能不同,需要结合电价、环境温度、制热功耗比等因素进行具体综合计算。
[0049] 与此同时,由于用户取暖保温条件不同以及环境温度湿度的多变,用户端散热功率以及输送热损耗功率也是变动的,也需要对其进行预估计算。
[0050] 为了在及时响应供暖需求的同时尽量降低供暖价格,本发明提供以下方案。
[0051] 请参阅图1至2所示,本发明提供了一种多能互补集中供暖智能控制系统,包括了控制端1和加热单元,其中加热单元包括主动加热单元2和被动加热单元。在具体实施过程中,首先由控制端1执行步骤S1获取供暖目标温度,供暖目标温度通常是由供热公司与用户或者下级供热经销商签订的温度。在供热管网运行的过程中,需要在保持供暖压力,这也是由供热公司与用户或者下级供热经销商签订的。接下来可以执行步骤S2实时获取供暖回流温度以及供暖流速,并记录得到对应的历史记录。接下来可以执行步骤S3根据供暖目标温度和供暖流速的历史记录预估间隔设定时长的下一调整时刻的目标总热功率的概率分布区间。也就是对未来的供热目标总热功率进行预估。
[0052] 在本方案中加热单元包括主动加热单元和被动加热单元,被动加热单元不需要能耗或几乎不需要能耗即可以实现加热供暖,例如太阳能,因此从节能的角度考虑,被动加热单元的启用优先级大于主动加热单元。之后可以执行步骤S4获取每个加热单元的热功率单价,接下来可以执行步骤S5获取每个主动加热单元的最大热功率和调温响应延时。接下来可以执行步骤S6获取每个被动加热单元的实时热功率,并汇总得到每个被动加热单元的热功率的历史记录。接下来可以执行步骤S7根据每个被动加热单元的热功率的历史记录以及下一调整时刻的目标总热功率的概率分布区间预估下一调整时刻主动加热单元的累计热功率的概率分布区间。最后可以执行步骤S8根据每个主动加热单元的热功率单价、最大热功率以及下一调整时刻主动加热单元的累计热功率的概率分布区间计算得到下一调整时刻每个主动加热单元的热功率。
[0053] 在计算得到下一调整时刻每个主动加热单元的热功率之后,由主动加热单元2的视角来解释本方案,首先主动加热单元2可以执行步骤S01获取主动加热单元的标识,接下来可以执行步骤S02按下一调整时刻主动加热单元对应的热功率,最后可以执行步骤S03在下一调节时刻按照对应的热功率调节主动加热单元。
[0054] 以上步骤在实施的过程中,记录历史数据并预估下一调整时刻的目标热功率概率分布区间。同时获取加热单元的热功率单价,优先考虑被动单元。根据实时热功率和目标概率分布区间预估主动单元的累计热功率概率分布区间。结合单价、最大功率和累计功率概率分布区间,计算下一调整时刻主动单元的热功率。从而达到优化供暖系统热功率分配,降低供暖成本的技术效果。
[0055] 为了对上述的步骤S1至步骤S8的实施过程进行补充说明,提供部分功能模块的源代码,并在注释部分进行对照解释说明。为了符合相关法律法规对暖通工程和市政设施的数据安全要求,对不影响方案实施的部分数据进行脱敏处理,下同。
[0056] #include
[0057] #include
[0058] // 预测算法的接口
[0059] #include "prediction_algorithm.h"
[0060] // 获取和控制硬件的接口
[0061] #include "hardware_interface.h"
[0062] // 定义加热单元的类
[0063] class HeatingUnit {
[0064] public:
[0065]  double powerUnitPrice; // 热功率单价
[0066]  double maxPower;       // 最大热功率
[0067]  std::vectorpowerHistory; // 热功率历史记录
[0068] };
[0069] // 定义主动和被动加热单元
[0070] std::vectoractiveUnits;
[0071] std::vectorpassiveUnits;
[0072] int main() {
[0073]  // 获取目标温度
[0074]   double targetTemperature = getTargetTemperature();
[0075]  // 在保持供暖压力的状态下,获取并记录供暖回流温度和供暖流速的历史记录[0076]   std::vectorreturnTemperatures, flowSpeeds;
[0077]   while(shouldMaintainPressure()) {
[0078]     returnTemperatures.push_back(getReturnTemperature());
[0079]     flowSpeeds.push_back(getFlowSpeed());
[0080]   }
[0081]  // 预测下一调整时刻的目标总热功率的概率分布区间
[0082]    std::pairpredictedTotalPowerInterval  = predictTotalPower(targetTemperature, returnTemperatures, flowSpeeds);
[0083]  // 获取每个加热单元的热功率单价和最大热功率,并记录被动加热单元的热功率的历史记录
[0084]   for (auto&unit : activeUnits) {
[0085]     unit.powerUnitPrice = getPowerUnitPrice(unit);
[0086]     unit.maxPower = getMaxPower(unit);
[0087]   }
[0088]   for (auto&unit : passiveUnits) {
[0089]     unit.powerUnitPrice = getPowerUnitPrice(unit);
[0090]     unit.powerHistory.push_back(getRealTimePower(unit));
[0091]   }
[0092]  // 预测下一调整时刻主动加热单元的累计热功率的概率分布区间[0093]    std::pairpredictedActivePowerInterval  = predictActivePower(passiveUnits, predictedTotalPowerInterval);
[0094]  // 根据每个主动加热单元的热功率单价、最大热功率以及下一调整时刻主动加热单元的累计热功率的概率分布区间,计算得到下一调整时刻每个主动加热单元的热功率[0095]   for (auto&unit : activeUnits) {
[0096]      unit.maxPower  =  calculateNextActivePower(unit, predictedActivePowerInterval);
[0097]   }
[0098]   return 0;
[0099] }
[0100] 这段代码描述了一个采暖系统的流程。首先,获取供暖的目标温度,然后在保持供暖压力的状态下,获取并记录供暖回流温度和供暖流速的历史记录。接着,预测下一调整时刻的目标总热功率的概率分布区间。然后,获取每个加热单元(包括主动和被动加热单元)的热功率单价和最大热功率,并记录被动加热单元的热功率的历史记录。基于被动加热单元的热功率历史记录和预测的总热功率区间,预测下一调整时刻主动加热单元的累计热功率的概率分布区间。最后,根据每个主动加热单元的热功率单价、最大热功率和预测的热功率区间,计算下一调整时刻每个主动加热单元的热功率。
[0101] 请参阅图3所示,为了计算预估下一调整时刻的目标总热功率的概率分布区间,上述的步骤S3在具体实施的过程中首先可以执行步骤S31根据供暖回流温度和供暖流速的历史记录预估间隔设定时长的下一调整时刻的供暖回流温度以及供暖流速的概率分布区间。之后可以执行步骤S32根据供暖目标温度、下一调整时刻的供暖回流温度以及供暖流速的概率分布区间计算得到下一调整时刻的目标总热功率的概率分布区间。在具体实施中步骤S32可以通过以下步骤:
[0102] 已知供暖目标温度Ttarget。
[0103] 已知下一调整时刻的供暖回流温度Tnext和流速v的概率分布区间。
[0104] 例如,将Tnext的全区间等分为10个子区间,v的区间等分为5个子区间。
[0105] 计算每个Tnext区间和v区间的联合概率分布。
[0106] 由于Tnext和v独立,则每个子区间的联合概率approximation为各区间概率的乘积。
[0107] 对每个联合区间,计算对应的目标热功率:
[0108] Qtarget = ρcpv(Ttarget ‑ Tnext) xA
[0109] 其中ρ为水密度,cp为比热容,A为管道截面积。
[0110] 利用联合概率,可以得到下一时刻目标热功率Qtarget的概率分布区间。
[0111] 例如,Tnext在(40°C,50°C),v在(2m/s,3m/s)区间内,对应的Qtarget区间为(500kW,800kW),概率为0.1。
[0112] 综合所有区间的结果,即可得到下一调整时刻目标热功率的概率分布区间。
[0113] 为了对上述步骤的实施过程进行补充说明,提供部分功能模块的源代码,并在注释部分进行对照解释说明。
[0114] // 引入预测算法的接口
[0115] #include "prediction_algorithm.h"
[0116] std::pairpredictNextTotalPower(std::vector&targetTemperatures, std::vector&returnTemperatures, std::vector&flowSpeeds) {
[0117]  // 根据供暖回流温度和供暖流速的历史记录预估间隔设定时长的下一调整时刻的供暖回流温度以及供暖流速的概率分布区间
[0118]   std::pairnextReturnTemperatureInterval  = predictReturnTemperature(returnTemperatures);
[0119]   std::pairnextFlowSpeedInterval = predictFlowSpeed(flowSpeeds);
[0120]  // 根据供暖目标温度、下一调整时刻的供暖回流温度以及供暖流速的概率分布区间计算得到下一调整时刻的目标总热功率的概率分布区间
[0121]    std::pairnextTotalPowerInterval  = calculateTotalPower(targetTemperatures, nextReturnTemperatureInterval, nextFlowSpeedInterval);
[0122]   return nextTotalPowerInterval;
[0123] }
[0124] 请参阅图4所示,为了具体实现对下一调整时刻的供暖回流温度以及供暖流速的预估,上述的步骤S31在具体实施的过程中首先可以执行步骤S311根据供暖回流温度和供暖流速的历史记录得到供暖回流温度和供暖流速关于时间的拟合函数。接下来可以执行步骤S312分别获取供暖回流温度和供暖流速关于时间的拟合函数中当前时刻所在的单调区间作为临近单调区间。接下来可以执行步骤S313分别根据临近单调区间内供暖回流温度和供暖流速关于时间的拟合函数得到下一调整时刻的供暖回流温度以及供暖流速的期望值。接下来可以执行步骤S314分别计算临近单调区间内供暖回流温度和供暖流速的若干组实际值与预估值的差值作为临近单调区间内供暖回流温度和供暖流速的预估误差值。接下来可以执行步骤S315根据临近单调区间内供暖回流温度和供暖流速的预估误差值分别得到供暖回流温度和供暖流速的预估误差值分布。接下来可以执行步骤S316根据下一调整时刻的供暖回流温度以及供暖流速的期望值以及供暖回流温度和供暖流速的预估误差值分布得到下一调整时刻的供暖回流温度以及供暖流速的概率分布区间。
[0125] 为了对上述步骤的实施过程进行补充说明,提供部分功能模块的源代码,并在注释部分进行对照解释说明。
[0126] #include
[0127] #include
[0128] #include
[0129] // 结构体,用于保存温度和流速的历史记录
[0130] struct DataRecord {
[0131]     double time;
[0132]     double temperature;
[0133]     double speed;
[0134] };
[0135] // 用于保存预估误差值的结构体
[0136] struct EstimationError {
[0137]     double temperatureError;
[0138]     double speedError;
[0139] };
[0140] // 计算预估误差值
[0141] EstimationError CalculateEstimationError(const std::vector&dataRecords) {
[0142]    // 根据历史记录计算拟合函数,并获取临近单调区间,这部分已经处理完毕[0143]     auto fitFunction = [](double time){ return DataRecord{time, 0.0, 0.0}; };
[0144]    // 计算下一调整时刻的期望值
[0145]     DataRecord expectedValue = fitFunction(dataRecords.back().time + 1);
[0146]    // 计算预估误差值
[0147]     EstimationError estimationError;
[0148]     for (const auto&record : dataRecords) {
[0149]         DataRecord estimatedValue = fitFunction(record.time);
[0150]          estimationError.temperatureError  +=  std::abs(record.temperature ‑ estimatedValue.temperature);
[0151]         estimationError.speedError += std::abs(record.speed ‑ estimatedValue.speed);
[0152]     }
[0153]     estimationError.temperatureError /= dataRecords.size();
[0154]     estimationError.speedError /= dataRecords.size();
[0155]     return estimationError;
[0156] }
[0157] // 计算下一调整时刻的概率分布区间
[0158] void CalculateNextAdjustmentInterval(const std::vector&dataRecords) {
[0159]    // 计算预估误差值
[0160]     EstimationError estimationError = CalculateEstimationError(dataRecords);
[0161]    // 根据预估误差值分布得到下一调整时刻的概率分布区间
[0162]    // 这里仅给出一个示例,具体的实现需要使用专门的统计或数据分析库[0163]    double nextTemperatureInterval = estimationError.temperatureError; // 供暖回流温度的概率分布区间
[0164]    double nextSpeedInterval = estimationError.speedError; // 供暖流速的概率分布区间
[0165]    // 输出下一调整时刻的概率分布区间
[0166]     std::cout<<"下一调整时刻的供暖回流温度的概率分布区间:"<
[0167]     std::cout<<"下一调整时刻的供暖流速的概率分布区间:"<
[0168] }
[0169] 这段代码首先定义了一个用于保存供暖回流温度和供暖流速的历史记录的结构体,并定义了一个用于保存预估误差值的结构体。然后计算了下一调整时刻的期望值和预估误差值,并根据预估误差值得到下一调整时刻的概率分布区间。最后它输出了下一调整时刻的概率分布区间。
[0170] 这段代码的主要目的是根据供暖回流温度和供暖流速的历史记录,预估下一调整时刻的供暖回流温度和供暖流速的概率分布区间。在这个过程中使用了一些简单的数学和统计方法,如拟合函数、计算平均值和概率分布区间等。
[0171] 请参阅图5所示,由于在临近单调区间内环境温度及用户使用习惯是相似或相同的,这就使得供暖回流温度和供暖流速的预估误差值应该在在一定的范围内浮动,据此可以实现对异常值的剔除。具体而言,上述的步骤S315在具体实施的过程中首先可以执行步骤S3151分明获取临近单调区间内供暖回流温度和供暖流速的预估误差值关于时间的关系。接下来可以执行步骤S3152分别获取临近单调区间内供暖回流温度和供暖流速的预估误差值关于时间的关系中上边界拟合函数和下边界拟合函数。接下来可以执行步骤S3153分别获取并保留临近单调区间内供暖回流温度和供暖流速的预估误差值中处于对应上边界拟合函数和下边界拟合函数之间的差值,其它的差值进行去除。接下来可以执行步骤S3154分别将临近单调区间内供暖回流温度和供暖流速的若干个预估误差值按照数值大小顺序编入误差序列表内。接下来可以执行步骤S3155分别计算供暖回流温度和供暖流速对应的误差序列表内相邻的预估误差值的均差值作为预估误差均差。接下来可以执行步骤S3156分别将供暖回流温度和供暖流速对应的误差序列表内与相邻的预估误差值大于对应预估误差均差的预估误差值进行剔除,得到供暖回流温度和供暖流速的若干个修正预估误差值。在完成异常数据的剔除之后可以执行步骤S3157分别计算供暖回流温度和供暖流速的若干个修正预估误差值的数值分布得到供暖回流温度和供暖流速的预估误差值分布。
[0172] 为了对上述步骤的实施过程进行补充说明,提供部分功能模块的源代码,并在注释部分进行对照解释说明。
[0173] #include
[0174] #include
[0175] #include
[0176] // 误差值和时间的结构体
[0177] struct ErrorData {
[0178]     double time;
[0179]     double errorValue;
[0180] };
[0181] // 计算预估误差值分布
[0182] std::vectorCalculateEstimationErrorDistribution(const std::vector&errorData) {
[0183]    // 上下边界拟合函数已存在
[0184]     auto upperFitFunction = [](double time){ return 0.0; };
[0185]     auto lowerFitFunction = [](double time){ return 0.0; };
[0186]    // 保留在上下边界拟合函数之间的误差值
[0187]     std::vectorretainedData;
[0188]     for (const auto&data : errorData) {
[0189]         double upper = upperFitFunction(data.time);
[0190]         double lower = lowerFitFunction(data.time);
[0191]         if (data.errorValue>= lower&&data.errorValue<= upper) {[0192]             retainedData.push_back(data);
[0193]         }
[0194]     }
[0195]    // 按照误差值大小排序
[0196]     std::sort(retainedData.begin(), retainedData.end(), [](const ErrorData&a, const ErrorData&b) {
[0197]         return a.errorValue
[0198]     });
[0199]    // 计算相邻误差值的均差值
[0200]     std::vectordiff(retainedData.size() ‑ 1);
[0201]     for (size_t i = 0; i
[0203]     }
[0204]     double avgDiff = std::accumulate(diff.begin(), diff.end(), 0.0) / diff.size();
[0205]    // 剔除大于均差值的误差值
[0206]     std::vectorretainedErrors;
[0207]     for (size_t i = 0; i
[0209]             retainedErrors.push_back(retainedData[i].errorValue);
[0210]         }
[0211]     }
[0212]     return retainedErrors;
[0213] }
[0214] 这段代码首先保留了在上下边界拟合函数之间的误差值,然后按照误差值大小排序。接着计算相邻误差值的均差值,并剔除了大于均差值的误差值。最后返回的结果就是供暖回流温度和供暖流速的修正预估误差值分布。
[0215] 请参阅图6所示,由于太阳能真空管等被动加热单元受环境影响较大,因此需要对其热功率进行预估。具体而言,上述的步骤S7在具体实施的过程首先可以执行步骤S71根据每个被动加热单元的热功率的历史记录预估每个被动加热单元在下一调整时刻的热功率的概率分布区间。最后可以执行步骤S72根据下一调整时刻的目标总热功率和每个被动加热单元的热功率的概率分布区间计算得到下一调整时刻主动加热单元的累计热功率的概率分布区间。
[0216] 为了对上述步骤的实施过程进行补充说明,提供部分功能模块的源代码,并在注释部分进行对照解释说明。
[0217] #include
[0218] #include "estimate_distribution.h"
[0219] #include "calculate_cumulative_heat_power_distribution.h"[0220] // 热功率分布预估和累计热功率计算
[0221] std::vectorcalculateNextHeatPowerDistribution(std::vector&targetTotalHeatPower,  std::vector>&passiveUnitHistories) {
[0222]     std::vector>passiveUnitDistributions;
[0223]    // 根据每个被动加热单元的热功率的历史记录预估每个被动加热单元在下一调整时刻的热功率的概率分布区间
[0224]     for(auto&history : passiveUnitHistories) {
[0225]         auto distribution = estimateDistribution(history);
[0226]         passiveUnitDistributions.push_back(distribution);
[0227]     }
[0228]    // 根据下一调整时刻的目标总热功率和每个被动加热单元的热功率的概率分布区间计算得到下一调整时刻主动加热单元的累计热功率的概率分布区间[0229]     auto cumulativeHeatPowerDistribution = calculateCumulativeHeatPowerDistribution(targetTotalHeatPower, passiveUnitDistributions);
[0230]     return cumulativeHeatPowerDistribution;
[0231] }
[0232] 请参阅图7所示,在被动加热单元为真空太阳能管的前提下,真空太阳能管和日照角度和云层遮挡状态具有直接关系。在常见的偶有云层遮挡的天气环境下,首先可以执行步骤S711根据每个被动加热单元的热功率的历史记录得到当前时刻所在白昼时段被动加热单元的热功率关于时间的拟合函数。接下来可以执行步骤S712计算获取当前时刻所在白昼时段被动加热单元的热功率关于时间的拟合函数图像的上包络线作为无遮挡状态下当前时刻所在白昼时段被动加热单元的理想热功率关于时间的拟合函数。接下来可以执行步骤S713根据无遮挡状态下当前时刻所在白昼时段被动加热单元的理想热功率关于时间的拟合函数计算得到被动加热单元在下一调整时刻的期望热功率。接下来可以执行步骤S714根据当前时刻所在白昼时段被动加热单元的热功率关于时间的拟合函数以及理想热功率关于时间的拟合函数的差值得到当前时刻所在白昼时段的若干个遮阳时段下被动加热单元的热功率的损失值。接下来可以执行步骤S715根据当前时刻所在白昼时段的若干个遮阳时段下被动加热单元的热功率的损失值计算得到不同热功率损失值的发生概率。最后可以执行步骤S716根据被动加热单元在下一调整时刻的期望热功率以及不同热功率损失值的发生概率计算得到被动加热单元在下一调整时刻的热功率的概率分布区间。
[0233] 为了对上述步骤的实施过程进行补充说明,提供部分功能模块的源代码,并在注释部分进行对照解释说明。
[0234] #include
[0235] #include
[0236] // 假设被动加热单元的热功率的历史记录存储在一个二维向量中,每个元素是一个二元组,表示一个时刻和对应的热功率
[0237] typedef std::pairTimeHeatPair;
[0238] // 假设我们已经有了一个名为calculateUpperEnvelope的函数,它可以计算一组点的上包络线,并返回一个拟合函数
[0239] Eigen::VectorXd calculateUpperEnvelope(const std::vector&data);
[0240] // 假设我们已经有了一个名为calculateProbabilityDistribution的函数,它可以计算损失值的概率分布
[0241] Eigen::VectorXd calculateProbabilityDistribution(const std::vector&losses);
[0242] void calculateNextHeatPower(const std::vector&history) {
[0243]    // 根据每个被动加热单元的热功率的历史记录得到当前时刻所在白昼时段被动加热单元的热功率关于时间的拟合函数
[0244]     Eigen::VectorXd fitFunction = calculateFitFunction(history);
[0245]    // 计算获取当前时刻所在白昼时段被动加热单元的热功率关于时间的拟合函数图像的上包络线作为无遮挡状态下当前时刻所在白昼时段被动加热单元的理想热功率关于时间的拟合函数
[0246]     Eigen::VectorXd idealFitFunction = calculateUpperEnvelope(history);
[0247]    // 计算下一调整时刻的期望热功率和损失值
[0248]     double nextExpectedHeatPower = calculateNextExpectedHeatPower(idealFitFunction);
[0249]     std::vectorlosses = calculateLosses(fitFunction, idealFitFunction);
[0250]    // 计算损失值的概率分布
[0251]     Eigen::VectorXd lossProbDistribution = calculateProbabilityDistribution(losses);
[0252]    // 根据期望热功率和损失值的概率分布计算下一调整时刻的热功率的概率分布
[0253]     Eigen::VectorXd nextHeatPowerProbDistribution = calculateNextHeatPowerProbDistribution(nextExpectedHeatPower, lossProbDistribution);
[0254] }
[0255] 以上代码中,首先使用calculateFitFunction函数根据历史热功率数据得到当前时刻所在白昼时段被动加热单元的热功率关于时间的拟合函数,然后计算出理想热功率的拟合函数。接着使用calculateNextExpectedHeatPower和calculateLosses函数计算下一调整时刻的期望热功率和损失值。最后,使用calculateProbabilityDistribution和calculateNextHeatPowerProbDistribution函数根据期望热功率和损失值的概率分布计算下一调整时刻的热功率的概率分布。
[0256] 请参阅图8所示,由于全天的天气并不都是均一的,比如当前时刻是下午,上午的云层较为密集,因此遮阳状态较多,午后的云层可能较为稀疏,遮阳状态较少,遮阳就不能使用上午的遮阳时段预估下午当前时刻的热功率损失值状态。具体而言,在当前时刻所在白昼时段内,上述的步骤S715在具体实施的过程中首先可以执行步骤S7151由当前时刻逐个向前追溯计算迄今为止的每个遮阳时段的时长的众数作为当前遮阳特征时长。
[0257] 接下来可以执行步骤S7152在每次计算得到当前遮阳特征时长时判断当前时刻逐个向前追溯计算迄今为止的每个遮阳时段的时长是否均小于当前遮阳特征时长。若是则接下来可以返回执行步骤S7152继续向前追溯计算当前遮阳特征时长。若否则接下来可以执行步骤S7153将已经向前追溯的遮阳时段作为有效遮阳时段。最后可以执行步骤S7154根据有效遮阳时段下被动加热单元的热功率的损失值的数值分布得到不同热功率损失值的发生概率。
[0258] 为了对上述步骤的实施过程进行补充说明,提供部分功能模块的源代码,并在注释部分进行对照解释说明。
[0259] #include
[0260] #include "calculate_mode.h"
[0261] #include "calculate_loss_values.h"
[0262] #include "calculate_loss_probabilities.h"
[0263] // 计算不同热功率损失值的发生概率
[0264] std::vectorcalculateHeatPowerLossProbabilities(std::vector&shadowPeriods, std::vector&heatPowerLossValues) {[0265]     std::vectorvalidShadowPeriods;
[0266]     std::vectorlossProbabilities;
[0267]     while (!shadowPeriods.empty()) {
[0268]        // 在当前时刻所在白昼时段内,由当前时刻逐个向前追溯计算迄今为止的每个遮阳时段的时长的众数作为当前遮阳特征时长
[0269]          double currentShadowFeatureLength  = calculateMode(shadowPeriods);
[0270]         bool allLessThanFeatureLength = true;
[0271]         for (auto&period : shadowPeriods) {
[0272]             if (period>= currentShadowFeatureLength) {
[0273]                 allLessThanFeatureLength = false;
[0274]                 break;
[0275]             }
[0276]         }
[0277]        // 若否,则将已经向前追溯的遮阳时段作为有效遮阳时段;
[0278]         if (!allLessThanFeatureLength) {
[0279]             validShadowPeriods = shadowPeriods;
[0280]             break;
[0281]         }
[0282]        // 若是,则继续向前追溯计算当前遮阳特征时长;
[0283]         shadowPeriods.pop_back();
[0284]     }
[0285]    // 根据有效遮阳时段下被动加热单元的热功率的损失值的数值分布得到不同热功率损失值的发生概率
[0286]     if (!validShadowPeriods.empty()) {
[0287]         auto lossValues = calculateLossValues(validShadowPeriods, heatPowerLossValues);
[0288]         lossProbabilities = calculateLossProbabilities(lossValues);
[0289]     }
[0290]     return lossProbabilities;
[0291] }
[0292] 这个函数首先计算每个遮阳时段的时长的众数,并将这个众数作为当前的遮阳特征时长。然后,函数检查每个遮阳时段的时长是否都小于这个特征时长。如果所有的时长都小于特征时长,函数继续向前追溯并更新特征时长。否则,已经追溯的遮阳时段被认为是有效的,函数将基于这些有效时段计算热功率损失值的分布,并进一步计算出不同热功率损失值的发生概率。
[0293] 请参阅图9所示,为了对不同主动加热单元进行规划以达到节省加热费用的技术目的,上述的步骤S81在具体实施的过程中首先可以执行步骤S81根据下一调整时刻主动加热单元的累计热功率的概率分布区间得到下一调整时刻主动加热单元的累计热功率大于供暖目标的概率高于设定概率所需要的主动加热单元的累计热功率作为目标累计热功率。接下来可以执行步骤S82根据每个主动加热单元的热功率单价由低至高得到每个主动加热单元的启用顺序。最后可以执行步骤S83根据每个主动加热单元的最大热功率,按照每个主动加热单元的启用顺序依次启动主动加热单元,使得启动的主动加热单元的累计热功率达到目标累计热功率,得到下一调整时刻每个主动加热单元的热功率。
[0294] 为了对上述步骤的实施过程进行补充说明,提供部分功能模块的源代码,并在注释部分进行对照解释说明。
[0295] #include
[0296] #include
[0297] struct ActiveHeatingUnit {
[0298]     double heatPowerPrice;
[0299]     double maxHeatPower;
[0300]     double nextHeatPower;
[0301] };
[0302] // 计算下一调整时刻每个主动加热单元的热功率
[0303] void calculateNextHeatPower(std::vector&units, double cumulativeHeatPowerProb) {
[0304]    // 根据下一调整时刻主动加热单元的累计热功率的概率分布区间得到下一调整时刻主动加热单元的累计热功率大于供暖目标的概率高于设定概率所需要的主动加热单元的累计热功率作为目标累计热功率
[0305]     double  targetCumulativeHeatPower = getTargetHeatPower(cumulativeHeatPowerProb);
[0306]    // 根据每个主动加热单元的热功率单价由低至高得到每个主动加热单元的启用顺序
[0307]      std::sort(units.begin(),  units.end(),  [ ](const ActiveHeatingUnit&a, const ActiveHeatingUnit&b) {
[0308]         return a.heatPowerPrice
[0309]     });
[0310]     double currentCumulativeHeatPower = 0;
[0311]    // 根据每个主动加热单元的最大热功率,按照每个主动加热单元的启用顺序依次启动主动加热单元,使得启动的主动加热单元的累计热功率达到目标累计热功率[0312]     for (auto&unit : units) {
[0313]         if (currentCumulativeHeatPower + unit.maxHeatPower<= targetCumulativeHeatPower) {
[0314]             unit.nextHeatPower = unit.maxHeatPower;
[0315]             currentCumulativeHeatPower += unit.maxHeatPower;
[0316]         } else {
[0317]             unit.nextHeatPower = targetCumulativeHeatPower ‑ currentCumulativeHeatPower;
[0318]             break;
[0319]         }
[0320]     }
[0321] }
[0322] 在这段代码中,首先通过 getTargetHeatPower 函数计算目标累计热功率。然后按照主动加热单元的热功率单价对其进行排序,从而确定启动顺序。最后,按照这个顺序依次启动主动加热单元,使得其累计热功率达到目标累计热功率。如果累计热功率已经达到目标值,但还有主动加热单元没有启动,这些单元在下一调整时刻的热功率将被设为0。
[0323] 综上所述,本方案同时预估供暖和用暖两端,实现对热负荷的准确预估,避免热能浪费。在实施的过程中首先通过记录供暖目标温度、回流温度和流速的历史数据,预估下一调整时刻的目标总热功率概率分布区间。获取加热单元的热功率单价。之后记录并汇总被动单元的实时热功率,预估下一调整时刻主动单元的累计热功率概率分布区间。最后根据热功率单价、最大功率和累计功率概率分布区间计算下一调整时刻主动单元的热功率。优化供暖系统热功率分配,达到优化供暖效果和降低采暖成本的目标。
[0324] 附图中的流程图和框图显示了根据本申请的多个实施例的装置、系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。
[0325] 也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行相应的功能或动作的硬件,例如电路或ASIC(专用集成电路,Application Specific Integrated Circuit)来实现,或者可以用硬件和软件的组合,如固件等来实现。
[0326] 尽管在此结合各实施例对本发明进行了描述,然而,在实施所要求保护的本发明过程中,本领域技术人员通过查看所述附图、公开内容、以及所附权利要求书,可理解并实现所述公开实施例的其它变化。在权利要求中,“包括”(comprising)一词不排除其他组成部分或步骤,“一”或“一个”不排除多个的情况。单个处理器或其它单元可以实现权利要求中列举的若干项功能。相互不同的从属权利要求中记载了某些措施,但这并不表示这些措施不能组合起来产生良好的效果。
[0327] 以上已经描述了本申请的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。