|
51 | 51 | # External function declarations |
52 | 52 | import numpy as np |
53 | 53 | from numpy import angle, array, empty, ones, \ |
54 | | - real, imag, matrix, absolute, eye, linalg, where, dot |
| 54 | + real, imag, absolute, eye, linalg, where, dot |
55 | 55 | from scipy.interpolate import splprep, splev |
56 | 56 | from .lti import LTI |
57 | 57 |
|
@@ -80,6 +80,10 @@ class FRD(LTI): |
80 | 80 |
|
81 | 81 | """ |
82 | 82 |
|
| 83 | + # Allow NDarray * StateSpace to give StateSpace._rmul_() priority |
| 84 | + # https://docs.scipy.org/doc/numpy/reference/arrays.classes.html#numpy.class.__array_priority__ |
| 85 | + __array_priority__ = 11 # override ndarray and matrix types |
| 86 | + |
83 | 87 | epsw = 1e-8 |
84 | 88 |
|
85 | 89 | def __init__(self, *args, **kwargs): |
@@ -433,12 +437,13 @@ def feedback(self, other=1, sign=-1): |
433 | 437 | # TODO: vectorize this |
434 | 438 | # TODO: handle omega re-mapping |
435 | 439 | for k, w in enumerate(other.omega): |
436 | | - fresp[:, :, k] = self.fresp[:, :, k].view(type=matrix)* \ |
| 440 | + fresp[:, :, k] = np.dot( |
| 441 | + self.fresp[:, :, k], |
437 | 442 | linalg.solve( |
438 | | - eye(self.inputs) + |
439 | | - other.fresp[:, :, k].view(type=matrix) * |
440 | | - self.fresp[:, :, k].view(type=matrix), |
441 | | - eye(self.inputs)) |
| 443 | + eye(self.inputs) + np.dot(other.fresp[:, :, k], |
| 444 | + self.fresp[:, :, k]), |
| 445 | + eye(self.inputs)) |
| 446 | + ) |
442 | 447 |
|
443 | 448 | return FRD(fresp, other.omega, smooth=(self.ifunc is not None)) |
444 | 449 |
|
|
0 commit comments