50
50
from .statefbk import gram
51
51
from .timeresp import TimeResponseData
52
52
53
- __all__ = ['hsvd' , 'balred' , 'modred' , 'era ' , 'markov' , 'minreal' ]
53
+ __all__ = ['hsvd' , 'balred' , 'modred' , 'eigensys_realization ' , 'markov' , 'minreal' , 'era ' ]
54
54
55
55
56
56
# Hankel Singular Value Decomposition
@@ -369,10 +369,11 @@ def minreal(sys, tol=None, verbose=True):
369
369
return sysr
370
370
371
371
372
- def era (arg , r , m = None , n = None , dt = True , transpose = False ):
373
- r"""era (YY, r)
372
+ def eigensys_realization (arg , r , m = None , n = None , dt = True , transpose = False ):
373
+ r"""eigensys_realization (YY, r)
374
374
375
- Calculate an ERA model of order `r` based on the impulse-response data.
375
+ Calculate an ERA model of order `r` based on the impulse-response data
376
+ `YY`.
376
377
377
378
This function computes a discrete time system
378
379
@@ -385,73 +386,68 @@ def era(arg, r, m=None, n=None, dt=True, transpose=False):
385
386
386
387
The function can be called with 2 arguments:
387
388
388
- * ``sysd, S = era (data, r)``
389
- * ``sysd, S = era (YY, r)``
389
+ * ``sysd, S = eigensys_realization (data, r)``
390
+ * ``sysd, S = eigensys_realization (YY, r)``
390
391
391
392
where `response` is an `TimeResponseData` object, and `YY` is 1D or 3D
392
393
array and r is an integer.
393
394
394
395
Parameters
395
396
----------
396
397
YY : array_like
397
- impulse- response data from which the StateSpace model is estimated,
398
- 1D or 3D array.
398
+ Impulse response from which the StateSpace model is estimated, 1D
399
+ or 3D array.
399
400
data : TimeResponseData
400
- impulse-response data from which the StateSpace model is estimated.
401
+ Impulse response from which the StateSpace model is estimated.
401
402
r : integer
402
403
Order of model.
403
404
m : integer, optional
404
- Number of rows in Hankel matrix.
405
- Default is 2*r.
405
+ Number of rows in Hankel matrix. Default is 2*r.
406
406
n : integer, optional
407
- Number of columns in Hankel matrix.
408
- Default is 2*r.
40
8000
7
+ Number of columns in Hankel matrix. Default is 2*r.
409
408
dt : True or float, optional
410
409
True indicates discrete time with unspecified sampling time,
411
- positive number is discrete time with specified sampling time.
412
- It can be used to scale the StateSpace model in order to match
413
- the impulse response of this library.
414
- Default values is True.
410
+ positive number is discrete time with specified sampling time. It
411
+ can be used to scale the StateSpace model in order to match the
412
+ impulse response of this library. Default is True.
415
413
transpose : bool, optional
416
414
Assume that input data is transposed relative to the standard
417
- :ref:`time-series-convention`. For TimeResponseData this parameter
418
- is ignored.
419
- Default value is False.
415
+ :ref:`time-series-convention`. For TimeResponseData this parameter
416
+ is ignored. Default is False.
420
417
421
418
Returns
422
419
-------
423
420
sys : StateSpace
424
421
A reduced order model sys=StateSpace(Ar,Br,Cr,Dr,dt).
425
422
S : array
426
- Singular values of Hankel matrix.
67ED
427
- Can be used to choose a good r value.
423
+ Singular values of Hankel matrix. Can be used to choose a good r
424
+ value.
428
425
429
426
References
430
427
----------
431
- .. [1] Samet Oymak and Necmiye Ozay
432
- Non-asymptotic Identification of LTI Systems
433
- from a Single Trajectory.
428
+ .. [1] Samet Oymak and Necmiye Ozay, Non-asymptotic Identification of
429
+ LTI Systems from a Single Trajectory.
434
430
https://arxiv.org/abs/1806.05722
435
431
436
432
Examples
437
433
--------
438
434
>>> T = np.linspace(0, 10, 100)
439
435
>>> _, YY = ct.impulse_response(ct.tf([1], [1, 0.5], True), T)
440
- >>> sysd, _ = ct.era (YY, r=1)
436
+ >>> sysd, _ = ct.eigensys_realization (YY, r=1)
441
437
442
438
>>> T = np.linspace(0, 10, 100)
443
439
>>> response = ct.impulse_response(ct.tf([1], [1, 0.5], True), T)
444
- >>> sysd, _ = ct.era (response, r=1)
440
+ >>> sysd, _ = ct.eigensys_realization (response, r=1)
445
441
"""
446
442
def block_hankel_matrix (Y , m , n ):
447
-
443
+ """Create a block hankel matrix from Impulse response"""
448
444
q , p , _ = Y .shape
449
445
YY = Y .transpose (0 ,2 ,1 ) # transpose for reshape
450
446
451
447
H = np .zeros ((q * m ,p * n ))
452
448
453
449
for r in range (m ):
454
- # shift and add row to hankel matrix
450
+ # shift and add row to Hankel matrix
455
451
new_row = YY [:,r :r + n ,:]
456
452
H [q * r :q * (r + 1 ),:] = new_row .reshape ((q ,p * n ))
457
453
@@ -651,3 +647,6 @@ def markov(Y, U, m=None, transpose=False):
651
647
652
648
# Return the first m Markov parameters
653
649
return H if transpose else np .transpose (H )
650
+
651
+ # Function aliases
652
+ era = eigensys_realization
0 commit comments