MAIN

 avatar
unknown
python
3 years ago
27 kB
10
Indexable
import numpy as np
from mpl_toolkits.basemap import Basemap
from netCDF4 import Dataset as NetCDFFile
import matplotlib.pyplot as plt
import skfuzzy as fuzz
from skfuzzy import control as ctrl
import imageio
from fonctions_utiles import *
path = 'C:/Users/Alex/Downloads/KATRINA.nc'
path_ref = 'C:/Users/Alex/Downloads/Charlie.nc'
pression = 'C:/Users/Alex/Downloads/Katrina_pression.nc'

def input_fuzz(variable, input_to_fuzz):
    fuzz_input = []
    for i in variable.terms.keys():
        fuzz_input.append(fuzz.interp_membership(variable.universe, variable.terms[i].mf, input_to_fuzz))
    return fuzz_input


def IRR_2var(SF_rules, input_fuzz1, input_fuzz2):
    IRR = np.empty([len(SF_rules), 2])
    k = -1
    for j in range(0, len(SF_rules)):
        if (j % len(input_fuzz2)) == 0:
            k += 1
        IRR[j, 0] = input_fuzz1[k]
        IRR[j, 1] = input_fuzz2[j % len(input_fuzz2)]

    return IRR


def IRR_3var(SF_rules, input_fuzz1, input_fuzz2, input_fuzz3):
    IRR = np.empty([len(SF_rules), 3])

    k = -1
    m = -1
    for j in range(0, len(SF_rules)):
        if (j % len(input_fuzz3)) == 0:
            k += 1
            if (k % len(input_fuzz2)) == 0:
                m += 1
        IRR[j, 0] = input_fuzz1[m]
        IRR[j, 1] = input_fuzz2[j % len(input_fuzz2)]
        IRR[j, 2] = input_fuzz3[j % len(input_fuzz3)]
    return IRR


def SF1_compute(input_temperature, input_d_speed, input_time):
    pas = 0.01
    temperature = ctrl.Antecedent(np.arange(263, 323, pas), 'Temperature (K)')
    d_speed = ctrl.Antecedent(np.arange(-100, 100, pas), 'Variation of wind speed (m/s)')
    time = ctrl.Antecedent(np.arange(0, 15, pas), 'Time since TC formation (days)')
    lifespan = ctrl.Consequent(np.arange(0, 15, pas), 'Lifespan')

    temperature['Low'] = fuzz.trapmf(temperature.universe, [263, 263, 293, 303])
    temperature['Ok'] = fuzz.trapmf(temperature.universe, [293, 303, 323, 323])

    d_speed['--'] = fuzz.trapmf(d_speed.universe, [-100, -100, -60, -20])
    d_speed['-'] = fuzz.trimf(d_speed.universe, [-60, -30, 0])
    d_speed['St'] = fuzz.trimf(d_speed.universe, [-30, 0, 20])
    d_speed['+'] = fuzz.trimf(d_speed.universe, [0, 30, 60])
    d_speed['++'] = fuzz.trapmf(d_speed.universe, [20, 60, 100, 100])

    time['Young'] = fuzz.zmf(time.universe, 3,6)
    time['Middle'] = fuzz.gaussmf(time.universe,6,1)
    time['Old'] = fuzz.smf(time.universe, 6,9)

    lifespan['Dying+'] = fuzz.trapmf(lifespan.universe, [0, 0, 3, 5])
    lifespan['Dying'] = fuzz.trimf(lifespan.universe, [3, 5, 7])
    lifespan['St'] = fuzz.trimf(lifespan.universe, [5, 7, 10])
    lifespan['Living'] = fuzz.trimf(lifespan.universe, [7, 10, 13])
    lifespan['Living+'] = fuzz.trapmf(lifespan.universe, [10, 13, 15, 15])

    lifespan.view()
    temperature.view()
    d_speed.view()
    time.view()

    SF1_rules = [ctrl.Rule(temperature['Low'] & d_speed['--'] & time['Young'], lifespan['Dying+']),
                 ctrl.Rule(temperature['Low'] & d_speed['--'] & time['Middle'], lifespan['Dying+']),
                 ctrl.Rule(temperature['Low'] & d_speed['--'] & time['Old'], lifespan['Dying+']),
                 ctrl.Rule(temperature['Low'] & d_speed['-'] & time['Young'], lifespan['Dying']),
                 ctrl.Rule(temperature['Low'] & d_speed['-'] & time['Middle'], lifespan['Dying+']),
                 ctrl.Rule(temperature['Low'] & d_speed['-'] & time['Old'], lifespan['Dying+']),
                 ctrl.Rule(temperature['Low'] & d_speed['St'] & time['Young'], lifespan['Dying']),
                 ctrl.Rule(temperature['Low'] & d_speed['St'] & time['Middle'], lifespan['Dying']),
                 ctrl.Rule(temperature['Low'] & d_speed['St'] & time['Old'], lifespan['Dying']),
                 ctrl.Rule(temperature['Low'] & d_speed['+'] & time['Young'], lifespan['St']),
                 ctrl.Rule(temperature['Low'] & d_speed['+'] & time['Middle'], lifespan['St']),
                 ctrl.Rule(temperature['Low'] & d_speed['+'] & time['Old'], lifespan['St']),
                 ctrl.Rule(temperature['Low'] & d_speed['++'] & time['Young'], lifespan['Living']),
                 ctrl.Rule(temperature['Low'] & d_speed['++'] & time['Middle'], lifespan['Living']),
                 ctrl.Rule(temperature['Low'] & d_speed['++'] & time['Old'], lifespan['Living']),
                 ctrl.Rule(temperature['Ok'] & d_speed['--'] & time['Young'], lifespan['Dying']),
                 ctrl.Rule(temperature['Ok'] & d_speed['--'] & time['Middle'], lifespan['Dying']),
                 ctrl.Rule(temperature['Ok'] & d_speed['--'] & time['Old'], lifespan['Dying']),
                 ctrl.Rule(temperature['Ok'] & d_speed['-'] & time['Young'], lifespan['Dying']),
                 ctrl.Rule(temperature['Ok'] & d_speed['-'] & time['Middle'], lifespan['Dying']),
                 ctrl.Rule(temperature['Ok'] & d_speed['-'] & time['Old'], lifespan['Dying']),
                 ctrl.Rule(temperature['Ok'] & d_speed['St'] & time['Young'], lifespan['Living']),
                 ctrl.Rule(temperature['Ok'] & d_speed['St'] & time['Middle'], lifespan['St']),
                 ctrl.Rule(temperature['Ok'] & d_speed['St'] & time['Old'], lifespan['Dying']),
                 ctrl.Rule(temperature['Ok'] & d_speed['+'] & time['Young'], lifespan['Living']),
                 ctrl.Rule(temperature['Ok'] & d_speed['+'] & time['Middle'], lifespan['Living']),
                 ctrl.Rule(temperature['Ok'] & d_speed['+'] & time['Old'], lifespan['Living']),
                 ctrl.Rule(temperature['Ok'] & d_speed['++'] & time['Young'], lifespan['Living+']),
                 ctrl.Rule(temperature['Ok'] & d_speed['++'] & time['Middle'], lifespan['Living+']),
                 ctrl.Rule(temperature['Ok'] & d_speed['++'] & time['Old'], lifespan['Living+']),
                 ]
    SF1_ctrl = ctrl.ControlSystem(SF1_rules)
    SF1 = ctrl.ControlSystemSimulation(SF1_ctrl)

    input_temperature_fuzz = input_fuzz(temperature, input_temperature)
    input_d_speed_fuzz = input_fuzz(d_speed, input_d_speed)
    input_time_fuzz = input_fuzz(time, input_time)

    print(input_temperature_fuzz)
    print(input_d_speed_fuzz)
    print(input_time_fuzz)
    IRR = IRR_3var(SF1_rules, input_temperature_fuzz, input_d_speed_fuzz, input_time_fuzz)

    declenchement = IRR.min(axis=1)
    print(IRR)
    print(declenchement)

    csq_SF1 = {}  # variable de type dictionnaire
    for i in range(0, len(SF1_rules)):  # on initialise à 0 pour chaque règle
        csq_SF1[str(SF1_rules[i].consequent)] = 0
    for i in range(0, len(SF1_rules)):
        csq_i = str(SF1_rules[i].consequent)
        csq_SF1[csq_i] = max(csq_SF1[csq_i], declenchement[i])  # Comme dans le TP6

    print("Conséquences SF1 :", csq_SF1)

    # return SF1
# JUSTE CHANGER REGLES SF1

def SF2_compute(input_humidity, input_TC_size):
    pas = 0.01
    humidity = ctrl.Antecedent(np.arange(0, 100, pas), 'humidity')  # Humidity (%)'
    TC_size = ctrl.Antecedent(np.arange(0, 350, pas), 'TC_size')  # TC size (km)
    TC_size_variation = ctrl.Consequent(np.arange(0, 60, pas), 'TC_var')  # Variation of TC size for next day (km)

    humidity['--'] = fuzz.trapmf(humidity.universe, [0, 0, 20, 40])  # 20%
    humidity['-'] = fuzz.trimf(humidity.universe, [20, 40, 60])  # 40%
    humidity['+'] = fuzz.trimf(humidity.universe, [40, 60, 80])  # 60%
    humidity['++'] = fuzz.trapmf(humidity.universe, [60, 80, 100, 100])  # 80%

    TC_size['Little+'] = fuzz.trapmf(TC_size.universe, [0, 0, 75, 120])
    TC_size['Little'] = fuzz.trimf(TC_size.universe, [75, 150, 200])
    # TC_size['Normal'] = fuzz.trimf(TC_size.universe, [120, 150, 200])
    TC_size['Huge'] = fuzz.trimf(TC_size.universe, [150, 200, 250])
    TC_size['Huge+'] = fuzz.trapmf(TC_size.universe, [200, 250, 350, 350])

    # 10 13 15 20 25 50

    TC_size_variation['Very Low'] = fuzz.trapmf(TC_size_variation.universe, [0, 0, 10, 13])  # 10
    TC_size_variation['Low'] = fuzz.trimf(TC_size_variation.universe, [10, 13, 15])  # 13
    TC_size_variation['Quite Low'] = fuzz.trimf(TC_size_variation.universe, [13, 15, 20])  # 15
    TC_size_variation['Quite High'] = fuzz.trimf(TC_size_variation.universe, [15, 20, 25])  # 20
    TC_size_variation['High'] = fuzz.trimf(TC_size_variation.universe, [20, 25, 50])  # 25
    TC_size_variation['Very High'] = fuzz.trapmf(TC_size_variation.universe, [25, 50, 50, 50])  # 50

    humidity.view()
    TC_size.view()
    TC_size_variation.view()
    SF2_rules = [ctrl.Rule(humidity['--'] & TC_size['Little+'], TC_size_variation['Very Low']),
                 ctrl.Rule(humidity['--'] & TC_size['Little'], TC_size_variation['Quite Low']),
                 ctrl.Rule(humidity['--'] & TC_size['Huge'], TC_size_variation['Quite Low']),
                 ctrl.Rule(humidity['--'] & TC_size['Huge+'], TC_size_variation['Quite Low']),
                 ctrl.Rule(humidity['-'] & TC_size['Little+'], TC_size_variation['Low']),
                 ctrl.Rule(humidity['-'] & TC_size['Little'], TC_size_variation['Quite Low']),
                 ctrl.Rule(humidity['-'] & TC_size['Huge'], TC_size_variation['Quite Low']),
                 ctrl.Rule(humidity['-'] & TC_size['Huge+'], TC_size_variation['Quite Low']),
                 ctrl.Rule(humidity['+'] & TC_size['Little+'], TC_size_variation['Quite High']),
                 ctrl.Rule(humidity['+'] & TC_size['Little'], TC_size_variation['Quite High']),
                 ctrl.Rule(humidity['+'] & TC_size['Huge'], TC_size_variation['Quite High']),
                 ctrl.Rule(humidity['+'] & TC_size['Huge+'], TC_size_variation['Quite High']),
                 ctrl.Rule(humidity['++'] & TC_size['Little+'], TC_size_variation['High']),
                 ctrl.Rule(humidity['++'] & TC_size['Little'], TC_size_variation['Very High']),
                 ctrl.Rule(humidity['++'] & TC_size['Huge'], TC_size_variation['Very High']),
                 ctrl.Rule(humidity['++'] & TC_size['Huge+'], TC_size_variation['Very Low'])]

    SF2_ctrl = ctrl.ControlSystem(SF2_rules)
    SF2 = ctrl.ControlSystemSimulation(SF2_ctrl)

    input_TC_size_fuzz = input_fuzz(TC_size, input_TC_size)
    input_humidity_fuzz = input_fuzz(humidity, input_humidity)

    IRR = IRR_2var(SF2_rules, input_humidity_fuzz, input_TC_size_fuzz)
    print(IRR)

    declenchement = IRR.min(axis=1)
    print(declenchement)
    csq_SF2 = {}  # variable de type dictionnaire
    for i in range(0, len(SF2_rules)):  # on initialise à 0 pour chaque règle
        csq_SF2[str(SF2_rules[i].consequent)] = 0
    for i in range(0, len(SF2_rules)):
        csq_i = str(SF2_rules[i].consequent)
        csq_SF2[csq_i] = max(csq_SF2[csq_i], declenchement[i])  # Comme dans le TP6

    print("Conséquences SF2 :", csq_SF2)

    # SF2.input['humidity'] = input_humidity
    # SF2.input['TC_size'] = input_TC_size

    # print(SF2.output['TC_var'])
    # TC_size_variation.view(sim=SF2)


def SF3_compute(input_TC_velocity,input_surface_pressure,input_dsurface_pressure):

    velocity = ctrl.Antecedent(np.arange(0, 100, 0.01), 'Velocity')  # Velocity (m/s)
    surface_pressure = ctrl.Antecedent(np.arange(92000, 103000, 10), 'Surface_Pressure')  # Surface pressure (Pa)
    dsurface_pressure = ctrl.Antecedent(np.arange(-2000, 2000, 10), 'Surface_Pressure_Variation')  # Surface pressure variation (Pa/h) Surface variation per hour or per day?

    velocity_variation = ctrl.Consequent(np.arange(-25, 25, 0.1), 'Velocity_Variation')  # Variation of the velocity next hour (m/s). Next hour / next day  ?

    velocity['Little'] = fuzz.trapmf(velocity.universe, [0,0,20,40])
    velocity['Intermediate'] = fuzz.trapmf(velocity.universe, [20,30,50,60])
    velocity['High'] = fuzz.trapmf(velocity.universe, [40,60,100,100])

    surface_pressure['Little'] = fuzz.trapmf(surface_pressure.universe, [92000,92000, 99000, 101000])
    surface_pressure['High'] = fuzz.trapmf(surface_pressure.universe, [99000, 101000, 103000,103000])

    dsurface_pressure['--'] = fuzz.trapmf(dsurface_pressure.universe, [-2000, -2000, -1500,-500])
    dsurface_pressure['-'] = fuzz.trimf(dsurface_pressure.universe, [-1500, -500, 0])
    dsurface_pressure['0'] = fuzz.trimf(dsurface_pressure.universe, [-500, 0, 500])
    dsurface_pressure['+'] = fuzz.trimf(dsurface_pressure.universe, [0, 500, 1500])
    dsurface_pressure['++'] = fuzz.trapmf(dsurface_pressure.universe, [500,1500, 2000, 2000])

    velocity_variation['--'] = fuzz.trimf(velocity_variation.universe, [-25, -25, -10])
    velocity_variation['-'] = fuzz.trapmf(velocity_variation.universe, [-25, -10, -5, 0])
    velocity_variation['St'] = fuzz.trimf(velocity_variation.universe, [-5, 0, 5])
    velocity_variation['+'] = fuzz.trapmf(velocity_variation.universe, [0,5, 10, 25])
    velocity_variation['++'] = fuzz.trimf(velocity_variation.universe, [10, 25, 25])

    velocity.view()
    surface_pressure.view()
    dsurface_pressure.view()
    velocity_variation.view()

    SF3_rules = [ctrl.Rule(surface_pressure['Little'] & velocity['Little'] & dsurface_pressure['--'], velocity_variation['St']),
                 ctrl.Rule(surface_pressure['Little'] & velocity['Intermediate'] & dsurface_pressure['-'], velocity_variation['+']),
                 ctrl.Rule(surface_pressure['Little'] & velocity['High'] & dsurface_pressure['0'], velocity_variation['St']),
                 ctrl.Rule(surface_pressure['Little'] & velocity['Little'] & dsurface_pressure['+'], velocity_variation['St']),
                 ctrl.Rule(surface_pressure['Little'] & velocity['Intermediate'] & dsurface_pressure['++'], velocity_variation['-']),
                 ctrl.Rule(surface_pressure['Little'] & velocity['High'] & dsurface_pressure['--'], velocity_variation['++']),
                 ctrl.Rule(surface_pressure['Little'] & velocity['Little'] & dsurface_pressure['-'], velocity_variation['St']),
                 ctrl.Rule(surface_pressure['Little'] & velocity['Intermediate'] & dsurface_pressure['0'], velocity_variation['St']),
                 ctrl.Rule(surface_pressure['Little'] & velocity['High'] & dsurface_pressure['+'], velocity_variation['-']),
                 ctrl.Rule(surface_pressure['Little'] & velocity['Little'] & dsurface_pressure['++'], velocity_variation['St']),
                 ctrl.Rule(surface_pressure['Little'] & velocity['Intermediate'] & dsurface_pressure['--'], velocity_variation['+']),
                 ctrl.Rule(surface_pressure['Little'] & velocity['High'] & dsurface_pressure['-'], velocity_variation['++']),
                 ctrl.Rule(surface_pressure['Little'] & velocity['Little'] & dsurface_pressure['0'], velocity_variation['St']),
                 ctrl.Rule(surface_pressure['Little'] & velocity['Intermediate'] & dsurface_pressure['+'], velocity_variation['-']),
                 ctrl.Rule(surface_pressure['Little'] & velocity['High'] & dsurface_pressure['++'], velocity_variation['--']),
                 ctrl.Rule(surface_pressure['High'] & velocity['Little'] & dsurface_pressure['--'], velocity_variation['St']),
                 ctrl.Rule(surface_pressure['High'] & velocity['Intermediate'] & dsurface_pressure['-'], velocity_variation['St']),
                 ctrl.Rule(surface_pressure['High'] & velocity['High'] & dsurface_pressure['0'], velocity_variation['St']),
                 ctrl.Rule(surface_pressure['High'] & velocity['Little'] & dsurface_pressure['+'], velocity_variation['St']),
                 ctrl.Rule(surface_pressure['High'] & velocity['Intermediate'] & dsurface_pressure['++'], velocity_variation['-']),
                 ctrl.Rule(surface_pressure['High'] & velocity['High'] & dsurface_pressure['--'], velocity_variation['+']),
                 ctrl.Rule(surface_pressure['High'] & velocity['Little'] & dsurface_pressure['-'], velocity_variation['St']),
                 ctrl.Rule(surface_pressure['High'] & velocity['Intermediate'] & dsurface_pressure['0'], velocity_variation['St']),
                 ctrl.Rule(surface_pressure['High'] & velocity['High'] & dsurface_pressure['+'], velocity_variation['-']),
                 ctrl.Rule(surface_pressure['High'] & velocity['Little'] & dsurface_pressure['++'], velocity_variation['St']),
                 ctrl.Rule(surface_pressure['High'] & velocity['Intermediate'] & dsurface_pressure['--'], velocity_variation['+']),
                 ctrl.Rule(surface_pressure['High'] & velocity['High'] & dsurface_pressure['-'], velocity_variation['+']),
                 ctrl.Rule(surface_pressure['High'] & velocity['Little'] & dsurface_pressure['0'], velocity_variation['St']),
                 ctrl.Rule(surface_pressure['High'] & velocity['Intermediate'] & dsurface_pressure['+'], velocity_variation['-']),
                 ctrl.Rule(surface_pressure['High'] & velocity['High'] & dsurface_pressure['++'], velocity_variation['-'])]

    SF3_ctrl = ctrl.ControlSystem(SF3_rules)
    SF3 = ctrl.ControlSystemSimulation(SF3_ctrl)

    input_velocity_fuzz = input_fuzz(velocity, input_TC_velocity)
    input_surface_pressure_fuzz = input_fuzz(surface_pressure, input_surface_pressure)
    input_dsurface_pressure_fuzz = input_fuzz(dsurface_pressure, input_dsurface_pressure)

    print('Velocity fuzz')
    print(input_velocity_fuzz)
    print('Pressure fuzz')
    print(input_surface_pressure_fuzz)
    print('dPressure fuzz')
    print(input_dsurface_pressure_fuzz)

    IRR = IRR_3var(SF3_rules,input_surface_pressure_fuzz, input_velocity_fuzz, input_dsurface_pressure_fuzz)
    print(IRR)

    declenchement = IRR.min(axis=1)
    print(declenchement)
    csq_SF3 = {}  # variable de type dictionnaire
    for i in range(0, len(SF3_rules)):  # on initialise à 0 pour chaque règle
        csq_SF3[str(SF3_rules[i].consequent)] = 0
    for i in range(0, len(SF3_rules)):
        csq_i = str(SF3_rules[i].consequent)
        csq_SF3[csq_i] = max(csq_SF3[csq_i], declenchement[i])  # Comme dans le TP6

    print("Conséquences SF3 :", csq_SF3)


def SF4_compute(input_actu,input_ant):

    tendance_actuelle = ctrl.Antecedent(np.arange(-90, 90, 0.1), 'Angle calcul')
    tendance_antecedents = ctrl.Antecedent(np.arange(-90, 90, 0.1), 'Angle évalué par la forme')

    angle = ctrl.Consequent(np.arange(-90,90,0.1),'Prédiction courbature')

    tendance_actuelle['Courbé Gauche Fort'] = fuzz.trapmf(tendance_actuelle.universe, [-90, -90, -60, -45])
    tendance_actuelle['Courbé Gauche'] = fuzz.trapmf(tendance_actuelle.universe, [-60, -45, -10, 0])
    tendance_actuelle['Linéaire'] = fuzz.trapmf(tendance_actuelle.universe, [-10, 0, 0, 10])
    tendance_actuelle['Courbé Droite'] = fuzz.trapmf(tendance_actuelle.universe, [0, 10, 45, 60])
    tendance_actuelle['Courbé Droite Fort'] = fuzz.trapmf(tendance_actuelle.universe, [45, 60, 90, 90])

    tendance_antecedents['Courbé Gauche Fort'] = fuzz.trapmf(tendance_antecedents.universe, [-90, -90, -60, -40])
    tendance_antecedents['Courbé Gauche'] = fuzz.trapmf(tendance_antecedents.universe, [-60, -45, -20, 0])
    tendance_antecedents['Linéaire'] = fuzz.trapmf(tendance_antecedents.universe, [-20, -5, 5, 20])
    tendance_antecedents['Courbé Droite'] = fuzz.trapmf(tendance_antecedents.universe, [0, 20, 45, 60])
    tendance_antecedents['Courbé Droite Fort'] = fuzz.trapmf(tendance_antecedents.universe, [40, 60, 90, 90])

    angle['Courbé Gauche Fort'] = fuzz.trapmf(angle.universe, [-90, -90, -60, -40])
    angle['Courbé Gauche'] = fuzz.trapmf(angle.universe, [-60, -45, -20, 0])
    angle['Linéaire'] = fuzz.trapmf(angle.universe, [-20, -5, 5, 20])
    angle['Courbé Droite'] = fuzz.trapmf(angle.universe, [0, 20, 45, 60])
    angle['Courbé Droite Fort'] = fuzz.trapmf(angle.universe, [40, 60, 90, 90])

    tendance_actuelle.view()
    tendance_antecedents.view()
    angle.view()

    SF4_rules = [ctrl.Rule(tendance_actuelle['Courbé Gauche Fort'] & tendance_antecedents['Courbé Gauche Fort'], angle['Courbé Gauche Fort']),
                 ctrl.Rule(tendance_actuelle['Courbé Gauche Fort'] & tendance_antecedents['Courbé Gauche'], angle['Courbé Gauche Fort']),
                 ctrl.Rule(tendance_actuelle['Courbé Gauche Fort'] & tendance_antecedents['Linéaire'], angle['Courbé Gauche']),
                 ctrl.Rule(tendance_actuelle['Courbé Gauche Fort'] & tendance_antecedents['Courbé Droite'], angle['Courbé Gauche']),
                 ctrl.Rule(tendance_actuelle['Courbé Gauche Fort'] & tendance_antecedents['Courbé Droite Fort'], angle['Linéaire']),
                 ctrl.Rule(tendance_actuelle['Courbé Gauche'] & tendance_antecedents['Courbé Gauche Fort'], angle['Courbé Gauche Fort']),
                 ctrl.Rule(tendance_actuelle['Courbé Gauche'] & tendance_antecedents['Courbé Gauche'], angle['Courbé Gauche']),
                 ctrl.Rule(tendance_actuelle['Courbé Gauche'] & tendance_antecedents['Linéaire'], angle['Courbé Gauche']),
                 ctrl.Rule(tendance_actuelle['Courbé Gauche'] & tendance_antecedents['Courbé Droite'], angle['Linéaire']),
                 ctrl.Rule(tendance_actuelle['Courbé Gauche'] & tendance_antecedents['Courbé Droite Fort'], angle['Courbé Droite']),
                 ctrl.Rule(tendance_actuelle['Linéaire'] & tendance_antecedents['Courbé Gauche Fort'], angle['Courbé Gauche Fort']),
                 ctrl.Rule(tendance_actuelle['Linéaire'] & tendance_antecedents['Courbé Gauche'], angle['Courbé Gauche']),
                 ctrl.Rule(tendance_actuelle['Linéaire'] & tendance_antecedents['Linéaire'], angle['Linéaire']),
                 ctrl.Rule(tendance_actuelle['Linéaire'] & tendance_antecedents['Courbé Droite'], angle['Courbé Droite']),
                 ctrl.Rule(tendance_actuelle['Linéaire'] & tendance_antecedents['Courbé Droite Fort'], angle['Courbé Droite Fort']),
                 ctrl.Rule(tendance_actuelle['Courbé Droite'] & tendance_antecedents['Courbé Gauche Fort'], angle['Courbé Gauche']),
                 ctrl.Rule(tendance_actuelle['Courbé Droite'] & tendance_antecedents['Courbé Gauche'], angle['Linéaire']),
                 ctrl.Rule(tendance_actuelle['Courbé Droite'] & tendance_antecedents['Linéaire'], angle['Courbé Droite']),
                 ctrl.Rule(tendance_actuelle['Courbé Droite'] & tendance_antecedents['Courbé Droite'], angle['Courbé Droite']),
                 ctrl.Rule(tendance_actuelle['Courbé Droite'] & tendance_antecedents['Courbé Droite Fort'], angle['Courbé Droite Fort']),
                 ctrl.Rule(tendance_actuelle['Courbé Droite Fort'] & tendance_antecedents['Courbé Gauche Fort'], angle['Linéaire']),
                 ctrl.Rule(tendance_actuelle['Courbé Droite Fort'] & tendance_antecedents['Courbé Gauche'], angle['Courbé Droite']),
                 ctrl.Rule(tendance_actuelle['Courbé Droite Fort'] & tendance_antecedents['Linéaire'], angle['Courbé Droite']),
                 ctrl.Rule(tendance_actuelle['Courbé Droite Fort'] & tendance_antecedents['Courbé Droite'], angle['Courbé Droite Fort']),
                 ctrl.Rule(tendance_actuelle['Courbé Droite Fort'] & tendance_antecedents['Courbé Droite Fort'], angle['Courbé Droite Fort'])]


    SF4_ctrl = ctrl.ControlSystem(SF4_rules)
    SF4 = ctrl.ControlSystemSimulation(SF4_ctrl)

    input_tendance_actuelle_fuzz = input_fuzz(tendance_actuelle, input_actu)
    input_tendance_antecedents_fuzz = input_fuzz(tendance_antecedents, input_ant)

    print('Tendance calculée fuzz')
    print(input_tendance_actuelle_fuzz)
    print('Tendance évaluée fuzz')
    print(input_tendance_antecedents_fuzz)

    IRR = IRR_2var(SF4_rules,input_tendance_actuelle_fuzz, input_tendance_antecedents_fuzz)
    print(IRR)

    declenchement = IRR.min(axis=1)
    print(declenchement)
    csq_SF4 = {}  # variable de type dictionnaire
    for i in range(0, len(SF4_rules)):  # on initialise à 0 pour chaque règle
        csq_SF4[str(SF4_rules[i].consequent)] = 0
    for i in range(0, len(SF4_rules)):
        csq_i = str(SF4_rules[i].consequent)
        csq_SF4[csq_i] = max(csq_SF4[csq_i], declenchement[i])  # Comme dans le TP6

    # print("Conséquences SF4 :", csq_SF4)
    return(output_fuzz(csq_SF4, angle))


def SF4_conclusion(jour,heure,path):
    #Prediction pour 12 heures

    date_exact = (jour-1)*24 + heure

    lat_pos,lon_pos = position_TC(jour,heure,path)

    x0 = deg_to_met(lat_pos)
    y0 = deg_to_met(lon_pos)

    nc = NetCDFFile(path)
    u = np.array(nc.variables['u'][:])
    lon = np.array(nc.variables['longitude'][:])
    lat = np.array(nc.variables['latitude'][:])
    prediction = np.zeros(np.shape(u))

    sf4_conc = SF4_compute(entree_SF4(29, 12, path), -15)

    for lignes in range(np.shape(sf4_conc)[0]):

        a = angle(jour, heure, path) + sf4_conc[lignes][0]

        for r in np.arange(0,400000,20000):
            xo,yo = polar_to_cart(r,a)

            x = met_to_deg(xo + x0)
            y = met_to_deg(yo + y0)

            idx_lon, idx_lat = xy_to_indx_lonlat(y, x, lon, lat)
            prediction[date_exact,idx_lat,idx_lon] = sf4_conc[lignes][1]


    # plot_array(prediction[date_exact, :, :], lon, lat)
    # # plt.plot(posy,posx,ms=5, marker='o', markeredgecolor='red')
    # plt.show()

    def plotnc():
        # Extraction des tableaux de données:
        lat = nc.variables['latitude'][:]
        lon = nc.variables['longitude'][:]

        nc.close()

        # Création de la map
        map = Basemap(width=5000000, height=3500000,
                      resolution='l', projection='cyl',
                      llcrnrlon=lon.min(), llcrnrlat=lat.min(), urcrnrlon=lon.max(), urcrnrlat=lat.max(),
                      lat_0=lat.mean(),
                      lon_0=lon.mean())
        lons, lats = np.meshgrid(lon, lat)
        xi, yi = map(lons, lats)

        map.drawmapboundary(fill_color='aqua')
        map.fillcontinents(color='coral', lake_color='aqua')
        map.drawcoastlines()

        parallels = np.arange(lat.min(), lat.max(), 5.)  # make latitude lines every 5 degrees from xx to xx
        meridians = np.arange(lon.min(), lat.min(), 5.)  # make longitude lines every 5 degrees from xx to xx
        map.drawparallels(parallels, labels=[1, 0, 0, 0], fontsize=5)
        map.drawmeridians(meridians, labels=[0, 0, 0, 1], fontsize=5)

        # Création des données en couleur
        cs = map.pcolor(xi, yi, np.squeeze(prediction[date_exact, :, :]), vmin=prediction.min(), vmax=prediction.max())
        cbar = map.colorbar(cs, location='bottom', pad=0.2, )

    plotnc()
    plt.show()

SF3_compute(50,99000,-1000)
Editor is loading...