Python-control - шаговая система

Когда я создаю систему, используя пакет управления python:

import control
H = control.tf([1], [1])

А потом хотите итеративно моделировать эту систему, как мне это сделать?

Я знаю, что я могу сделать это:

T = np.arange(0, 10, 0.01)
u = np.sin(T)
y, t, x = control.lsim(H, u, T)

Но то, что я хочу сделать, это:

Tstart = get_current_time()   # returns a scalar
T = get_current_time()
x = None
while T - Tstart < 100:
    u = get_next_input()      # returns a scalar
    T = get_current_time()
    y, x = control.step_system(H, u, T, x)
    do_something_with_output(y)

Есть ли способ, которым я могу сделать это? Как еще вы должны использовать систему, разработанную с пакетом управления, для управления чем-то?

1 ответ

Это большой вопрос. Я сам заинтересован в этом и задал аналогичный вопрос на форуме Mathworks некоторое время назад, и в настоящее время это невозможно в MATLAB.

Хорошая новость в том, что теперь вы можете сделать это в Python Control, используя модуль iosys иinput_output_response функция.

Для линейной системы, как в вашем примере, вы используете LinearIOSystem учебный класс

Вот мой пример симуляции:

      import time
import numpy as np
import matplotlib.pyplot as plt
import control
from control import input_output_response
from control.iosys import LinearIOSystem

# Define system
# Continuous-time transfer function
G = control.tf([1], [2, 1])

# Convert to state-space representation
Gss = control.ss(G)

# Construct IO system
sys = LinearIOSystem(Gss, inputs='u', outputs='y')

def get_next_input(u, avg_time=0.5):
    """Function to simulate data acquisition"""
    t0 = time.time()
    wait_time = avg_time*(0.5 + np.random.rand())
    while time.time() - t0 < wait_time:
        pass
    if np.random.rand() > 0.8:
        u = u + np.random.randn()
    return u

# Simulate system in response to irregular inputs
t0 = time.time()
t = 0
y0 = 0
u = 0
x = np.zeros(sys.nstates)
np.random.seed(1)
sim_results = [[0, u, y0]]
print(sim_results[-1])
while t < 10:
    u_new, t_new  = get_next_input(u), time.time() - t0
    # Simulation of system up to current time
    T_sim = [t, t_new]
    T_sim, Y_sim, X_sim = input_output_response(sys, T_sim, u, X0=x,
                                                return_x=True)
    sim_results.append([T_sim[-1], u_new, Y_sim[-1]])
    print(sim_results[-1])
    # Set current state and outputs to end of simulation period
    x = X_sim[0, -1]
    u = u_new
    t = t_new

sim_results = np.array(sim_results)
t = sim_results[:, 0]
u = sim_results[:, 1]
y = sim_results[:, 2]

# Plot inputs and outputs
plt.subplot(2, 1, 1)
plt.plot(t, y, 'o-')
plt.xlabel('t')
plt.ylabel('y(t)')
plt.grid()
plt.subplot(2, 1, 2)
plt.step(t, u, where='post')
plt.xlabel('t')
plt.ylabel('u(t)')
plt.grid()
plt.show()

Отвечая на ваш последний вопрос:

Как еще вы можете использовать систему, разработанную с помощью пакета управления, чтобы, знаете ли, что-то контролировать?"

Я думаю, что такие инструменты, как модуль управления MATLAB и python-control, предназначены для использования для анализа, проектирования и моделирования систем управления, не обязательно для их реализации. В зависимости от вашего приложения, как правило, окончательная реализация системы управления выполняется на специализированном оборудовании и / или программном обеспечении или может быть написана вручную на языке низкого уровня, таком как, например, C. Языки высокого уровня, такие как MATLAB и Python, возможно, слишком ненадежны и их сложно поддерживать / обновлять, чтобы они могли быть привлекательными решениями в любом серьезном приложении для управления процессами или в реальном приложении для робототехники. Но для любителей и лабораторных экспериментов они идеальны, и я согласен, что такая функциональность полезна.

Другие вопросы по тегам