使用输出字典作为输入

问题描述

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 (将#修改为@)