实现论文
《采用模糊逻辑理论的覆冰厚度预测模型》-文章编号:1003-6520(2011)05-1245-08
链接:https://pan.baidu.com/s/1scdDvKvUviEVEeQC8fweRg
提取码:k38b
实验目的
输电线路覆冰常会引起线路的导线舞动 、跳闸 、 断线 、绝缘子闪络、倒塔和通讯中断等事故, 严重影 响电力系统的正常运行。冰雪灾害已成为许多国家
的电网面临的共同问题 。美国 、加拿大、俄罗斯、法 国、冰岛和日本等都曾发生严重冰雪事故。我国也 是世界上输电线路覆冰最为严重的国家之一, 2008 年初我国南方部分地区遭受了历史罕见的持续低温 雨雪冰冻灾害, 输电线路发生大面积倒杆(塔)、断线(串)事故[ 1-4] 。针对国内外覆冰灾害情况 ,为了减少 输电线路覆冰事故的发生 ,有效保障电力系统安全 运行,在加强覆冰在线监测系统研究的同时,还应注 重加强建立覆冰预测模型的研究 。 模糊逻辑方法具有多因素综合分析的特点 ,适 合对受多种因素影响的具有不确定性结论的事物或 现象作出总的评价 。输电线路覆冰的发生具有明显 的模糊性和不确定性, 因此, 如何解决模糊性 、不确
定性影响问题是覆冰预测方法面临的关键问题[ 5-8] 。 为此,本文根据贵州电网的现场覆冰监测数据, 探讨 并建立了基于模糊逻辑的覆冰厚度预测模型。
基本思路
模糊理论是美国柏克莱加州大学电气工程系 Zadeh 教授于 1965 年创立的模糊集合理论的基础上发展起来的。模糊逻辑是一种连续逻辑 , 是 二值逻辑的扩展 。模糊逻辑有着更加普遍的实际意 义,摈弃了二值逻辑简单的肯定或否定 ,把客观逻辑 世界看成是具有连续灰度等级变化的, 它允许一个 命题亦此亦彼, 存在着部分肯定和部分否定, 只不过 是隶属程度不同而已, 这就为计算机模仿人的思维 方式来处理普遍存在的语言信息提供了可能[ 17-18] 。 模糊逻辑模型通常包括输入量模糊化、数据库 、 规则库、推理机和输出量反模糊化等 5 部分。组成
结构图如图 2 所示 ,本论文的覆冰模糊逻辑模型为 四输入一输出模型。模糊逻辑模型在输入和输出之 间起着非线性映射作用, 其输入和输出都是确定的 实数值 ,而不是模糊集合。模糊化是指将输入转换 为模糊集合,即将实测物理量转化为在该语言变量 相应论域内不同语言值的模糊子集 ,对于模糊逻辑 模型的多个输入 ,每个输入量的模糊化过程都是一 样的 ,进行模糊推理的前提是输入都必须通过模糊 化处理。因此, 模糊化即为模糊逻辑模型的输入接
口,作用就是将确定的实数输入量转换为模糊量, 即 模糊集合及其相应的隶属度。推理机使用数据库和规则库产生模糊结论(即蕴涵模糊集合)。反模糊化 则将模糊结论转换为确定实数输出, 即将推理机得 到的模糊量转化为一个清晰确定的值 。
基本流程
1)语言变量
2)论域分割
3)隶属函数的确定
4)隶属度函数的选择
5)模糊规则库的建立
6)模糊推理
7)解模糊化
代码实现
#传入et参数得到相应隶属度
def ET(x):
data={'nb':0,'ns':0,'o':0,'ps':0,'pb':0}
if -20 <= x <= -10 :
data['nb']=(-1/10)*x-1
data['ns']=(1/10)*x+2
elif -10< x <= 0:
data['ns']=(-1/10)*x
data['o']=(1/10)*x+1
elif 0 < x <= 10:
data['o']=(-1/10)*x+1
data['ps']=(1/10)*x
else:
data['ps']=(-1/10)*x+2
data['pb']=(1/10)*x-1
return data
#传入eh参数得到相应隶属度
def EH(x):
data={'nb':0,'ns':0,'o':0,'ps':0,'pb':0}
if 0 <= x <= 25 :
data['nb']=(-1/25)*x+1
data['ns']=(1/25)*x
elif 25< x <= 50:
data['ns']=(-1/25)*x+2
data['o']=(1/25)*x-1
elif 50 < x <= 75:
data['o']=(-1/25)*x+3
data['ps']=(1/25)*x-2
else:
data['ps']=(-1/25)*x+4
data['pb']=(1/25)*x-3
return data
#传入ew参数得到相应隶属度
def EW(x):
data={'nb':0,'ns':0,'o':0,'ps':0,'pb':0}
if 0 <= x <= 5 :
data['nb']=(-1/5)*x+1
data['ns']=(1/5)*x
elif 5< x <= 10:
data['ns']=(-1/5)*x+2
data['o']=(1/5)*x-1
elif 10 < x <= 15:
data['o']=(-1/5)*x+3
data['ps']=(1/5)*x-2
else:
data['ps']=(-1/5)*x+4
data['pb']=(1/5)*x-3
return data
#传入ct参数得到相应隶属度
def CT(x):
data={'nb':0,'ns':0,'o':0,'ps':0,'pb':0}
if -20 <= x <= -10 :
data['nb']=(-1/10)*x-1
data['ns']=(1/10)*x+2
elif -10< x <= 0:
data['ns']=(-1/10)*x
data['o']=(1/10)*x+1
elif 0 < x <= 10:
data['o']=(-1/10)*x+1
data['ps']=(1/10)*x
else:
data['ps']=(-1/10)*x+2
data['pb']=(1/10)*x-1
return data
if __name__ == "__main__":
#测试数据
testdata=[[-2,79,1,1,5.89],\
[-3,86,0.3,-5,4.42],\
[-2,97,6.8,1,13.46],\
[5,93,2,3,3.53],\
[2,90,0.7,4,6.86],\
[-3,86,1.9,1,4.38],\
[-4,93,0.6,-1,8.87],\
[-3,97,0.3,-4,7.12],\
[-4,96,0.5,-5,9.39],\
[-1,95,0.3,-2,7.1],\
[-2,84,0.8,-3,5.66],\
[1,80,1.5,-2,5.46],\
[-6,94,1.7,-3,9.33],\
[-3,87,1,-3,3.89],\
[-1,96,0.3,-4,6.74],\
[0,93,0.5,-3,4.48]]
#模糊规则表
ruledata=[['ns','pb','ns','ns','ns'],\
['ns','pb','o','ns','nb'],\
['ns','pb','ns','o','o'],\
['ns','ps','o','o','ns'],\
['ns','ps','nb','o','ns'],\
['ns','pb','nb','ns','ps'],\
['ns','ns','ns','o','nb'],\
['ns','o','o','ns','ns'],\
['ns','pb','nb','ns','pb'],\
['ns','pb','o','o','ps'],\
['ns','ns','ns','o','nb'],\
['nb','pb','nb','nb','pb'],\
['ns','o','ps','o','nb'],\
['ns','pb','nb','ns','o'],\
['ps','pb','ns','o','nb'],\
['ps','pb','o','o','nb'],\
['o','pb','ns','o','nb'],\
['ns','pb','ns','o','ns'],\
['o','pb','o','o','ns'],\
['ns','pb','ns','ns','ps'],\
['ns','pb','o','o','o'],\
['pb','pb','ns','pb','nb'],\
['pb','pb','o','pb','nb'],\
['ps','ps','pb','ps','nb'],\
['o','nb','o','o','nb']]
#存放每个测试数据的et,eh,ew,ct数据参数
etdata={}
ehdata={}
ewdata={}
ctdata={}
#存放每个测试数据的隶属度
et={}
eh={}
ew={}
ct={}
#存放隶属度组合
data={}
#存放输出结果:
i=0
uu1=0
uu2=0
flag=0
u=0
u1=0
u2=0
print("环境温度 环境湿度 环境分速 导线 实际冰厚 预测冰厚 误差 误差率")
while i<len(testdata):
#获取输入参数后的隶属度
etdata=ET(testdata[i][0])
ehdata=EH(testdata[i][1])
ewdata=EW(testdata[i][2])
ctdata=CT(testdata[i][3])
#把隶属度不为0的赋值新的字典
for j in etdata:
if etdata[j] != 0 :
et[j]=etdata[j]
for j in ehdata:
if ehdata[j] != 0 :
eh[j]=ehdata[j]
for j in ewdata:
if ewdata[j] != 0 :
ew[j]=ewdata[j]
for j in ctdata:
if ctdata[j] != 0 :
ct[j]=ctdata[j]
#循环查看每个组合在规则表中的情况去计算
for i1 in et:
for i2 in eh:
for i3 in ew:
for i4 in ct:
for each in ruledata:
if (i1 == each[0]) and (i2 == each[1]) and (i3 == each[2]) and (i4 == each[3]):
if each[4] in data:
uu1=data[each[4]]
uu2=min(et[i1],eh[i2],ew[i3],ct[i4])
data[each[4]]=max(uu1,uu2)
else:
data[each[4]]=min(et[i1],eh[i2],ew[i3],ct[i4])
for j in data:
flag+=data[j]
for j in data:
if j == 'nb':
data[j]=1
elif j == 'ns':
data[j]*=7.5
elif j == 'o':
data[j]*=15
elif j == 'ps':
data[j]*=22.5
elif j == 'pb':
data[j]*=30
for j in data:
u+=data[j]
if flag !=0:
u=u/flag
testdata[i].append(u)
u1=abs(u-testdata[i][4])
testdata[i].append(u1)
if u !=0:
u2=u1/u
testdata[i].append(u2)
data={}
flag=0
u=0
u1=0
u2=0
et={}
eh={}
ew={}
ct={}
print("%5d"%testdata[i][0]," %5d"%testdata[i][1]," %5.1f"%testdata[i][2],\
" %5d"%testdata[i][3]," %5.2f"%testdata[i][4]," %5.2f"\
%testdata[i][5]," %5.2f"%testdata[i][6]," %5.2f"%testdata[i][7])
i+=1