def run(dlcs, SAVE=None):
    wsp =  18
    C1 = IPC04.make()
    C2 = IPC07.make()
    P = BladeModel.Blade(wsp)
    sys1 = ControlDesign.Turbine(P, C1)
    sys2 = ControlDesign.Turbine(P, C2)

    #ControllerEvaluation.plot_nyquist(sys.L, zoom=1.5, rightticks = True, save=SAVE)
    plot_T(sys1.T, sys2.T, SAVE=SAVE)
def run(dlc=None, dlc_noipc=None, SAVE=None):
    f = np.linspace(0, 1.5, 1000)[1:]

    Yol = OLResponse.Response(18)
    Ycl = Spectrum(dlc(wsp=18, controller='ipcpi')[0])
    C = make()
    P = BladeModel.Blade(18)
    sys = ControlDesign.Turbine(P, C)
    mag = signal.bode(sys.S, w=f * (2 * np.pi))[1]
    actualMag = 20 * np.log10(Ycl(f) / Yol(f))
    fig, ax = ControllerEvaluation.magplotSetup(F1p=0.16)

    ax.set_xlim(0.05, 1.5)

    ax.axhline(0, lw=1, c='0.8', ls='-')
    ax.plot(f, mag, label='$S(C_{PI})$, linear model')
    ax.plot(f, actualMag, '--', label='$S(C_{PI})$, HAWC2 model')

    ax.set_ylim(-10, 10)
    ax.legend(loc='upper left')

    if SAVE:
        plt.savefig(SAVE, dpi=200, bbox_inches='tight')
    plt.show()
    print()
def run(dlc=None, dlc_noipc=None, SAVE=None):
    wsp =  18
    C = make()
    P = BladeModel.Blade(wsp)
    sys = ControlDesign.Turbine(P, C)

    plot_nyquist(sys.L, zoom=1.5, rightticks = True, save=SAVE)
def run(dlc=None, dlc_noipc=None, SAVE=None):
    f = np.linspace(0, 1.5, 1000)[1:]
    C = []
    modules = ['IPC_PI', 'IPC04', 'IPC07']
    for m in modules:
        module = importlib.import_module('Controllers.' + m)
        C.append(module.make)

    Mag = []
    for c in C:
        P = BladeModel.Blade(18)
        sys = ControlDesign.Turbine(P, c())
        Mag.append(signal.bode(sys.S, w=f * (2 * np.pi))[1])

    fig, ax = ControllerEvaluation.magplotSetup(F1p=0.16)
    ax.set_xlim(0.05, 1.5)

    ax.plot(f, Mag[0], '-.', label='$S(C_{PI})$')
    ax.plot(f, Mag[1], ':', label='$S(C_{1p})$')
    ax.plot(f, Mag[2], '-r', label='$S(C_{2})$')

    ax.set_ylim(-25, 10)

    ax.legend()

    if SAVE:
        plt.savefig(SAVE, dpi=200, bbox_inches='tight')
    plt.show()
    print()
def run(dlc=None, dlc_noipc=None, SAVE=None):
    f = np.linspace(0, 1.5, 1000)[1:]
    C = []
    modules = ['IPC_PI', 'IPC04', 'IPC09', 'IPC10', 'IPC11']
    for m in modules:
        module = importlib.import_module('Controllers.' + m)
        C.append(module.make)

    Mag = []
    for i in [0, 1, 2, 3, 4]:
        P = BladeModel.Blade(18)
        sys = ControlDesign.Turbine(P, C[i]())
        Mag.append(signal.bode(sys.S, w=f * (2 * np.pi))[1])

    fig, ax = ControllerEvaluation.magplotSetup(F1p=0.16)
    ax.set_xlim(0.05, 1.5)
    ax.axhline(0, lw=1, c='0.8', ls='-')

    colors = ['#a1dab4', '#41b6c4', '#2c7fb8', '#253494']
    ax.plot(f, Mag[0], '-.', c='tab:orange', label='$S(C_{PI})$')
    for i in [1, 2, 3, 4]:
        ax.plot(f,
                Mag[i],
                '-',
                c=colors[i - 1],
                label='$S(C_{f' + f'{i}' + 'p})$')

    ax.set_ylim(-25, 10)

    ax.legend()

    if SAVE:
        plt.savefig(SAVE, dpi=200, bbox_inches='tight')
    plt.show()
    print()
예제 #6
0
def run(dlc=None, dlc_noipc=None, SAVE=None):
    wsp = 18
    # Load transfer functions
    C = make()
    P = BladeModel.Blade(wsp)

    Kps, Tis = np.meshgrid([0.01, 0.015, 0.02], [0.5, 1, 2])

    fig, axes = plt.subplots(3, 3, sharex=False, sharey=False, figsize=(7, 7))
    plt.subplots_adjust(wspace=0.05, hspace=0.05)
    for i in range(3):
        for j in range(3):
            C = make(Kp=Kps[i, j], Ti=Tis[i, j])
            sys = ControlDesign.Turbine(P, C)
            plot_nyquist(sys.L, axes=axes[i, j], zoom=1, margin=True)
            perf = sys.performance(0.16)[0]
            axes[i, j].text(0,
                            0,
                            '$f_{1p}$: ' + '{:2.2f}\%'.format(perf * 100),
                            transform=axes[i, j].transAxes,
                            va='bottom')

    fig.text(0.1, 0.5, 'Real', va='center', rotation='vertical')
    fig.text(0.5, 0.1, 'Imaginary', ha='center', rotation='horizontal')

    for i in range(3):
        axes[0, i].set_title(f'$K_p=${Kps[0, i]}')
        axes[i, 2].yaxis.set_label_position('right')
        axes[i, 2].set_ylabel(f'$T_i=${Tis[i, 0]}')

    if SAVE:
        plt.savefig(SAVE, dpi=200, bbox_inches='tight')
    plt.show()
    print()
def getData():
    f1p = 0.16
    fs = f1p * np.array([1, 2, 3, 4])
    X = []
    P = BladeModel.Blade(wsp=18)
    Yol = OLResponse.Response(18)

    # loop over each controller
    for i, mod_name in enumerate(Modules):
        X.append({})

        # load linear closed loop system
        module = import_module('Controllers.' + mod_name)
        C = module.make()
        sys = ControlDesign.Turbine(P, C)

        X[i]['sm'] = sys.sm
        X[i]['linear'] = list(sys.performance(f1p))

        # load HAWC2 closed loop system results
        dlc = PostProc.DLC('dlc11_1')
        Sim = dlc(wsp=18, controller=ControllerName[i])[0]
        Ycl = Spectrum(Sim)
        X[i]['HAWC2'] = [Ycl(f) / Yol(f) - 1 for f in fs]

    return X
예제 #8
0
def run(dlc, dlc_noipc, c, C, SAVE=False):

    WSP = [6, 12, 18, 24]
    fnp = 0.16 * np.array([1, 2, 3, 4])
    for wsp in WSP:
        # Load transfer functions
        P = BladeModel.Blade(wsp)
        Yol = OLResponse.Response(wsp)
        # Calculate predicted output spectrum
        system = ControlDesign.Turbine(P, C)
        w, H = signal.freqresp(system.S)
        f = w / (2 * np.pi)
        Ycl_pred = abs(H) * Yol(f)
        # Load close loop output spectrum
        Sim = dlc(yaw=0, wsp=wsp, controller=c, Kp=-1)[0]
        Ycl = Spectrum(Sim)

        fig, ax = magplotSetup(F1p=0.16)
        ax.set_ylabel('Magnitude [m]')
        ax.plot(f, Yol(f), label='$Y_{OL}$')
        ax.plot(f, Ycl_pred, '--k', label='$Y_{CL}$ (predicted)')
        ax.plot(f, Ycl(f), 'r', label='$Y_{CL}$ (actual)')
        ax.set_xlim(f.min(), 1.5)
        ax.set_title('wsp = {}m/s'.format(wsp))
        ax.legend()

        if SAVE:
            plt.savefig(
                '../Figures/{}/{}_TipDeflection_Spectrum_{}.png'.format(
                    c, c, wsp),
                dpi=200)
        plt.show()
        print()

        for f in fnp:
            pred = abs(signal.freqresp(system.S,
                                       f * 2 * np.pi)[1][0]) * 100 - 100
            act = Ycl(f) / Yol(f) * 100 - 100
            print('{:2.2f}%, {:2.2f}%'.format(pred, act))
def run(dlc=None, dlc_noipc=None, SAVE=None):
    f = np.linspace(0, 1.5, 1000)[1:]

    Yol = OLResponse.Response(18)
    Ycl = Spectrum(dlc(wsp=18, controller='ipcpi')[0])
    C = make()
    P = BladeModel.Blade(18)
    sys = ControlDesign.Turbine(P, C)
    mag = signal.bode(sys.S, w=f * (2 * np.pi))[1]
    #actualMag = 20*np.log10(Ycl(f)/Yol(f))

    w, H = signal.freqresp(sys.S, n=100000)
    f = w / (2 * np.pi)
    Ycl_pred = abs(H) * Yol(f)

    fig, ax = ControllerEvaluation.magplotSetup(F1p=0.16)
    ax.set_xlim(0.05, 1.5)

    ax.axhline(0, lw=1, c='0.8', ls='-')

    ax.plot(f, Yol(f), label='Open loop')
    ax.plot(f, Ycl_pred, '--k', label='Closed loop (linear)')
    ax.plot(f, Ycl(f), 'r', label='Closed loop (HAWC2)')

    #ax.plot(f, mag, label='$S(C_{PI})$, linear model')
    #ax.plot(f, actualMag, '--', label='$S(C_{PI})$, HAWC2 model')

    ax.set_ylabel('Magnitude [m]')
    ax.set_xlim(0.05, 1.5)
    ax.set_ylim(0.01, 0.4)
    ax.set_yscale('log')
    ax.legend(loc='upper right')

    if SAVE:
        plt.savefig(SAVE, dpi=200, bbox_inches='tight')
    plt.show()
    print()
예제 #10
0
    controller.addLeadCompensator(lead, 3*F1P)
    controller.addLeadCompensator(lead, 3*F1P)

    mag, phase = controller.freqResp(2*F1P)
    controller.K = 1/mag
    controller.K *= 0.05
    return controller.tf


if __name__ == '__main__':
    wsp = 18
    f1p = 0.16 # hz

    P = BladeModel.Blade(wsp)
    C = make()
    sys = ControlDesign.Turbine(P, C)

    # stability margin
    print('Sm: {:2.3f}\n'.format(sys.sm))

    # performance at f1p to f4p
    for i, perf in enumerate(sys.performance(f1p)):
        print('f{}p: {:+.2f}%'.format(i+1, perf*100))







예제 #11
0
def run(dlc, dlc_noipc, SAVE=False):

    F1p = 0.16
    wsp = 18
    C_names = ['ipc04', 'ipc09', 'ipc10', 'ipc11']
    C_labels = [
        '$f_{1p}$ Control', '$f_{2p}$ Control', '$f_{3p}$ Control',
        '$f_{4p}$ Control'
    ]
    C_generators = [IPC04.make, IPC09.make, IPC10.make, IPC11.make]

    fig, axes = plt.subplots(2, 2, sharey=True, figsize=[7, 5])
    plt.subplots_adjust(wspace=0.05, hspace=0.05)
    for c, c_func, ax, label in zip(C_names, C_generators, axes.ravel(),
                                    C_labels):
        # Load transfer functions
        C = c_func()
        P = BladeModel.Blade(wsp)
        Yol = OLResponse.Response(wsp)

        # Calculate predicted output spectrum
        system = ControlDesign.Turbine(P, C)
        w, H = signal.freqresp(system.S)
        f = w / (2 * np.pi)
        Ycl_pred = abs(H) * Yol(f)

        # Load close loop output spectrum
        Sim = dlc(yaw=0, wsp=wsp, controller=c, Kp=-1)[0]
        Ycl = Spectrum(Sim)

        ax.plot(f, Yol(f), label='OL')
        ax.plot(f, Ycl_pred, '--k', label='CL (linear)')
        ax.plot(f, Ycl(f), 'r', label='CL (HAWC2)')

        # axis
        ax.set_xscale('log')
        ax.set_xlim(0.05, 1.5)
        ax.set_ylim(0.01, 1)

        # ticks
        ax.set_xticks([F1p, 2 * F1p, 3 * F1p, 4 * F1p], minor=True)
        ax.grid(axis='x', which='minor')

        # annotate
        ax.annotate(label,
                    xy=(0.05, 0.96),
                    xycoords='axes fraction',
                    size=12,
                    ha='left',
                    va='top',
                    bbox=dict(boxstyle='round', fc='w', alpha=0.0))
    # axis
    ax.set_yscale('log')
    ax.set_ylim(0.01, 1)

    # ticks
    axes[0, 0].set_xticklabels([])
    axes[0, 1].set_xticklabels([])
    axes[1,
         0].set_xticklabels(['$f_{1p}$', '$f_{2p}$', '$f_{3p}$', '$f_{4p}$'],
                            minor=True)
    axes[1,
         1].set_xticklabels(['$f_{1p}$', '$f_{2p}$', '$f_{3p}$', '$f_{4p}$'],
                            minor=True)

    # labels
    fig.text(0.05, 0.5, 'Magnitude [m]', va='center', rotation='vertical')
    fig.text(0.5, 0.05, 'Frequency [Hz]', ha='center', rotation='horizontal')

    #axes[1, 1].legend(loc='lower left')
    axes[1, 1].legend()
    if SAVE:
        plt.savefig(SAVE, dpi=200, bbox_inches='tight')
    plt.show()
    print()

    # print some results
    fnp = 0.16 * np.array([1, 2, 3, 4])
    for f in fnp:
        pred = abs(signal.freqresp(system.S, f * 2 * np.pi)[1][0]) * 100 - 100
        act = Ycl(f) / Yol(f) * 100 - 100
        print('{:2.2f}%, {:2.2f}%'.format(pred, act))