Получение странных результатов из signal.lsim при t [0]! = 0 - PullRequest
0 голосов
/ 29 января 2019

Я запускаю симуляцию модели пространства состояний LTI, и мне нужно запускать ее в разное время с разными входными данными.Другими словами, смоделируйте от t0 = 0 до t1 = 1 секунды, внесите изменения во входы системы на основе результата в t1, затем продолжите с t1 = 1 секунды до t2 = 2 секунды.

I 'мы пытались запустить с начальным условием X0 = массив ([0,0]) в момент времени t [0], затем взять последний элемент xout1 в качестве начального условия для следующего запуска и присвоить ему новый временной ряд, который начинается в момент времени t [0] = 1

import numpy as np
import scipy.signal as sig
import matplotlib.pyplot as plt

r_wh = 60e-3 / 2.0              # m
m_v = 20                        # kg
R_m = 21.2                      # Ohms
L_m = 1.37e-3                   # Henries
K_t = 21.2e-3                   # Nm.A^-1
K_v = 60 / (450 * 2 * np.pi)    # V.rad^-1.s^-1
I_m = 4.2e-7                    # kg.m^2
I_gb = 0.4e-7                   # kg.m^2
I_wh = 65275e-9                 # kg.m^2
gr = 1.0/19.0

I_eq = ((I_m + I_gb) / gr) + (gr  * (I_wh + 0.25 * m_v * r_wh ** 2))

A = np.array([[-R_m/L_m, (-K_v/L_m) / gr],[K_t/I_eq, 0]])
B = np.array([[1/L_m,0],[0,-1/I_eq]])
C = np.array([[0,0],[0,1]])
D = np.zeros((2,2))

SS = sig.StateSpace(A,B,C,D)


T1 = np.arange(0,1,0.01)
T2 = np.arange(1,2,0.01)

U1 = np.array([12*np.ones_like(T1),np.zeros_like(T1)]).transpose()
U2 = np.array([12*np.ones_like(T2),np.zeros_like(T2)]).transpose()

tout1, yout1, xout1 = sig.lsim(SS,U1,T1)
tout2, yout2, xout2 = sig.lsim(SS,U2,T2,X0=xout1[-1])

plt.plot(T1,xout1[:,1],T2,xout2[:,1])

Можно ожидать, что первый элемент в выходном массиве векторов состояний "xout2" будет соответствовать условиям X0, но это не так.Требует ли эта функция "lsim", чтобы первая точка времени была 0?

plot output

1 Ответ

0 голосов
/ 29 января 2019

lsim предполагает, что X0 - это состояние в момент времени 0, а не во время T[0].Вы можете получить поведение, которое вы ожидали (почти), используя

tout2, yout2, xout2 = sig.lsim(SS, U2, T2 - T2[0], X0=xout1[-1])

Я говорю "почти", потому что при переходе от xout1 к xout2 на графике все еще будет небольшой разрыв,Это потому, что значения в T1 равны [0., 0.01, 0.02, ..., 0.98, 0.99].Обратите внимание, что 1.0 не в T1.Таким образом, последнее значение в xout1 - это состояние при t = 0,99, а не t = 1,0.Один из способов исправить это - включить окончательные значения t в T1 и T2, например, используя np.linspace вместо np.arange:

T1 = np.linspace(0, 1, 101)
T2 = np.linspace(1, 2, 101)    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...