[Python] Run ARX Simulation with initial condition with GEKKO

Discussão em 'Python' iniciado por Stack, Junho 17, 2025.

  1. Stack

    Stack Membro Participativo

    I want to do a temperature simulation with ARX models and found Gekko as framework for it. I was able to run basically the example of apmonitor and give my simulation an initial condition when using na=1. These are my plots with na=1 and using the first measured value as inital condition in the step test: Sysid na=1 Step Test na=1

    Looks fine so far.

    However when i increase na to any value higher than 1 lets say 2 my step test now looks like: Step Test na=2 The simulation values rise to nonsensical values, but they do in fact start at the correct value for the first value.

    My understanding is that with increasing na the simulation takes more past steps into account. How can i start the simulation with multiple past steps as initial state so what i am doing works?

    I dont want to use a steady state inital condition because it does not reflect the real starting point of the simulation. I just want to use na real past measurements as starting point.

    Here is my code:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from gekko import GEKKO

    # Load data
    url = 'http://apmonitor.com/dde/uploads/Main/tclab_step_test.txt'
    data = pd.read_csv(url)
    t = data['Time']
    u = data[['Q1', 'Q2']]
    y = data[['T1', 'T2']]

    # System identification
    m = GEKKO(remote=True)
    na, nb = 2, 6
    yp, p, K = m.sysid(t, u, y, na, nb, diaglevel=1, scale=False)

    # Plot input and output data with predictions
    plt.figure(figsize=(8, 5))
    plt.subplot(2, 1, 1)
    plt.plot(t, u)
    plt.legend([r'$Q_1$', r'$Q_2$'])
    plt.ylabel('Inputs')
    plt.subplot(2, 1, 2)
    plt.plot(t, y)
    plt.plot(t, yp)
    plt.legend([r'$T_{1,meas}$', r'$T_{2,meas}$',
    r'$T_{1,pred}$', r'$T_{2,pred}$'])
    plt.ylabel('Outputs')
    plt.xlabel('Time')

    # ARX model for simulation
    yc, uc = m.arx(p)
    m.time = np.linspace(0, 600, 601)
    m.options.IMODE = 4

    # Set input profiles
    uc[0].value = data['Q1']
    uc[1].value = data['Q2']

    # Set initial output values
    yc[0].value = data['T1'][0]
    yc[1].value = data['T2'][0]

    # Solve and plot simulation results
    m.solve(disp=False)

    plt.figure(figsize=(10, 6))
    plt.subplot(2, 2, 1)
    plt.title('Step Test')
    plt.plot(m.time, uc[0].value, 'b-', label=r'$Q_1$')
    plt.plot(m.time, uc[1].value, 'r-', label=r'$Q_2$')
    plt.ylabel('Heater (%)')
    plt.legend()

    plt.subplot(2, 2, 3)
    plt.plot(m.time, yc[0].value, 'b--', label=r'$T_1$')
    plt.plot(m.time, yc[1].value, 'r--', label=r'$T_2$')
    plt.plot(t, y, 'k-', label='Measured')
    plt.ylabel('Temperature (K)')
    plt.xlabel('Time (sec)')
    plt.legend()

    plt.tight_layout()
    plt.show()



    I already tried to set to

    yc[0].value = [20, 20]
    yc[1].value = [20, 20]


    so 2 past steps are available for the simulation, but then i get an exception that the size is not correct.

    When i initialize the values with arrays like [20,20,0,0,0,0,0,...] or [20,20,None,None,None,...] the simulation runs without exception but still with the same completely wrong values and also only one 20 is after the simulation in the yc value instead of the set two.

    Continue reading...

Compartilhe esta Página