首页 > 解决方案 > 使用输出字典作为输入

问题描述

我想用作输入的数据 它们如何出现在输出中

我想使输入模糊错误并使用输出系统来控制系统的稳定时间。我的讲师说不要改变任何东西只是添加。我设法添加了模糊。只是不知道如何使用错误作为模糊的输入,我使用了fuzzy_system.input = es,并且模糊的输出将控制图形的输出和稳定时间。

这里完整的编码

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, 1), 'ValveFuzzy')

ErrorFuzzy['VL'] = fuzz.trimf(ErrorFuzzy.universe, [0, 0, 2.5])
ErrorFuzzy['L'] = fuzz.trimf(ErrorFuzzy.universe, [0, 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, 10])

ValveFuzzy['C'] = fuzz.trimf(ValveFuzzy.universe, [0, 0, 25])
ValveFuzzy['AC'] = fuzz.trimf(ValveFuzzy.universe, [0, 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,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:',linewidth=3,label='level SP')   
    plt.ylabel('Tank Level')
    plt.legend(loc='best')
    
    plt.subplot(3,1,2)
    plt.plot(ts[0:i+1],u[0:i+1],'b--',linewidth=3,label='valve')
    plt.ylabel('Valve')
    plt.legend(loc='best')
    
    plt.subplot(3,1,3)
    plt.plot(ts[0:i+1],es[0:i+1],'g-',linewidth=3,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,1)
    plt.plot(ts,z,'r-',linewidth=3,label='level PV')
    plt.plot(ts,sps,'k:',linewidth=3,label='level SP')
    plt.ylabel('Tank Level')
    plt.legend(loc='best')
    
    plt.subplot(3,1,2)
    plt.plot(ts,u,'b--',linewidth=3,label='valve')
    plt.ylabel('Valve')
    plt.legend(loc='best')
    
    plt.subplot(3,1,3)
    plt.plot(ts,es,'g-',linewidth=3,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-------------------')

标签: pythonnumpymatplotlibpidfuzzy

解决方案


推荐阅读