如何解决使用输出字典作为输入
data I want to use as input how they appeared in output
我想使输入模糊出错,并使用输出系统来控制系统的稳定时间。我的讲师说不要改变任何东西只是添加。我设法添加模糊。只是不知道如何将误差用作模糊的输入,我使用了fuzzy_system.input = es,而fuzzy的输出将控制图形的输出和稳定时间。
这里是完整的代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
import skfuzzy as fuzz
from skfuzzy import control as ctrl
import json
animate=True
def tank(Level,time,c,valve):
rho = 1000.0 # water density (kg/m^3)
A = 1.0 # tank area (m^2)
dLevel_dt = (c/(rho*A)) * valve
return dLevel_dt
ts = np.linspace(0,10,101)
c = 50.0 # valve coefficient (kg/s / %open)
#level initial condition
Level0 = 0
#initial valve position
valve = 0
ErrorFuzzy = ctrl.Antecedent(np.arange(0,11,1),'ErrorFuzzy')
ValveFuzzy = ctrl.Consequent(np.arange(0,101,'ValveFuzzy')
ErrorFuzzy['VL'] = fuzz.trimf(ErrorFuzzy.universe,[0,2.5])
ErrorFuzzy['L'] = fuzz.trimf(ErrorFuzzy.universe,2.5,5])
ErrorFuzzy['M'] = fuzz.trimf(ErrorFuzzy.universe,[2.5,5,7.5])
ErrorFuzzy['H'] = fuzz.trimf(ErrorFuzzy.universe,[5,7.5,10])
ErrorFuzzy['VH'] = fuzz.trimf(ErrorFuzzy.universe,[7.5,10])
ValveFuzzy['C'] = fuzz.trimf(ValveFuzzy.universe,25])
ValveFuzzy['AC'] = fuzz.trimf(ValveFuzzy.universe,25,50])
ValveFuzzy['H'] = fuzz.trimf(ValveFuzzy.universe,[25,50,75])
ValveFuzzy['O'] = fuzz.trimf(ValveFuzzy.universe,[50,75,100])
ValveFuzzy['FO'] = fuzz.trimf(ValveFuzzy.universe,[75,100,101])
rule1 = ctrl.Rule(ErrorFuzzy['VL'],ValveFuzzy['C'])
rule2 = ctrl.Rule(ErrorFuzzy['L'],ValveFuzzy['AC'])
rule3 = ctrl.Rule(ErrorFuzzy['M'],ValveFuzzy['H'])
rule4 = ctrl.Rule(ErrorFuzzy['H'],ValveFuzzy['O'])
rule5 = ctrl.Rule(ErrorFuzzy['VH'],ValveFuzzy['FO'])
fuzzy_ctrl = ctrl.ControlSystem([rule1,rule2,rule3,rule4,rule5])
fuzzy_system = ctrl.ControlSystemSimulation(fuzzy_ctrl)
z = np.zeros(101) #tank level
es = np.zeros(101) #error
sps = np.zeros(101)
u = np.zeros(101) # u = valve % open
ubias = 0 # System Bias
Kc = 15 # value for P-controller
SP = 10 # Desired level
plt.figure(1,figsize=(12,5))
if animate:
plt.ion()
plt.show()
make_gif = True
try:
import imageio # required to make gif animation
except:
print('install imageio with "pip install imageio" to make gif')
make_gif=False
if make_gif:
try:
import os
images = []
os.mkdir('./frames')
except:
print('figure directory Failed')
make_gif=False
k=0
for i in range(100):
# calculate the error
error = SP - Level0
valvefuzzy = fuzzy_system.output #Fuzzy Output
fuzzy_system.input['ErrorFuzzy'] = es
if error>=0.1 and k==0:
print('Error='+ str(error) + ' ' + 'Fuzzy Valve: ' + str(valvefuzzy))
if error<=0.1 and k==0:
print()
print('Settling Time at: ' + str(i/10) + ' sec' )
k=1
valve = ubias + Kc * error
valve = max(0,valve)
valve = min(100,valve)
u[i+1] = valve # store the valve position
es[i+1] = error # store the error
y = odeint(tank,Level0,0.1],args=(c,valve))
Level0 = y[-1] # take the last point
z[i+1] = Level0 # store the level for plotting
sps[i+1] = SP
fuzzy_system.compute()
ErrorFuzzy.view()
ValveFuzzy.view()
ValveFuzzy.view(sim=fuzzy_system)
print ('COG ValveFuzzy: ' + str(fuzzy_system.output['ValveFuzzy']))
if animate:
plt.clf()
plt.subplot(3,1,1)
plt.plot(ts[0:i+1],z[0:i+1],'r-',linewidth=3,label='level PV')
plt.plot(ts[0:i+1],sps[0:i+1],'k:',label='level SP')
plt.ylabel('Tank Level')
plt.legend(loc='best')
plt.subplot(3,2)
plt.plot(ts[0:i+1],u[0:i+1],'b--',label='valve')
plt.ylabel('Valve')
plt.legend(loc='best')
plt.subplot(3,3)
plt.plot(ts[0:i+1],es[0:i+1],'g-',label='error')
plt.ylabel('Error = SP-PV')
plt.xlabel('Time (sec)')
plt.legend(loc='best')
filename='./frames/frame_'+str(000+i)+'.png'
plt.savefig(filename)
if make_gif:
images.append(imageio.imread(filename))
plt.pause(0.1)
if not animate:
plt.subplot(3,1)
plt.plot(ts,z,label='level PV')
plt.plot(ts,sps,label='level SP')
plt.ylabel('Tank Level')
plt.legend(loc='best')
plt.subplot(3,2)
plt.plot(ts,u,3)
plt.plot(ts,es,label='error')
plt.ylabel('Error = SP-PV')
plt.xlabel('Time (sec)')
plt.legend(loc='best')
plt.show()
else:
if make_gif:
imageio.mimsave('animate.gif',images)
print('-----------------End of Model Simulation Process-------------------')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。